BitArray.st
author Claus Gittinger <cg@exept.de>
Wed, 15 May 2019 17:03:42 +0200
changeset 24123 d3c4267aa343
parent 23976 16af24753c12
child 24242 ae4ea9cab9e2
permissions -rw-r--r--
#BUGFIX by cg class: Smalltalk class changed: #basicLoadPackage:fromDirectory:asAutoloaded:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23976
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
     1
"{ Encoding: utf8 }"
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
     2
20654
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
 This is a demo example:
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
 THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
 ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
 SUCH DAMAGE.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"{ Package: 'stx:libbasic' }"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
"{ NameSpace: Smalltalk }"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
ArrayedCollection variableByteSubclass:#BitArray
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
	instanceVariableNames:'tally'
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
	classVariableNames:''
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	poolDictionaries:''
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	category:'Collections-Arrayed'
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!BitArray class methodsFor:'documentation'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
copyright
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
 COPYRIGHT (c) 1997 by eXept Software AG / Claus Gittinger
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
              All Rights Reserved
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
 This software is furnished under a license and may be used
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
 only in accordance with the terms of that license and with the
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
 inclusion of the above copyright notice.   This software may not
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
 be provided or otherwise made available to, or used by, any
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
 other person.  No title to or ownership of the software is
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
 hereby transferred.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
 This is a demo example:
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
 THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTOR ``AS IS'' AND
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
 ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTOR BE LIABLE
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
 SUCH DAMAGE.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
documentation
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
    BitArrays are specially tuned to store bits, and are useful for bulk bit/boolean data. 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    They require only 1/32th (32bit machines) or 1/64th (64bit machines) of the memory 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    compared to an array of booleans.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
21694
f1f2615f8a41 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20654
diff changeset
    76
    They store 8 bits per byte. Since instances store bits in multiples
20654
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    of 8, the real size of the collection is kept in an extra instance variable (tally).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    It may be useful if huge boolean arrays are needed.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    There are 10 types of people in this world: 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
        Those who understand binary, & those who don't.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    ATTENTION:
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
        Bits 1 to 8 of the BooleanArray are stored in bits 8 to 1 of the
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
        corresponding byte, to allow easy mapping to ASN.1 BIT STRING encoding
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
        in the BER. (i.e. MSB-first)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
        Do not change this.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
        
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    [memory requirements:]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
        OBJ-HEADER + ((size + 7) // 8)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    [author:]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
        Claus Gittinger
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    [see also:]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
        BooleanArray ByteArray WordArray Array
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
examples
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
                                                                        [exBegin]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    (BitArray new:7) inspect
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
                                                                        [exEnd]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
                                                                        [exBegin]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    (BitArray new:7) basicInspect
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
                                                                        [exEnd]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
                                                                        [exBegin]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    |bits|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    bits := BitArray new:1000000.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    (bits at:9999) printCR.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    bits at:9999 put:1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    (bits at:9999) printCR.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
                                                                        [exEnd]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
!BitArray class methodsFor:'instance creation'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
fromBytes:aByteArray
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    "return a new instance, capable of holding aByteArray size*8 bits, initialized from aByteArray"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    |a|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    a := self new: aByteArray size*8.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    1 to:aByteArray size do:[:i | a byteAt:i put:(aByteArray at:i)].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    ^ a
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
     BitArray fromBytes:#[ 2r00001111 2r10101010 2r01010101]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
new
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    "return a new instance, capable of holding size bits"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    ^ self new:0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
     BitArray new
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
new:size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
    "return a new instance, capable of holding size bits"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    |nBytes|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    nBytes := (size + 7) // 8.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ^ (super new:nBytes) setTally:size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
     BitArray new:10
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
uninitializedNew:size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    ^ self new:size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
!BitArray class methodsFor:'queries'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
maxVal
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    "the minimum value which can be stored in instances of me.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
     For BitArrays, this is 1"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ^ 1
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
minVal
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "the minimum value which can be stored in instances of me.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
     For BitArrays, this is 0"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
    ^ 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
!BitArray methodsFor:'accessing'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
at:index
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
    "retrieve the bit at index (1..)"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
    |byte mask i0|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    (index between:1 and:tally) ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
        ^ self subscriptBoundsError:index
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    i0 := index - 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    byte := super basicAt:(i0 // 8)+1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    mask := 1 bitShift:(7 - (i0 \\ 8)).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    ^ (byte bitTest:mask) ifTrue:[1] ifFalse:[0]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
     (BitArray new:1000) at:555
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
     (BitArray new:1000) at:400 put:1; at:400
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
     |b|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
     b := BitArray new:1000.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
     b at:555 put:1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
     b at:555   
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
at:index put:aNumber
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    "store the argument, aNumber at index (1..);    
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
     return the argument, aNumber (sigh)."
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    |byte mask idx i0|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    (index between:1 and:tally) ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
        ^ self subscriptBoundsError:index
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    i0 := index - 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
    idx := (i0 // 8) + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    byte := super basicAt:idx.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    mask := 1 bitShift:(7 - (i0 \\ 8)).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
    aNumber == 1 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
        byte := byte bitOr:mask
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    ] ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
        aNumber == 0 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
            byte := byte bitAnd:(mask bitInvert)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
        ] ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
            "/ not 0 or 1
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
            ^ self elementBoundsError:aNumber
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        ]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    super basicAt:idx put:byte.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    ^ aNumber.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
     |b|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
     b := BitArray new:1000.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
     b at:555 put:1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
     b at:555    
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
byteAt:index
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    "retrieve 8 bits at index; the index is 1 for the first 8 bits, 2 for the next 8 bits etc."
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
    ^ self basicAt:index
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
     ((BitArray new:8) at:1 put:1); byteAt:1
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
byteAt:index put:aByte
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    "store 8 bits at index; the index is 1 for the first 8 bits, 2 for the next 8 bits etc."
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
    ^ self basicAt:index put:aByte
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
     ((BitArray new:8) byteAt:1 put:128); at:1     
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
occurrencesOf:anElement
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    "count the occurrences of the argument, anElement in the receiver"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
    |nOnes|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    nOnes := self countOnes.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
    anElement == 1 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
        ^ nOnes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    anElement == 0 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
        ^ tally - nOnes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
    ^ 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
     (BitArray new:10)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
        at:4 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
        at:6 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
        at:7 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
        occurrencesOf:1 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
     (BitArray new:10)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
        at:4 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
        at:6 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
        at:7 put:1;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
        occurrencesOf:0    
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
!BitArray methodsFor:'converting'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
bytes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    "answer myself as a ByteArray containing my bytes"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    |size bytes|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    size := self basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
    bytes := ByteArray new:size.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    1 to:size do:[:index|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
        bytes at:index put:(self byteAt:index)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    ^ bytes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
!BitArray methodsFor:'filling & replacing'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
atAllPut:aNumber
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    "replace all elements of the collection by the argument, aNumber.
23976
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
   311
     Return the receiver.
20654
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
     The argument, aBoolean must be 0 or 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
     Notice: This operation modifies the receiver, NOT a copy;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
     therefore the change may affect all others referencing the receiver."
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    |v lastIndex|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
    lastIndex := self basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
    lastIndex == 0 ifTrue:[^ self].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
    aNumber == 1 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
        v := 255
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
    ] ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
        aNumber == 0 ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
            v := 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
        ] ifFalse:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
            "/
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
            "/ booleanArrays can only hold true and false
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
            "/
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
            ^ self elementBoundsError:aNumber
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
        ]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    1 to:lastIndex-1 do:[:i |
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
        self basicAt:i put:v
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    "/ ensure 0-bits above tally
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
    v := #[ 2r11111111
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
            2r10000000
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
            2r11000000
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
            2r11100000
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
            2r11110000
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
            2r11111000
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
            2r11111100
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
            2r11111110 ] at:(tally\\8)+1. 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
    self basicAt:lastIndex put:v.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
     ((self new:10) atAllPut:1) countOnes  
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
     ((self new:8) atAllPut:1) countOnes   
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    "
23976
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
   352
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
   353
    "Modified (comment): / 26-03-2019 / 11:52:55 / Claus Gittinger"
20654
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
!BitArray methodsFor:'logical operations'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
bitOr:aBitArray
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
    |new mySize "{ Class: SmallInteger }" otherSize "{ Class: SmallInteger }"|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
    mySize := self basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
    otherSize := aBitArray basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
    new := self class basicNew:(mySize max:otherSize).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
    new setTally:(self size max:aBitArray size).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
    1 to:mySize do:[:i|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
        new basicAt:i put:(self basicAt:i).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    1 to:otherSize do:[:i|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
        new basicAt:i put:((new basicAt:i) bitOr:(aBitArray basicAt:i)).
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
    ^ new
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
        ((BitArray new:5) at:3 put:1; yourself) bitOr:((BitArray new:8) at:5 put:1; yourself)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
!BitArray methodsFor:'private'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
countOnes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
    "count the 1-bits in the receiver"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
    |sz bI count|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
    count := 0.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    "/ because remaining bits in the highest byte are always 0,
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
    "/ we can simply count the 1-bits in ALL bytes... (see lastByte handling in atAllPut:)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    bI := 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
    sz := self basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    [bI <= sz] whileTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
        count := count + (self basicAt:bI) bitCount.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
        bI := bI + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    ^ count
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
"/    |i nI bI bits count|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
"/    i := bI := 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
"/    [
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
"/        nI := i + 8.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
"/        nI <= tally
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
"/    ] whileTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
"/        bits := self basicAt:bI.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
"/        count := count + bits bitCount.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
"/        bI := bI + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
"/        i := nI
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
"/    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
"/    [i <= tally] whileTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
"/        (self at:i) ifTrue:[ count := count + 1].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
"/        i := i + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
"/    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
"/    ^ count
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
     (BooleanArray new:100)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
        at:14 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
        at:55 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
        countOnes
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
     (BooleanArray new:100)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
        at:14 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
        at:55 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
        occurrencesOf:true
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
     (BooleanArray new:100)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
        at:14 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
        at:55 put:true; 
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
        occurrencesOf:false
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
indexOfNth:n occurrenceOf:what
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
    "return the index of the nTh occurrence of a value, or 0 if there are not that many"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
    |sz byteIndex count countInByte|
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
    n > self size ifTrue:[^ 0].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
    count := 0.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
    byteIndex := 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
    sz := self basicSize.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
    [byteIndex <= sz] whileTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
        countInByte := (self basicAt:byteIndex) bitCount.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
        what = self defaultElement ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
            countInByte := 8-countInByte.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
        ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
        count := count + countInByte.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
        count >= n ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
            count := count - countInByte.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
            (byteIndex-1)*8+1 to:(byteIndex-1)*8+8 do:[:bitIndex |
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
                (self at:bitIndex) = what ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
                    count := count + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
                    count = n ifTrue:[
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
                        ^ bitIndex.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
                    ]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
                ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
            ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
            ^ 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
        ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
        byteIndex := byteIndex + 1.
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
    ].
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
    ^ 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   467
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   469
     (BooleanArray new:100)
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   470
        at:1 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
        at:2 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   472
        at:4 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
        at:5 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
        at:6 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
        at:7 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
        at:8 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
        at:10 put:true;
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
        indexOfNth:8 occurrenceOf:false
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
    "
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
setTally:size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
    "set my tally - that is the actual number of bits in me
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
     (usually a little less than the number of bits in my byte array)"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
    tally := size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
!BitArray methodsFor:'queries'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
defaultElement
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
    ^ 0
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
isValidElement:anObject
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
    "return true, if I can hold this kind of object"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
    ^ anObject == 0 or:[anObject == 1]
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
size
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
    "return the size of the receiver"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
    ^ tally
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
23976
16af24753c12 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21694
diff changeset
   507
20654
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
!BitArray methodsFor:'visiting'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
acceptVisitor:aVisitor with:aParameter
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
    "dispatch for visitor pattern; send #visitBitArray:with: to aVisitor"
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
    ^ aVisitor visitBitArray:self with:aParameter
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
!BitArray class methodsFor:'documentation'!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
version
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
    ^ '$Header$'
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
!
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
version_CVS
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
    ^ '$Header$'
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
! !
d36b1e1c301f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525