changed Array to use 0-based index

This commit is contained in:
hyunghwan.chung 2016-03-16 14:05:34 +00:00
parent 117473f638
commit 00a4fd78d6
3 changed files with 32 additions and 34 deletions

View File

@ -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) ].
}
}

View File

@ -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 ].

View File

@ -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: