added two new keywords (and, or) for logical operations. work in progress
This commit is contained in:
		| @ -314,7 +314,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 	method initWithCapacity: capacity | ||||
| 	{ | ||||
| 		self.buffer := Array new: capacity. | ||||
| 		self.firstIndex := capacity div: 2. | ||||
| 		self.firstIndex := capacity bitShift: -1. | ||||
| 		self.lastIndex := self.firstIndex. | ||||
| 	} | ||||
|  | ||||
| @ -359,7 +359,7 @@ class OrderedCollection(SequenceableCollection) | ||||
|  | ||||
| 	method addFirst: obj | ||||
| 	{ | ||||
| 		if (self.firstIndex == 0) { self growBy: 8 shiftBy: 8 }. | ||||
| 		if (self.firstIndex == 0) { self __grow_and_shift(8, 8) }. | ||||
| 		self.firstIndex := self.firstIndex - 1. | ||||
| 		self.buffer at: self.firstIndex put: obj. | ||||
| 		^obj. | ||||
| @ -367,7 +367,7 @@ class OrderedCollection(SequenceableCollection) | ||||
|  | ||||
| 	method addLast: obj | ||||
| 	{ | ||||
| 		if (self.lastIndex == self.buffer size) { self growBy: 8 shiftBy: 0 }. | ||||
| 		if (self.lastIndex == self.buffer size) { self __grow_and_shift(8, 0) }. | ||||
| 		self.buffer at: self.lastIndex put: obj. | ||||
| 		self.lastIndex := self.lastIndex + 1. | ||||
| 		^obj. | ||||
| @ -377,7 +377,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 	{ | ||||
| 		| coll_to_add | | ||||
| 		coll_to_add := if (self == coll) { coll shallowCopy } else { coll }. | ||||
| 		self ensureHeadRoom: (coll_to_add size). | ||||
| 		self __ensure_head_room(coll_to_add size). | ||||
| 		coll_to_add reverseDo: [:obj |  | ||||
| 			self.firstIndex := self.firstIndex - 1. | ||||
| 			self.buffer at: self.firstIndex put: obj. | ||||
| @ -389,7 +389,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 	{ | ||||
| 		| coll_to_add | | ||||
| 		coll_to_add := if (self == coll) { coll shallowCopy } else { coll }. | ||||
| 		self ensureTailRoom: (coll_to_add size). | ||||
| 		self __ensure_tail_room(coll_to_add size). | ||||
| 		coll_to_add do: [:obj | | ||||
| 			self.buffer at: self.lastIndex put: obj. | ||||
| 			self.lastIndex := self.lastIndex + 1. | ||||
| @ -399,8 +399,14 @@ class OrderedCollection(SequenceableCollection) | ||||
|  | ||||
| 	method add: obj beforeIndex: index | ||||
| 	{ | ||||
| 		self insert: obj beforeIndex: index. | ||||
| 		^obj | ||||
| 		self __insert_before_index(obj, index). | ||||
| 		^obj. | ||||
| 	} | ||||
|  | ||||
| 	method add: obj afterIndex: index | ||||
| 	{ | ||||
| 		self __insert_before_index(obj, index + 1). | ||||
| 		^obj. | ||||
| 	} | ||||
|  | ||||
| 	method removeFirst | ||||
| @ -462,7 +468,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 		## remove the element at the given position. | ||||
| 		| obj | | ||||
| 		obj := self at: index. ## the range is checed by the at: method. | ||||
| 		self removeIndex:  index + self.firstIndex. | ||||
| 		self __remove_Index(index + self.firstIndex). | ||||
| 		^obj | ||||
| 	} | ||||
|  | ||||
| @ -477,7 +483,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 		while (i < self.lastIndex) | ||||
| 		{ | ||||
| 			cand := self.buffer at: i. | ||||
| 			if (obj = cand) { self removeIndex: i. ^cand }. | ||||
| 			if (obj = cand) { self __remove_index(i). ^cand }. | ||||
| 			i := i + 1. | ||||
| 		}. | ||||
| 		^error_block value. | ||||
| @ -525,7 +531,7 @@ class OrderedCollection(SequenceableCollection) | ||||
| 	## ------------------------------------------------ | ||||
| 	## PRIVATE METHODS | ||||
| 	## ------------------------------------------------ | ||||
| 	method growBy: grow_size shiftBy: shift_count | ||||
| 	method __grow_and_shift(grow_size, shift_count) | ||||
| 	{ | ||||
| 		| newcon | | ||||
| 		newcon := (self.buffer class) new: (self.buffer size + grow_size). | ||||
| @ -537,46 +543,71 @@ class OrderedCollection(SequenceableCollection) | ||||
| 		self.lastIndex := self.lastIndex + shift_count. | ||||
| 	} | ||||
|  | ||||
| 	method ensureHeadRoom: size | ||||
| 	method __ensure_head_room(size) | ||||
| 	{ | ||||
| 		| grow_size | | ||||
| 		if (self.firstIndex < size) | ||||
| 		{ | ||||
| 			grow_size := size - self.firstIndex + 8. | ||||
| 			self growBy: grow_size shiftBy: grow_size. | ||||
| 			self __grow_and_shift(grow_size, grow_size). | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	method ensureTailRoom: size | ||||
| 	method __ensure_tail_room(size) | ||||
| 	{ | ||||
| 		| tmp | | ||||
| 		tmp := (self.buffer size) - self.lastIndex. ## remaining capacity | ||||
| 		if (tmp < size) | ||||
| 		{ | ||||
| 			tmp := size - tmp + 8.  ## grow by this | ||||
| 			self growBy: tmp shiftBy: 0. | ||||
| 			tmp := size - tmp + 8.  ## grow by this amount | ||||
| 			self __grow_and_shift(tmp, 0). | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	method insert: obj beforeIndex: index | ||||
| 	method __insert_before_index(obj, index) | ||||
| 	{ | ||||
| 		## internal use only - index must be between 0 and self size inclusive | ||||
| 		| i start pos cursize reqsize | | ||||
|  | ||||
| 		| i start | | ||||
| 		if (self size == self.buffer size) { self growBy: 8 shiftBy: 8 }. | ||||
| 		start := self.firstIndex + index. | ||||
| 		i := self.lastIndex. | ||||
| 		while (i > start) | ||||
| 		if (index <= 0) | ||||
| 		{ | ||||
| 			self.buffer at: i put: (self.buffer at: i - 1). | ||||
| 			i := i - 1. | ||||
| 			## treat a negative index as the indicator to  | ||||
| 			## grow space in the front side. | ||||
| 			reqsize := index * -1 + 1. | ||||
| 			if (reqsize >= self.firstIndex) { self __ensure_head_room(reqsize) }. | ||||
| 			self.firstIndex := self.firstIndex + index - 1. | ||||
| 			self.buffer at: self.firstIndex put: obj. | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			cursize := self size. | ||||
| 			if (self.firstIndex > 0 and: [index <= (cursize bitShift: -1)]) | ||||
| 			{ | ||||
| 				start := self.firstIndex - 1. | ||||
| 				self.buffer replaceFrom: start to: (start + index - 1) with: self.buffer startingAt: self.firstIndex. | ||||
| 				self.buffer at: (start + index)  put: obj. | ||||
| 				self.firstIndex := start. | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				reqsize := if (index > cursize) { index - cursize } else { 1 }. | ||||
| 				if (reqsize < 8) { reqsize := 8 }. | ||||
| 				self __grow_and_shift(reqsize + 8, 0). | ||||
|  | ||||
| 				start := self.firstIndex + index. | ||||
| 				i := self.lastIndex. | ||||
| 				while (i > start) | ||||
| 				{ | ||||
| 					self.buffer at: i put: (self.buffer at: i - 1). | ||||
| 					i := i - 1. | ||||
| 				}. | ||||
| 				pos := index + self.firstIndex. | ||||
| 				self.lastIndex := if (pos > self.lastIndex) { pos + 1 } else { self.lastIndex + 1 }. | ||||
| 				self.buffer at: pos put: obj. | ||||
| 			}. | ||||
| 		}. | ||||
| 		self.lastIndex := self.lastIndex + 1. | ||||
| 		self.buffer at: index + self.firstIndex put: obj. | ||||
| 		^obj | ||||
| 	} | ||||
|  | ||||
| 	method removeIndex: index | ||||
| 	method __remove_index(index) | ||||
| 	{ | ||||
| 		## remove an element at the given index from the internal buffer's | ||||
| 		## angle. as it is for internal use only, no check is performed | ||||
|  | ||||
		Reference in New Issue
	
	Block a user