initial checkin
authorClaus Gittinger <cg@exept.de>
Fri, 19 Jun 1998 00:57:23 +0200
changeset 3615 c0f82feaf6a7
parent 3614 51d01f893c63
child 3616 c2f0a1519163
initial checkin
KeyedCollection.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/KeyedCollection.st	Fri Jun 19 00:57:23 1998 +0200
@@ -0,0 +1,195 @@
+"
+ COPYRIGHT (c) 1998 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+
+Collection subclass:#KeyedCollection
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Collections-Abstract'
+!
+
+!KeyedCollection class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1998 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+!
+
+documentation
+"
+    Abstract superclass for collections which have a key->value mapping.
+    This abstract class provides functionality common to those collections,
+    without knowing how the concrete class implements things. Thus, all
+    methods found here depend on some basic mechanisms to be defined in the
+    concrete class. 
+    These basic methods are usually defined as #subclassResponsibility here.
+    Some methods are also redefined for better performance.
+
+    Subclasses should at least implement:
+        at:ifAbsent:        - accessing elements
+        removeKey:ifAbsent  - removing
+        keysAndValuesDo:    - enumerating
+
+    [author:]
+        Claus Gittinger
+"
+
+! !
+
+!KeyedCollection methodsFor:'accessing'!
+
+at:key
+    "return the value stored under akey.
+     Raise an error if not found"
+
+    ^ self at:key ifAbsent:[self errorKeyNotFound:key].
+
+    "Modified: / 19.6.1998 / 00:48:27 / cg"
+!
+
+at:key ifAbsent:exceptionBlock
+    "return the value stored under akey.
+     Return the value from evaluating exceptionBlock if not found"
+
+    ^ self subclassResponsibility
+
+    "Created: / 19.6.1998 / 00:48:23 / cg"
+!
+
+keyAtValue:value
+    "return the key under which value is stored.
+     Raise an error if not found"
+
+    ^ self keyAtValue:value ifAbsent:[self errorValueNotFound:value].
+
+    "Modified: / 19.6.1998 / 00:48:27 / cg"
+    "Created: / 19.6.1998 / 00:49:16 / cg"
+!
+
+keyAtValue:value ifAbsent:exceptionBlock
+    "return the key under which value is stored.
+     If not found, return the value from evaluating exceptionBlock"
+
+    self keysAndValuesDo:[:elKey :elValue |
+        value == elValue ifTrue:[^ elKey]
+    ].
+    ^ exceptionBlock value
+
+    "Modified: / 19.6.1998 / 00:48:27 / cg"
+    "Created: / 19.6.1998 / 00:50:34 / cg"
+!
+
+keys
+    "return a collection containing the keys of the receiver"
+
+    |keyCollection|
+
+    keyCollection := OrderedCollection new.
+    self keysDo:[:aKey |
+        keyCollection add:aKey
+    ].
+    ^ keyCollection
+
+    "Modified: / 19.6.1998 / 00:48:27 / cg"
+    "Created: / 19.6.1998 / 00:51:49 / cg"
+!
+
+values
+    "return a collection containing the values of the receiver"
+
+    |valueCollection|
+
+    valueCollection := OrderedCollection new.
+    self do:[:element |
+        valueCollection add:element
+    ].
+    ^ valueCollection
+
+    "Modified: / 19.6.1998 / 00:48:27 / cg"
+    "Created: / 19.6.1998 / 00:52:16 / cg"
+! !
+
+!KeyedCollection methodsFor:'enumerating'!
+
+do:aBlock
+    "evaluate aBlock for each value"
+
+    self keysAndValuesDo:[:elKey :elValue | aBlock value:elValue]
+
+    "Created: / 19.6.1998 / 00:56:24 / cg"
+!
+
+keysAndValuesDo:aBlock
+    "evaluate aBlock for each key and value"
+
+    ^ self subclassResponsibility
+
+    "Created: / 19.6.1998 / 00:56:52 / cg"
+!
+
+keysDo:aBlock
+    "evaluate aBlock for each key"
+
+    self keysAndValuesDo:[:elKey :elValue | aBlock value:elKey]
+
+    "Created: / 19.6.1998 / 00:56:34 / cg"
+! !
+
+!KeyedCollection methodsFor:'removing'!
+
+removeKey:aKey
+    "remove key (and the value stored under that key) from the
+     receiver; raise an error if no such element is contained"
+
+    ^ self removeKey:aKey ifAbsent:[self errorKeyNotFound:aKey]
+
+    "Created: / 19.6.1998 / 00:53:25 / cg"
+    "Modified: / 19.6.1998 / 00:54:02 / cg"
+!
+
+removeKey:aKey ifAbsent:exceptionBlock
+    "remove key (and the value stored under that key) from the
+     receiver; if no such element is contained, return the value
+     from evaluating exceptionBlock"
+
+    ^ self subclassResponsibility
+
+    "Created: / 19.6.1998 / 00:53:58 / cg"
+! !
+
+!KeyedCollection methodsFor:'testing'!
+
+includesKey:aKey
+    "return true, if the argument, aKey is a key in the receiver"
+
+    self keysDo:[:elKey | aKey = elKey ifTrue:[^ true]].
+    ^ false
+
+    "Created: / 19.6.1998 / 00:55:05 / cg"
+! !
+
+!KeyedCollection class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libbasic/KeyedCollection.st,v 1.1 1998-06-18 22:57:23 cg Exp $'
+! !