changed Array to use 0-based index
This commit is contained in:
parent
117473f638
commit
00a4fd78d6
@ -5,6 +5,11 @@
|
||||
^self basicSize.
|
||||
}
|
||||
|
||||
#method ubound
|
||||
{
|
||||
^(self basicSize - 1).
|
||||
}
|
||||
|
||||
#method at: anInteger
|
||||
{
|
||||
^self basicAt: anInteger.
|
||||
@ -17,22 +22,22 @@
|
||||
|
||||
#method first
|
||||
{
|
||||
^self at: 1.
|
||||
^self at: 0.
|
||||
}
|
||||
|
||||
#method last
|
||||
{
|
||||
^self at: self size.
|
||||
^self at: (self ubound).
|
||||
}
|
||||
|
||||
#method do: aBlock
|
||||
{
|
||||
1 to: self size do: [:i | aBlock value: (self at: i)].
|
||||
0 to: (self ubound) do: [:i | aBlock value: (self at: i)].
|
||||
}
|
||||
|
||||
#method copy: anArray
|
||||
{
|
||||
1 to: (anArray size) do: [:i | self at: i put: (anArray at: i) ].
|
||||
0 to: (anArray ubound) do: [:i | self at: i put: (anArray at: i) ].
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,7 @@
|
||||
#method initialize
|
||||
{
|
||||
self.count := 0.
|
||||
self.heapIndex := 0.
|
||||
self.heapIndex := -1.
|
||||
self.fireTime := 0.
|
||||
}
|
||||
|
||||
@ -126,7 +126,10 @@
|
||||
|
||||
#method insert: aSemaphore
|
||||
{
|
||||
self.size >= (self.arr size) ifTrue: [
|
||||
| index |
|
||||
|
||||
index := self.size.
|
||||
(index >= (self.arr size)) ifTrue: [
|
||||
| newarr newsize |
|
||||
newsize := (self.arr size) * 2.
|
||||
newarr := Array new: newsize.
|
||||
@ -134,19 +137,19 @@
|
||||
self.arr := newarr.
|
||||
].
|
||||
|
||||
self.arr at: index put: aSemaphore.
|
||||
aSemaphore heapIndex: index.
|
||||
self.size := self.size + 1.
|
||||
self.arr at: self.size put: aSemaphore.
|
||||
aSemaphore heapIndex: self.size.
|
||||
|
||||
^self siftUp: self.size.
|
||||
^self siftUp: index
|
||||
}
|
||||
|
||||
#method popTop
|
||||
{
|
||||
| top |
|
||||
|
||||
top := self.arr at: 1.
|
||||
self deleteAt: 1.
|
||||
top := self.arr at: 0.
|
||||
self deleteAt: 0.
|
||||
^top
|
||||
}
|
||||
|
||||
@ -161,11 +164,11 @@
|
||||
item := self.arr at: anIndex.
|
||||
item heapIndex: -1.
|
||||
|
||||
self.size := self.size - 1.
|
||||
(anIndex == self.size)
|
||||
ifTrue: [
|
||||
"the last item"
|
||||
self.arr at: self.size put: nil.
|
||||
self.size := self.size - 1
|
||||
]
|
||||
ifFalse: [
|
||||
| xitem |
|
||||
@ -174,7 +177,6 @@
|
||||
self.arr at: anIndex put: xitem.
|
||||
xitem heapIndex: anIndex.
|
||||
self.arr at: self.size put: nil.
|
||||
self.size := self.size - 1.
|
||||
|
||||
(xitem youngerThan: item)
|
||||
ifTrue: [self siftUp: anIndex ]
|
||||
@ -184,27 +186,24 @@
|
||||
|
||||
#method parentIndex: anIndex
|
||||
{
|
||||
## ^(anIndex - 1) quo: 2
|
||||
^anIndex quo: 2
|
||||
^(anIndex - 1) quo: 2
|
||||
}
|
||||
|
||||
#method leftChildIndex: anIndex
|
||||
{
|
||||
## ^(anIndex * 2) + 1.
|
||||
^(anIndex * 2).
|
||||
^(anIndex * 2) + 1.
|
||||
}
|
||||
|
||||
#method rightChildIndex: anIndex
|
||||
{
|
||||
## ^(anIndex * 2) + 2.
|
||||
^(anIndex * 2) + 1.
|
||||
^(anIndex * 2) + 2.
|
||||
}
|
||||
|
||||
#method siftUp: anIndex
|
||||
{
|
||||
| pindex cindex par item stop |
|
||||
|
||||
(anIndex <= 1) ifTrue: [ ^anIndex ].
|
||||
(anIndex <= 0) ifTrue: [ ^anIndex ].
|
||||
|
||||
pindex := anIndex.
|
||||
item := self.arr at: anIndex.
|
||||
@ -214,7 +213,7 @@
|
||||
|
||||
cindex := pindex.
|
||||
|
||||
(cindex > 1)
|
||||
(cindex > 0)
|
||||
ifTrue: [
|
||||
pindex := self parentIndex: cindex.
|
||||
par := self.arr at: pindex.
|
||||
@ -240,8 +239,8 @@
|
||||
{
|
||||
| base capa cindex item |
|
||||
|
||||
base := (self.size quo: 2) + 1.
|
||||
(anIndex > base) ifTrue: [^anIndex].
|
||||
base := self.size quo: 2.
|
||||
(anIndex >= base) ifTrue: [^anIndex].
|
||||
|
||||
cindex := anIndex.
|
||||
item := self.arr at: cindex.
|
||||
@ -252,7 +251,7 @@
|
||||
left := self leftChildIndex: cindex.
|
||||
right := self rightChildIndex: cindex.
|
||||
|
||||
((right <= self.size) and: [(self.arr at: right) youngerThan: (self.arr at: left)])
|
||||
((right < self.size) and: [(self.arr at: right) youngerThan: (self.arr at: left)])
|
||||
ifTrue: [ younger := right ]
|
||||
ifFalse: [ younger := left ].
|
||||
|
||||
|
@ -1059,18 +1059,15 @@ static int prim_basic_at (stix_t* stix, stix_ooi_t nargs)
|
||||
pos = ACTIVE_STACK_GET(stix, stix->sp);
|
||||
if (stix_inttooow (stix, pos, &idx) <= 0)
|
||||
{
|
||||
/* integer out of range or not integer */
|
||||
/* negative integer or not integer */
|
||||
return 0;
|
||||
}
|
||||
if (idx < 1 || idx > STIX_OBJ_GET_SIZE(rcv))
|
||||
if (idx >= STIX_OBJ_GET_SIZE(rcv))
|
||||
{
|
||||
/* index out of range */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* [NOTE] basicAt: and basicAt:put: uses a 1-based index. */
|
||||
idx = idx - 1;
|
||||
|
||||
switch (STIX_OBJ_GET_FLAGS_TYPE(rcv))
|
||||
{
|
||||
case STIX_OBJ_TYPE_BYTE:
|
||||
@ -1123,10 +1120,10 @@ static int prim_basic_at_put (stix_t* stix, stix_ooi_t nargs)
|
||||
|
||||
if (stix_inttooow (stix, pos, &idx) <= 0)
|
||||
{
|
||||
/* integer out of range or not integer */
|
||||
/* negative integer or not integer */
|
||||
return 0;
|
||||
}
|
||||
if (idx < 1 || idx > STIX_OBJ_GET_SIZE(rcv))
|
||||
if (idx >= STIX_OBJ_GET_SIZE(rcv))
|
||||
{
|
||||
/* index out of range */
|
||||
return 0;
|
||||
@ -1140,9 +1137,6 @@ static int prim_basic_at_put (stix_t* stix, stix_ooi_t nargs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* [NOTE] basicAt: and basicAt:put: uses a 1-based index. */
|
||||
idx = idx - 1;
|
||||
|
||||
switch (STIX_OBJ_GET_FLAGS_TYPE(rcv))
|
||||
{
|
||||
case STIX_OBJ_TYPE_BYTE:
|
||||
|
Loading…
Reference in New Issue
Block a user