SystemOrganization addCategory: #'Container-Abstract'! SystemOrganization addCategory: #'Container-Exceptions'! SystemOrganization addCategory: #'Container-Iterators'! SystemOrganization addCategory: #'Container-Lists'! SystemOrganization addCategory: #'Container-Sets'! SystemOrganization addCategory: #'Container-Maps'! Object subclass: #CTCollection instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Abstract'! !CTCollection methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:18'! add: anObject "Ensures that this collection contains the specified element (optional operation)." self subclassResponsibility! ! !CTCollection methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:16'! addAll: aCollection "Adds all of the elements in the specified collection to this collection (optional operation)." aCollection iterator do: [ :each | self add: each ]! ! !CTCollection methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:18'! clear "Removes all of the elements from this collection (optional operation)." self removeAll: self! ! !CTCollection methodsFor: 'testing' stamp: 'lr 6/7/2011 18:46'! includes: anObject "Returns true if this collection contains the specified element."! ! !CTCollection methodsFor: 'testing' stamp: 'lr 6/7/2011 18:46'! includesAll: aCollection "Returns true if this collection contains all of the elements in the specified collection."! ! !CTCollection methodsFor: 'testing' stamp: 'lr 6/7/2011 19:15'! isEmpty "Answer whether the receiver contains any elements." ^ self size = 0! ! !CTCollection methodsFor: 'accessing' stamp: 'lr 6/7/2011 18:46'! iterator "Returns an iterator over the elements in this collection."! ! !CTCollection methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:18'! remove: anObject "Removes a single instance of the specified element from this collection, if it is present (optional operation)." self subclassResponsibility! ! !CTCollection methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:16'! removeAll: aCollection "Removes all of this collection's elements that are also contained in the specified collection (optional operation)." aCollection iterator do: [ :each | self remove: each ]! ! !CTCollection methodsFor: 'accessing' stamp: 'lr 6/7/2011 19:15'! size "Returns the number of elements in this collection." self subclassResponsibility! ! CTCollection subclass: #CTList instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Abstract'! CTList subclass: #CTArrayList instanceVariableNames: 'array size' classVariableNames: '' poolDictionaries: '' category: 'Container-Lists'! !CTArrayList methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:07'! add: anObject ! ! !CTArrayList methodsFor: 'modifying' stamp: 'lr 6/7/2011 19:07'! addAll: anObject ! ! !CTArrayList methodsFor: 'initialization' stamp: 'lr 6/7/2011 19:07'! initialize: anInteger array := Array new: anInteger. size := 0! ! !CTArrayList methodsFor: 'internal' stamp: 'lr 6/7/2011 19:14'! normalize array size > size ifTrue: [ array := array copyFrom: 1 to: size ]! ! !CTArrayList methodsFor: 'accessing' stamp: 'lr 6/7/2011 19:07'! size ^ size! ! CTList subclass: #CTLinkedList instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Lists'! CTCollection subclass: #CTSet instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Abstract'! CTSet subclass: #CTHashSet instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Sets'! CTHashSet subclass: #CTLinkedHashSet instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Sets'! CTSet subclass: #CTTreeSet instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! !CTTreeSet class methodsFor: 'as yet unclassified' stamp: 'lr 7/13/2011 09:17'! foo ^ Fooo! ! !CTTreeSet methodsFor: 'as yet unclassified' stamp: 'lr 7/13/2011 09:29'! foo ^ Fooo + tally + Object! ! Object subclass: #CTHashEntry instanceVariableNames: 'key keyHash value next' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! !CTHashEntry class methodsFor: 'instance creation' stamp: 'lr 6/7/2011 20:30'! key: aKey hash: aHash value: aValue next: anEntry ^ self basicNew initializeKey: aKey hash: aHash value: aValue next: anEntry! ! !CTHashEntry methodsFor: 'initialization' stamp: 'lr 7/13/2011 12:06'! initializeKey: aKey hash: anInteger value: aValue next: anEntry key := aKey. keyHash := anInteger. value := aValue. next := anEntry! ! !CTHashEntry methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:32'! key ^ key! ! !CTHashEntry methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:31'! keyHash ^ keyHash! ! !CTHashEntry methodsFor: 'accessing' stamp: 'lr 7/13/2011 12:06'! next ^ next! ! !CTHashEntry methodsFor: 'modifying' stamp: 'lr 6/7/2011 20:32'! replaceValue: aValue | oldValue | oldValue := value. value := aValue. ^ oldValue! ! !CTHashEntry methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:32'! value ^ value! ! CTHashEntry subclass: #CTLinkedHashEntry instanceVariableNames: 'before after' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! Object subclass: #CTIterator instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! CTIterator subclass: #CTArrayIterator instanceVariableNames: 'sequence position' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTArrayIterator class methodsFor: 'instance creation' stamp: 'lr 8/3/2011 19:53'! on: aSequenceableCollection ^ self basicNew initializeOn: aSequenceableCollection! ! !CTArrayIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:53'! hasNext ^ position < sequence size! ! !CTArrayIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:53'! initializeOn: aSequencableCollection self initialize. sequence := aSequencableCollection. position := 0! ! !CTArrayIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:52'! next self hasNext ifFalse: [ ^ self noSuchElementError ]. ^ sequence at: (position := position + 1)! ! CTIterator subclass: #CTChainingIterator instanceVariableNames: 'iterators current' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTChainingIterator class methodsFor: 'instance creation' stamp: 'lr 8/3/2011 19:55'! on: anIterator ^ self basicNew initializeOn: anIterator! ! !CTChainingIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:17'! hasNext | hasNext | [ (hasNext := current hasNext) not and: [ iterators hasNext ] ] whileTrue: [ current := iterators next ]. ^ hasNext! ! !CTChainingIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:56'! initializeOn: anIterator self initialize. iterators := anIterator. current := CTEmptyIterator new! ! !CTChainingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:47'! next self hasNext ifFalse: [ ^ self noSuchElementError ]. ^ current next! ! CTIterator subclass: #CTDelegateIterator instanceVariableNames: 'iterator' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! CTDelegateIterator subclass: #CTCyclingIterator instanceVariableNames: 'current' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTCyclingIterator commentStamp: 'lr 8/3/2011 18:08' prior: 0! An iterator that cycles infinitely over its elements.! !CTCyclingIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 18:17'! hasNext current hasNext ifFalse: [ current := iterator copy ]. ^ current hasNext! ! !CTCyclingIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:57'! initializeOn: anIterator super initializeOn: anIterator. current := anIterator copy! ! !CTCyclingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:48'! next self hasNext ifFalse: [ ^ self noSuchElementError ]. ^ current next! ! !CTDelegateIterator class methodsFor: 'instance creation' stamp: 'lr 8/3/2011 19:21'! on: anInterator ^ self basicNew initializeOn: anInterator! ! !CTDelegateIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 18:22'! hasNext ^ iterator hasNext! ! !CTDelegateIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:21'! initializeOn: anIterator self initialize. iterator := anIterator! ! !CTDelegateIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 18:22'! next ^ iterator next! ! CTDelegateIterator subclass: #CTLimitingIterator instanceVariableNames: 'limit' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTLimitingIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:19'! hasNext ^ 0 < limit and: [ super hasNext ]! ! !CTLimitingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:19'! next self hasNext ifFalse: [ ^ self noSuchElementError ]. limit := limit - 1. ^ super next! ! !CTLimitingIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 18:27'! setLimit: anInteger limit := anInteger! ! CTDelegateIterator subclass: #CTMutatingIterator instanceVariableNames: 'block' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTMutatingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 18:21'! next ^ block value: iterator next! ! CTDelegateIterator subclass: #CTPeekingIterator instanceVariableNames: 'element' classVariableNames: 'Sentinel' poolDictionaries: '' category: 'Container-Iterators'! CTPeekingIterator subclass: #CTFilterIterator instanceVariableNames: 'predicate' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTFilterIterator class methodsFor: 'as yet unclassified' stamp: 'lr 8/3/2011 07:30'! initialize Sentinel := Object new! ! !CTFilterIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:44'! hasNext | next | [ element == Sentinel and: [ iterator hasNext ] ] whileTrue: [ next := iterator next. (predicate value: next) ifTrue: [ element := next ] ]. ^ element ~~ Sentinel! ! !CTFilterIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:41'! setPredicate: aValuable predicate := aValuable! ! !CTPeekingIterator class methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:02'! initialize Sentinel := Object new! ! !CTPeekingIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:38'! hasNext (element == Sentinel and: [ iterator hasNext ]) ifTrue: [ element := iterator next ]. ^ element ~~ Sentinel! ! !CTPeekingIterator methodsFor: 'initialization' stamp: 'lr 8/3/2011 19:02'! initialize super initialize. element := Sentinel! ! !CTPeekingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:40'! next | next | self hasNext ifFalse: [ ^ self noSuchElement ]. next := element. element := Sentinel. ^ next! ! !CTPeekingIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:40'! peek "Answer the next element without actually consuming it, or raise an CTNoSuchElementError." self hasNext ifFalse: [ ^ self noSuchElement ]. ^ element! ! CTIterator subclass: #CTEmptyIterator instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Iterators'! !CTEmptyIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:01'! hasNext ^ false! ! !CTEmptyIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:14'! next ^ self noSuchElementError! ! !CTIterator methodsFor: 'enumerating' stamp: 'lr 8/3/2011 07:18'! do: aBlock [ self hasNext ] whileTrue: [ aBlock value: self next ]! ! !CTIterator methodsFor: 'testing' stamp: 'lr 8/3/2011 19:01'! hasNext "Answer whether there is a next element in the iterator." self subclassResponsibility! ! !CTIterator methodsFor: 'accessing' stamp: 'lr 8/3/2011 19:16'! next "Answer the next element in the iterator, or raise CTNoSuchElementError if no such element exists." self subclassResponsibility! ! !CTIterator methodsFor: 'private' stamp: 'lr 8/3/2011 19:14'! noSuchElementError ^ CTNoSuchElementError signal! ! Object subclass: #CTLinkedListEntry instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Lists'! Object subclass: #CTMap instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Abstract'! CTMap subclass: #CTHashMap instanceVariableNames: 'size modifications entries' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! !CTHashMap class methodsFor: 'instance creation' stamp: 'lr 7/13/2011 12:18'! new ^ self new: 16! ! !CTHashMap class methodsFor: 'instance creation' stamp: 'lr 7/13/2011 12:18'! new: anInteger ^ self basicNew initialize: anInteger; yourself! ! !CTHashMap methodsFor: 'querying' stamp: 'lr 6/7/2011 20:18'! at: aKey ifAbsent: aBlock | hash entry | hash := self hashFor: aKey. entry := entries at: (self indexFor: hash). [ entry isNil ] whileFalse: [ (entry hash = hash and: [ self compare: aKey with: entry key ]) ifTrue: [ ^ entry value ]. entry := entry next ]. ^ aBlock value! ! !CTHashMap methodsFor: 'modifying' stamp: 'lr 7/13/2011 12:22'! at: aKey put: aValue | hash index entry | hash := self hashFor: aKey. index := self indexFor: hash. entry := entries at: index. [ entry isNil ] whileFalse: [ (entry hash = hash and: [ self compare: aKey with: entry key ]) ifTrue: [ entry setValue: aValue. ^ aValue ] ]. entries at: index put: (CTHashEntry key: aKey value: aValue hash: hash next: (entries at: index)). size := size + 1. ^ aValue! ! !CTHashMap methodsFor: 'private' stamp: 'lr 7/13/2011 12:18'! capacityFor: anInteger | capacity | capacity := 1. [ capacity < anInteger ] whileTrue: [ capacity := capacity bitShift: 1 ]. ^ capacity! ! !CTHashMap methodsFor: 'private' stamp: 'lr 6/7/2011 20:18'! compare: anObject with: anotherObject ^ anObject = anotherObject! ! !CTHashMap methodsFor: 'private' stamp: 'lr 6/7/2011 20:16'! hashFor: aKey "Answer the hash code for a given key." ^ aKey hash! ! !CTHashMap methodsFor: 'private' stamp: 'lr 6/7/2011 20:17'! indexFor: anInteger "Answer the index for a given hash code." ^ anInteger bitAnd: entries size - 1! ! !CTHashMap methodsFor: 'initialization' stamp: 'lr 7/13/2011 12:23'! initialize: anInteger size := modifications := 0. entries := Array new: (self capacityFor: anInteger)! ! !CTHashMap methodsFor: 'private' stamp: 'lr 7/13/2011 12:11'! loadFactor ^ 0.75! ! !CTHashMap methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:23'! size ^ size! ! CTHashMap subclass: #CTLinkedHashMap instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! !CTMap methodsFor: 'querying' stamp: 'lr 6/7/2011 20:19'! at: aKey ^ self at: aKey ifAbsent: [ self keyNotFound ]! ! !CTMap methodsFor: 'querying' stamp: 'lr 6/7/2011 20:19'! at: aKey ifAbsent: aBlock self subclassResponsibility! ! !CTMap methodsFor: 'querying' stamp: 'lr 6/7/2011 20:21'! at: aKey ifPresent: aBlock ^ aBlock value: (self at: aKey ifAbsent: [ ^ nil ])! ! !CTMap methodsFor: 'modifying' stamp: 'lr 6/7/2011 20:22'! at: aKey put: aValue self subclassResponsibility! ! !CTMap methodsFor: 'modifying' stamp: 'lr 7/13/2011 12:24'! clear self subclassResponsibility! ! !CTMap methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:22'! entries ^ self subclassResponsibility! ! !CTMap methodsFor: 'testing' stamp: 'lr 6/7/2011 20:22'! includesKey: aKey ^ self keys includes: aKey! ! !CTMap methodsFor: 'testing' stamp: 'lr 6/7/2011 20:22'! includesValue: aValue ^ self values includes: aValue! ! !CTMap methodsFor: 'testing' stamp: 'lr 6/7/2011 20:23'! isEmpty ^ self size = 0! ! !CTMap methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:22'! keys ^ self subclassResponsibility! ! !CTMap methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:23'! size self subclassResponsibility! ! !CTMap methodsFor: 'accessing' stamp: 'lr 6/7/2011 20:23'! values ^ self subclassResponsibility! ! CTMap subclass: #CTQuadMap instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! !CTQuadMap methodsFor: 'as yet unclassified' stamp: 'lr 8/6/2011 19:38'! at: aPoint put: anObject! ! CTMap subclass: #CTTreeMap instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Maps'! Error subclass: #CTNoSuchElementError instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Container-Exceptions'! CTPeekingIterator initialize! CTFilterIterator initialize!