Fixed lots of compiler bugs. Added more primitives. Reworked interpreter
[panda.git] / st / Integer.st
blob9e36b99ccf6b476b0f4ce66458a06168fe809fda
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!
42 "bit-wise operations"
44 Integer method!
45 allMask: anInteger
46     "Answer true if all 1 bits of the receiver are 1 also in the argument"
47     ^ (self bitAnd: anInteger) == anInteger!
49 Integer method!
50 anyMask: anInteger
51     "Answer true if any of the bits that are 1 in the argument are 1 in the receiver"
52     ^(self bitAnd: anInteger) ~~ anInteger!
54 Integer method!
55 noMask: anInteger
56     "Answer true if none of the bits that are 1 in the argument are 1 in the receiver"
57     ^ (self bitAnd: anInteger) == 0!
59 Integer method!
60 bitAnd: aNumber
61     aNumber isInteger
62                 ifFalse: [ self error: 'An integer is required' ].
64     self generality > aNumber generality
65                 ifTrue: [ ^ self bitAnd: (self coerce: aNumber) ]
66                 ifFalse: [ ^ (aNumber coerce: self) bitAnd: aNumber ]!
68 Integer method!
69 bitOr: aNumber
70     aNumber isInteger
71                 ifFalse: [ self error: 'An integer is required' ].
73     self generality > aNumber generality
74                 ifTrue: [ ^ self bitOr: (self coerce: aNumber) ]
75                 ifFalse: [ ^ (aNumber coerce: self) bitOr: aNumber ]!
77 Integer method!
78 bitXor: aNumber
79     aNumber isInteger
80                 ifFalse: [ self error: 'An integer is required' ].
82     self generality > aNumber generality
83                 ifTrue: [ ^ self bitXor: (self coerce: aNumber) ]
84                 ifFalse: [ ^ (aNumber coerce: self) bitXor: aNumber ]!
86 Integer method!
87 bitShift: aNumber
88     aNumber isSmallInteger
89                 ifFalse: [ self error: 'A small integer is required' ].
90    
91     ^ self asLargeInteger bitShift: aNumber!
93 Integer method!
94 bitAt: index
95     "Answer the bit 0 or 1 at the given index"
96     ^ (self bitShift: (index - 1) negated) bitAnd: 1!
98 Integer method!
99 bitInvert
100     "Answer an Integer whose bits are inverted"
101     ^ self bitXor: -1!
103 Integer method!
104 << aNumber
105     ^ self bitShift: aNumber!
107 Integer method!
108 >> aNumber
109     ^ self bitShift: aNumber negated!
111 "printing"
113 Integer method!
114 radix: base
115     "Returns a string representing the integer with the given base.
116      The base must be between 2 and 16"
118     | stream num |
120     base isInteger & (base >= 2 ) & (base <= 16)
121                 ifFalse: [ self error: 'Argument must be an integer between 2 and 16' ].
122     self isZero
123                 ifTrue: [ ^ '0' ].
125     stream := StringStream new.
126     num := self abs.
128     [ num ~= 0 ]
129                 whileTrue: [
130                         | cp |
131                         cp := $0 value + (num \\ base).
132                         cp > $9 value
133                                 ifTrue: [ cp := cp + $A value - $9 value - 1 ].
134                         stream nextPut: (Character new: cp).
135                         num := num // base ].
137     self isNegative
138                 ifTrue: [ stream nextPut: $- ].
140     ^ stream contents reversed!
143 Integer method!
144 printStringRadix: base
145     | stream |
146     stream := StringStream new.
147     self printOn: stream base: base.
148     ^ stream contents!
150 Integer method!
151 printOn: aStream
152     self storeOn: aStream base: 10!
154 Integer method!
155 storeOn: aStream
156     self storeOn: aStream base: 10!
158 Integer method!
159 printOn: aStream base: base
160     aStream nextPutAll: (self radix: base)!
162 Integer method!
163 storeOn: aStream base: base
164     aStream nextPutAll: (self radix: base)!
166 "rounding"
168 Integer method!
169 ceiling
170     ^ self!
172 Integer method!
173 floor
174     ^ self!
176 Integer method!
177 truncated
178     ^ self!
181 "testing"
183 Integer method!
184 isInteger
185     ^ true!
188 "enumerating"
190 Integer method!
191 timesRepeat: aBlock
192     1 to: self do: [ :ea |
193                                         aBlock value ]!