worked on OrderedCollection.st
This commit is contained in:
parent
d1cfaed466
commit
4c8797e8ad
@ -82,7 +82,7 @@ class SequenceableCollection(Collection)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## -------------------------------------------------------------------------------
|
## -------------------------------------------------------------------------------
|
||||||
class(#pointer) Array(SequenceableCollection)
|
class(#pointer) Array(SequenceableCollection)
|
||||||
{
|
{
|
||||||
method size
|
method size
|
||||||
@ -291,7 +291,7 @@ class(#byte) ByteArray(Array)
|
|||||||
|
|
||||||
class OrderedCollection(SequenceableCollection)
|
class OrderedCollection(SequenceableCollection)
|
||||||
{
|
{
|
||||||
var contents.
|
var buffer.
|
||||||
var firstIndex.
|
var firstIndex.
|
||||||
var lastIndex. ## this is the last index plus 1.
|
var lastIndex. ## this is the last index plus 1.
|
||||||
|
|
||||||
@ -308,7 +308,7 @@ class OrderedCollection(SequenceableCollection)
|
|||||||
|
|
||||||
method initialize: size
|
method initialize: size
|
||||||
{
|
{
|
||||||
self.contents := Array new: size.
|
self.buffer := Array new: size.
|
||||||
self.firstIndex := size div: 2.
|
self.firstIndex := size div: 2.
|
||||||
self.lastIndex := self.firstIndex.
|
self.lastIndex := self.firstIndex.
|
||||||
}
|
}
|
||||||
@ -318,34 +318,52 @@ class OrderedCollection(SequenceableCollection)
|
|||||||
^self.lastIndex - self.firstIndex.
|
^self.lastIndex - self.firstIndex.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
method capacity
|
||||||
|
{
|
||||||
|
^self.buffer size
|
||||||
|
}
|
||||||
|
|
||||||
method at: index
|
method at: index
|
||||||
{
|
{
|
||||||
| i |
|
| i |
|
||||||
i := index + self.firstIndex.
|
i := index + self.firstIndex.
|
||||||
if (i >= self.firstIndex and: [i < self.lastIndex]) { ^self.contents at: index }.
|
if (i >= self.firstIndex and: [i < self.lastIndex]) { ^self.buffer at: index }.
|
||||||
Exception signal: ('index ' & index asString & ' out of range').
|
Exception signal: ('index ' & index asString & ' out of range').
|
||||||
}
|
}
|
||||||
|
|
||||||
method at: index put: obj
|
method at: index put: obj
|
||||||
{
|
{
|
||||||
|
## replace an existing element. it doesn't grow the buffer.
|
||||||
| i |
|
| i |
|
||||||
i := index + self.firstIndex.
|
i := index + self.firstIndex.
|
||||||
if (i >= self.firstIndex and: [i < self.lastIndex]) { ^self.contents at: index put: obj }.
|
if (i >= self.firstIndex and: [i < self.lastIndex]) { ^self.buffer at: index put: obj }.
|
||||||
Exception signal: ('index ' & index asString & ' out of range').
|
Exception signal: ('index ' & index asString & ' out of range').
|
||||||
}
|
}
|
||||||
|
|
||||||
|
method first
|
||||||
|
{
|
||||||
|
self emptyCheck.
|
||||||
|
^self.buffer at: self.firstIndex.
|
||||||
|
}
|
||||||
|
|
||||||
|
method last
|
||||||
|
{
|
||||||
|
self emptyCheck.
|
||||||
|
^self.buffer at: self.lastIndex.
|
||||||
|
}
|
||||||
|
|
||||||
method addFirst: obj
|
method addFirst: obj
|
||||||
{
|
{
|
||||||
if (self.firstIndex == 0) { self growBy: 8 shiftBy: 8 }.
|
if (self.firstIndex == 0) { self growBy: 8 shiftBy: 8 }.
|
||||||
self.firstIndex := self.firstIndex - 1.
|
self.firstIndex := self.firstIndex - 1.
|
||||||
^self.contents at: self.firstIndex put: obj.
|
^self.buffer at: self.firstIndex put: obj.
|
||||||
}
|
}
|
||||||
|
|
||||||
method addLast: obj
|
method addLast: obj
|
||||||
{
|
{
|
||||||
| k |
|
| k |
|
||||||
if (self.lastIndex == self.contents size) { self growBy: 8 shiftBy: 0 }.
|
if (self.lastIndex == self.buffer size) { self growBy: 8 shiftBy: 0 }.
|
||||||
k := self.contents at: self.lastIndex put: obj.
|
k := self.buffer at: self.lastIndex put: obj.
|
||||||
self.lastIndex := self.lastIndex + 1.
|
self.lastIndex := self.lastIndex + 1.
|
||||||
^k.
|
^k.
|
||||||
}
|
}
|
||||||
@ -365,8 +383,8 @@ class OrderedCollection(SequenceableCollection)
|
|||||||
{
|
{
|
||||||
| obj |
|
| obj |
|
||||||
self emptyCheck.
|
self emptyCheck.
|
||||||
obj := self.contents at: self.firstIndex.
|
obj := self.buffer at: self.firstIndex.
|
||||||
self.contents at: self.firstIndex put: nil.
|
self.buffer at: self.firstIndex put: nil.
|
||||||
self.firstIndex := self.firstIndex + 1.
|
self.firstIndex := self.firstIndex + 1.
|
||||||
^obj.
|
^obj.
|
||||||
}
|
}
|
||||||
@ -376,28 +394,38 @@ class OrderedCollection(SequenceableCollection)
|
|||||||
| obj li |
|
| obj li |
|
||||||
self emptyCheck.
|
self emptyCheck.
|
||||||
li := self.lastIndex - 1.
|
li := self.lastIndex - 1.
|
||||||
obj := self.contents at: li.
|
obj := self.buffer at: li.
|
||||||
self.contents at: li put: nil.
|
self.buffer at: li put: nil.
|
||||||
self.lastIndex := li.
|
self.lastIndex := li.
|
||||||
^obj
|
^obj
|
||||||
}
|
}
|
||||||
|
|
||||||
method removeIndex: index
|
method removeAtIndex: index
|
||||||
{
|
{
|
||||||
|
## remove the element at the given position.
|
||||||
| obj |
|
| obj |
|
||||||
obj := self at: index.
|
obj := self at: index.
|
||||||
self.contents replaceFrom: index + self.firstIndex
|
self removeIndex: index + self.firstIndex.
|
||||||
to: self.lastIndex - 2
|
##self.buffer
|
||||||
with: self.contents
|
## replaceFrom: index + self.firstIndex
|
||||||
startingAt: index + self.firstIndex + 1.
|
## to: self.lastIndex - 2
|
||||||
self.lastIndex := self.lastIndex - 1.
|
## with: self.buffer
|
||||||
self.contents at: self.lastIndex put: nil.
|
## startingAt: index + self.firstIndex + 1.
|
||||||
System log(System.Log.FATAL, S'REMOVING ... ', obj, '--->', self.lastIndex, S'\n').
|
##self.lastIndex := self.lastIndex - 1.
|
||||||
|
##self.buffer at: self.lastIndex put: nil.
|
||||||
^obj
|
^obj
|
||||||
}
|
}
|
||||||
|
|
||||||
method remove: obj ifAbsent: error_block
|
method remove: obj ifAbsent: error_block
|
||||||
{
|
{
|
||||||
|
| i |
|
||||||
|
i := self.firstIndex.
|
||||||
|
while (i < self.lastIndex)
|
||||||
|
{
|
||||||
|
if (obj = (self.buffer at: i)) { ^self removeIndex: i }.
|
||||||
|
i := i + 1.
|
||||||
|
}.
|
||||||
|
^error_block value.
|
||||||
}
|
}
|
||||||
|
|
||||||
## ------------------------------------------------
|
## ------------------------------------------------
|
||||||
@ -405,13 +433,13 @@ System log(System.Log.FATAL, S'REMOVING ... ', obj, '--->', self.lastIndex, S'\n
|
|||||||
## ------------------------------------------------
|
## ------------------------------------------------
|
||||||
method do: block
|
method do: block
|
||||||
{
|
{
|
||||||
##^self.firstIndex to: (self.lastIndex - 1) do: [:i | block value: (self.contents at: i)].
|
##^self.firstIndex to: (self.lastIndex - 1) do: [:i | block value: (self.buffer at: i)].
|
||||||
|
|
||||||
| i |
|
| i |
|
||||||
i := self.firstIndex.
|
i := self.firstIndex.
|
||||||
while (i < self.lastIndex)
|
while (i < self.lastIndex)
|
||||||
{
|
{
|
||||||
block value: (self.contents at: i).
|
block value: (self.buffer at: i).
|
||||||
i := i + 1.
|
i := i + 1.
|
||||||
}.
|
}.
|
||||||
}
|
}
|
||||||
@ -422,32 +450,43 @@ System log(System.Log.FATAL, S'REMOVING ... ', obj, '--->', self.lastIndex, S'\n
|
|||||||
method growBy: grow_size shiftBy: shift_count
|
method growBy: grow_size shiftBy: shift_count
|
||||||
{
|
{
|
||||||
| newcon |
|
| newcon |
|
||||||
newcon := (self.contents class) new: (self.contents size + grow_size).
|
newcon := (self.buffer class) new: (self.buffer size + grow_size).
|
||||||
newcon replaceFrom: (self.firstIndex + shift_count)
|
newcon replaceFrom: (self.firstIndex + shift_count)
|
||||||
to: (self.lastIndex - 1 + shift_count)
|
to: (self.lastIndex - 1 + shift_count)
|
||||||
with: self.contents startingAt: (self.firstIndex).
|
with: self.buffer startingAt: (self.firstIndex).
|
||||||
self.contents := newcon.
|
self.buffer := newcon.
|
||||||
self.firstIndex := self.firstIndex + shift_count.
|
self.firstIndex := self.firstIndex + shift_count.
|
||||||
self.lastIndex := self.lastIndex + shift_count.
|
self.lastIndex := self.lastIndex + shift_count.
|
||||||
}
|
}
|
||||||
|
|
||||||
method insert: obj at: index
|
method insert: obj before: index
|
||||||
{
|
{
|
||||||
## internal use only - index must be between 0 and self size inclusive
|
## internal use only - index must be between 0 and self size inclusive
|
||||||
|
|
||||||
| i start |
|
| i start |
|
||||||
if (self size == self.contents size) { self growBy: 8 shiftBy: 8 }.
|
if (self size == self.buffer size) { self growBy: 8 shiftBy: 8 }.
|
||||||
start := self.firstIndex + index.
|
start := self.firstIndex + index.
|
||||||
i := self.lastIndex.
|
i := self.lastIndex.
|
||||||
while (i > start)
|
while (i > start)
|
||||||
{
|
{
|
||||||
self.contents at: i put: (self.contents at: i - 1).
|
self.buffer at: i put: (self.buffer at: i - 1).
|
||||||
i := i - 1.
|
i := i - 1.
|
||||||
}.
|
}.
|
||||||
self.lastIndex := self.lastIndex + 1.
|
self.lastIndex := self.lastIndex + 1.
|
||||||
self.contents at: index + self.firstIndex put: obj.
|
self.buffer at: index + self.firstIndex put: obj.
|
||||||
^obj
|
^obj
|
||||||
}
|
}
|
||||||
|
|
||||||
|
method removeIndex: index
|
||||||
|
{
|
||||||
|
self.buffer
|
||||||
|
replaceFrom: index
|
||||||
|
to: self.lastIndex - 2
|
||||||
|
with: self.buffer
|
||||||
|
startingAt: index + 1.
|
||||||
|
self.lastIndex := self.lastIndex - 1.
|
||||||
|
self.buffer at: self.lastIndex put: nil.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
## -------------------------------------------------------------------------------
|
## -------------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user