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. ^self basicSize.
} }
#method ubound
{
^(self basicSize - 1).
}
#method at: anInteger #method at: anInteger
{ {
^self basicAt: anInteger. ^self basicAt: anInteger.
@ -17,22 +22,22 @@
#method first #method first
{ {
^self at: 1. ^self at: 0.
} }
#method last #method last
{ {
^self at: self size. ^self at: (self ubound).
} }
#method do: aBlock #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 #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 #method initialize
{ {
self.count := 0. self.count := 0.
self.heapIndex := 0. self.heapIndex := -1.
self.fireTime := 0. self.fireTime := 0.
} }
@ -126,7 +126,10 @@
#method insert: aSemaphore #method insert: aSemaphore
{ {
self.size >= (self.arr size) ifTrue: [ | index |
index := self.size.
(index >= (self.arr size)) ifTrue: [
| newarr newsize | | newarr newsize |
newsize := (self.arr size) * 2. newsize := (self.arr size) * 2.
newarr := Array new: newsize. newarr := Array new: newsize.
@ -134,19 +137,19 @@
self.arr := newarr. self.arr := newarr.
]. ].
self.arr at: index put: aSemaphore.
aSemaphore heapIndex: index.
self.size := self.size + 1. 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 #method popTop
{ {
| top | | top |
top := self.arr at: 1. top := self.arr at: 0.
self deleteAt: 1. self deleteAt: 0.
^top ^top
} }
@ -161,11 +164,11 @@
item := self.arr at: anIndex. item := self.arr at: anIndex.
item heapIndex: -1. item heapIndex: -1.
self.size := self.size - 1.
(anIndex == self.size) (anIndex == self.size)
ifTrue: [ ifTrue: [
"the last item" "the last item"
self.arr at: self.size put: nil. self.arr at: self.size put: nil.
self.size := self.size - 1
] ]
ifFalse: [ ifFalse: [
| xitem | | xitem |
@ -174,7 +177,6 @@
self.arr at: anIndex put: xitem. self.arr at: anIndex put: xitem.
xitem heapIndex: anIndex. xitem heapIndex: anIndex.
self.arr at: self.size put: nil. self.arr at: self.size put: nil.
self.size := self.size - 1.
(xitem youngerThan: item) (xitem youngerThan: item)
ifTrue: [self siftUp: anIndex ] ifTrue: [self siftUp: anIndex ]
@ -184,27 +186,24 @@
#method parentIndex: anIndex #method parentIndex: anIndex
{ {
## ^(anIndex - 1) quo: 2 ^(anIndex - 1) quo: 2
^anIndex quo: 2
} }
#method leftChildIndex: anIndex #method leftChildIndex: anIndex
{ {
## ^(anIndex * 2) + 1. ^(anIndex * 2) + 1.
^(anIndex * 2).
} }
#method rightChildIndex: anIndex #method rightChildIndex: anIndex
{ {
## ^(anIndex * 2) + 2. ^(anIndex * 2) + 2.
^(anIndex * 2) + 1.
} }
#method siftUp: anIndex #method siftUp: anIndex
{ {
| pindex cindex par item stop | | pindex cindex par item stop |
(anIndex <= 1) ifTrue: [ ^anIndex ]. (anIndex <= 0) ifTrue: [ ^anIndex ].
pindex := anIndex. pindex := anIndex.
item := self.arr at: anIndex. item := self.arr at: anIndex.
@ -214,7 +213,7 @@
cindex := pindex. cindex := pindex.
(cindex > 1) (cindex > 0)
ifTrue: [ ifTrue: [
pindex := self parentIndex: cindex. pindex := self parentIndex: cindex.
par := self.arr at: pindex. par := self.arr at: pindex.
@ -240,8 +239,8 @@
{ {
| base capa cindex item | | base capa cindex item |
base := (self.size quo: 2) + 1. base := self.size quo: 2.
(anIndex > base) ifTrue: [^anIndex]. (anIndex >= base) ifTrue: [^anIndex].
cindex := anIndex. cindex := anIndex.
item := self.arr at: cindex. item := self.arr at: cindex.
@ -252,7 +251,7 @@
left := self leftChildIndex: cindex. left := self leftChildIndex: cindex.
right := self rightChildIndex: 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 ] ifTrue: [ younger := right ]
ifFalse: [ younger := left ]. 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); pos = ACTIVE_STACK_GET(stix, stix->sp);
if (stix_inttooow (stix, pos, &idx) <= 0) if (stix_inttooow (stix, pos, &idx) <= 0)
{ {
/* integer out of range or not integer */ /* negative integer or not integer */
return 0; return 0;
} }
if (idx < 1 || idx > STIX_OBJ_GET_SIZE(rcv)) if (idx >= STIX_OBJ_GET_SIZE(rcv))
{ {
/* index out of range */ /* index out of range */
return 0; return 0;
} }
/* [NOTE] basicAt: and basicAt:put: uses a 1-based index. */
idx = idx - 1;
switch (STIX_OBJ_GET_FLAGS_TYPE(rcv)) switch (STIX_OBJ_GET_FLAGS_TYPE(rcv))
{ {
case STIX_OBJ_TYPE_BYTE: 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) if (stix_inttooow (stix, pos, &idx) <= 0)
{ {
/* integer out of range or not integer */ /* negative integer or not integer */
return 0; return 0;
} }
if (idx < 1 || idx > STIX_OBJ_GET_SIZE(rcv)) if (idx >= STIX_OBJ_GET_SIZE(rcv))
{ {
/* index out of range */ /* index out of range */
return 0; return 0;
@ -1140,9 +1137,6 @@ static int prim_basic_at_put (stix_t* stix, stix_ooi_t nargs)
return 0; return 0;
} }
/* [NOTE] basicAt: and basicAt:put: uses a 1-based index. */
idx = idx - 1;
switch (STIX_OBJ_GET_FLAGS_TYPE(rcv)) switch (STIX_OBJ_GET_FLAGS_TYPE(rcv))
{ {
case STIX_OBJ_TYPE_BYTE: case STIX_OBJ_TYPE_BYTE: