Added a merge sort for ArrayedCollections
[panda.git] / st / Integer.st
blobbfb67418443536daedd30042f28ab09d1c1c0693
2 Copyright (c) 2008 Vincent Geddes
3 Copyright (c) 2007 Luca Bruno
5 This file is part of Smalltalk YX.
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the 'Software'), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
17 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 DEALINGS IN THE SOFTWARE.
26 "mathematics"
28 Integer method!
29 gcd: aNumber
30     "Answer the greatest common divisor"
31     | num tmp remainder |
32     num := self max: aNumber.
33     remainder := self min: aNumber.
34     [ remainder isZero ]
35         whileFalse: [    
36             tmp := remainder.
37             remainder := num \\ remainder.
38             num := tmp ].
39     ^ num abs!
41 Integer method!
42 isEven
43         ^ self \\ 2 = self zero!
45 Integer method!
46 isOdd
47         ^ self isEven not!
49 "bit-wise operations"
51 Integer method!
52 allMask: anInteger
53     "Answer true if all 1 bits of the receiver are 1 also in the argument"
54     ^ (self bitAnd: anInteger) == anInteger!
56 Integer method!
57 anyMask: anInteger
58     "Answer true if any of the bits that are 1 in the argument are 1 in the receiver"
59     ^(self bitAnd: anInteger) ~~ anInteger!
61 Integer method!
62 noMask: anInteger
63     "Answer true if none of the bits that are 1 in the argument are 1 in the receiver"
64     ^ (self bitAnd: anInteger) == 0!
66 Integer method!
67 bitAnd: aNumber
68     aNumber isInteger
69                 ifFalse: [ self error: 'An integer is required' ].
71     self generality > aNumber generality
72                 ifTrue: [ ^ self bitAnd: (self coerce: aNumber) ]
73                 ifFalse: [ ^ (aNumber coerce: self) bitAnd: aNumber ]!
75 Integer method!
76 bitOr: aNumber
77     aNumber isInteger
78                 ifFalse: [ self error: 'An integer is required' ].
80     self generality > aNumber generality
81                 ifTrue: [ ^ self bitOr: (self coerce: aNumber) ]
82                 ifFalse: [ ^ (aNumber coerce: self) bitOr: aNumber ]!
84 Integer method!
85 bitXor: aNumber
86     aNumber isInteger
87                 ifFalse: [ self error: 'An integer is required' ].
89     self generality > aNumber generality
90                 ifTrue: [ ^ self bitXor: (self coerce: aNumber) ]
91                 ifFalse: [ ^ (aNumber coerce: self) bitXor: aNumber ]!
93 Integer method!
94 bitShift: aNumber
95     aNumber isInteger
96                 ifFalse: [ self error: 'An integer is required' ].
97    
98     ^ self asLargeInteger bitShift: aNumber!
100 Integer method!
101 bitAt: index
102     "Answer the bit 0 or 1 at the given index"
103     ^ (self bitShift: (index - 1) negated) bitAnd: 1!
105 Integer method!
106 bitInvert
107     "Answer an Integer whose bits are inverted"
108     ^ self bitXor: -1!
110 Integer method!
111 << aNumber
112     ^ self bitShift: aNumber!
114 Integer method!
115 >> aNumber
116     ^ self bitShift: aNumber negated!
118 "printing"
120 Integer method!
121 radix: base
122     "Returns a string representing the integer with the given base.
123      The base must be between 2 and 16"
125     | stream num |
127     base isInteger & (base >= 2 ) & (base <= 16)
128                 ifFalse: [ self error: 'Argument must be an integer between 2 and 16' ].
129     self isZero
130                 ifTrue: [ ^ '0' ].
132     stream := WriteStream on: (WideString new: 20).
133     num := self abs.
135     [ num ~= 0 ]
136                 whileTrue: [
137                         | cp |
138                         cp := $0 value + (num \\ base).
139                         cp > $9 value
140                                 ifTrue: [ cp := cp + $A value - $9 value - 1 ].
141                         stream nextPut: (Character characterFor: cp).
142                         num := num // base ].
144     self isNegative
145                 ifTrue: [ stream nextPut: $- ].
147     ^ stream contents reversed!
150 Integer method!
151 printStringRadix: base
152     | stream |
153     stream := WriteStream on: (WideString new: 20).
154     self printOn: stream base: base.
155     ^ stream contents!
157 Integer method!
158 printOn: aStream
159     self storeOn: aStream base: 10!
161 Integer method!
162 storeOn: aStream
163     self storeOn: aStream base: 10!
165 Integer method!
166 printOn: aStream base: base
167     aStream nextPutAll: (self radix: base)!
169 Integer method!
170 storeOn: aStream base: base
171     aStream nextPutAll: (self radix: base)!
174 "rounding"
176 Integer method!
177 ceiling
178     ^ self!
180 Integer method!
181 floor
182     ^ self!
184 Integer method!
185 truncated
186     ^ self!
189 "testing"
191 Integer method!
192 isInteger
193     ^ true!
196 "enumerating"
198 Integer method!
199 timesRepeat: aBlock
200     1 to: self do: [ :ea |
201                                         aBlock value ]!