BooleanArray.st
changeset 20655 64d4a9341d67
child 23977 016b84ce84cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BooleanArray.st	Fri Oct 14 17:46:52 2016 +0200
@@ -0,0 +1,233 @@
+"
+ COPYRIGHT (c) 1995 by Claus Gittinger
+              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.
+
+ This is a demo example:
+
+ THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+"
+"{ Package: 'stx:libbasic' }"
+
+"{ NameSpace: Smalltalk }"
+
+BitArray variableByteSubclass:#BooleanArray
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Collections-Arrayed'
+!
+
+!BooleanArray class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1995 by Claus Gittinger
+              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.
+
+ This is a demo example:
+
+ THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+"
+!
+
+documentation
+"
+    BooleanArrays are specially tuned to store booleans (true and false), 
+    and are useful for bulk bit/boolean data. 
+
+    Instances require only 1/32th (32bit machines) or even 1/64th (64bit machines)
+    of memory compared to a regular array of booleans.
+
+    They store 8 booleans per byte. 
+    Since instances store bits in multiples of 8, 
+    the real size of the collection is kept in an extra instance variable (tally).
+    It may be useful if huge boolean arrays are to be used.
+
+    ATTENTION:
+        inheriting from BitArray, bits 1 to 8 of the BooleanArray are stored in bits 8 to 1 
+        of the corresponding byte, to allow easy mapping to ASN.1 BIT STRING encoding
+        in the BER.
+        Do not change this.
+
+    [memory requirements:]
+        OBJ-HEADER + ((size + 7) // 8)
+
+    [see also:]
+        ByteArray WordArray Array
+
+    [author:]
+        Claus Gittinger
+"
+!
+
+examples
+"
+                                                                        [exBegin]
+    (BooleanArray new:7) inspect
+                                                                        [exEnd]
+                                                                        [exBegin]
+    (BooleanArray new:7) basicInspect
+                                                                        [exEnd]
+                                                                        [exBegin]
+    |flags|
+
+    flags := BooleanArray new:1000000.
+    (flags at:9999) printNL.
+    flags at:9999 put:true.
+    (flags at:9999) printNL.
+                                                                        [exEnd]
+"
+! !
+
+!BooleanArray methodsFor:'accessing'!
+
+at:index
+    "retrieve the boolean at index"
+
+    ^ (super at:index) == 1
+
+    "
+     (BooleanArray new:1000) at:555
+    "
+
+    "
+     |b|
+
+     b := BooleanArray new:1000.
+     b at:555 put:true.
+     b at:555   
+    "
+
+    "Modified: / 31.7.1997 / 18:37:25 / cg"
+    "Modified: / 23.5.1999 / 20:02:57 / stefan"
+!
+
+at:index put:aBoolean
+    "store the argument, aBoolean at index; return aBoolean (sigh)."
+
+    |v|
+
+    aBoolean == true ifTrue:[
+        v := 1.
+    ] ifFalse:[
+        aBoolean == false ifTrue:[
+            v := 0.
+        ] ifFalse:[
+            "/ not true or false
+            ^ self elementBoundsError:aBoolean
+        ]
+    ].
+    super at:index put:v.
+    ^ aBoolean
+
+    "
+     |b|
+
+     b := BooleanArray new:1000.
+     b at:555 put:true.
+     b at:555   
+    "
+!
+
+occurrencesOf:anElement
+    "count the occurrences of the argument, anElement in the receiver"
+
+    |nOnes|
+
+    nOnes := self countOnes.
+    anElement == true ifTrue:[
+        ^ nOnes
+    ].
+    anElement == false ifTrue:[
+        ^ tally - nOnes
+    ].
+    ^ 0
+
+    "
+     (BooleanArray new:10)
+        at:4 put:true;
+        at:6 put:true;
+        at:7 put:true;
+        occurrencesOf:true
+    "
+! !
+
+!BooleanArray methodsFor:'filling & replacing'!
+
+atAllPut:aBoolean
+    "replace all elements of the collection by the argument, aBoolean.
+     The argument, aBoolean must be true or false.
+     Notice: This operation modifies the receiver, NOT a copy;
+     therefore the change may affect all others referencing the receiver."
+
+    |v|
+
+    aBoolean == true ifTrue:[
+        v := 1
+    ] ifFalse:[
+        aBoolean == false ifTrue:[
+            v := 0
+        ] ifFalse:[
+            "/ booleanArrays can only hold true and false
+            ^ self elementBoundsError:aBoolean
+        ]
+    ].
+    super atAllPut:v
+! !
+
+!BooleanArray methodsFor:'queries'!
+
+defaultElement
+    ^ false
+!
+
+isValidElement:anObject
+    "return true, if I can hold this kind of object"
+
+    ^ anObject == true or:[anObject == false]
+! !
+
+!BooleanArray class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+! !
+