1 
2 //metadoc Number copyright Steve Dekorte 2002
3 //metadoc Number license BSD revised
4 
5 #ifndef IONUMBER_DEFINED
6 #define IONUMBER_DEFINED 1
7 
8 #include <math.h>
9 #define _GNU_SOURCE // for NAN macro, round
10 #include <sys/types.h>
11 
12 #include "IoVMApi.h"
13 
14 #include "Common.h"
15 #include "IoState.h"
16 #include "IoObject.h"
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /* NAN! x86 hardware happens to set the sign bit for all those 0/0 divisions.
23  * So 0/0, -0/0, 0/-0, -0/-0 all give -NaN.
24  */
25 #if defined(USE_BUILTIN_NAN) || !defined(NAN)
26 static union { unsigned long long __c; double __d; } __nan_union = { 0x7ff8000000000000 };
27 #undef NAN
28 #define NAN (__nan_union.__d)
29 #endif
30 
31 #if !defined(isnan) && defined(_MSC_VER)
32 #define isnan _isnan
33 #endif
34 
35 #define ISNUMBER(self) IoObject_hasCloneFunc_(self, (IoTagCloneFunc *)IoNumber_rawClone)
36 #define IONUMBER(num) IoState_numberWithDouble_((IoState*)IOSTATE, (double)num)
37 #define CNUMBER(self) IoObject_dataDouble((IoNumber *)self)
38 
39 #if defined WIN32 && !defined __MINGW32__
40 #define log2(num) log(num) / log(2)
41 #endif
42 
43 typedef IoObject IoNumber;
44 
45 IOVM_API IoNumber *IoNumber_proto(void *state);
46 IOVM_API IoNumber *IoNumber_rawClone(IoNumber *self);
47 IOVM_API IoNumber *IoNumber_newWithDouble_(void *state, double n);
48 IOVM_API IoNumber *IoNumber_newCopyOf_(IoNumber *number);
49 IOVM_API void IoNumber_copyFrom_(IoNumber *self, IoNumber *number);
50 
51 //IOVM_API void IoNumber_writeToStream_(IoNumber *self, BStream *stream);
52 //IOVM_API void *IoNumber_readFromStream_(IoNumber *self, BStream *stream);
53 
54 IOVM_API void IoNumber_free(IoNumber *self);
55 
56 IOVM_API UArray IoNumber_asStackUArray(IoNumber *self);
57 IOVM_API int IoNumber_asInt(IoNumber *self);
58 IOVM_API long IoNumber_asLong(IoNumber *self);
59 IOVM_API double IoNumber_asDouble(IoNumber *self);
60 IOVM_API float IoNumber_asFloat(IoNumber *self);
61 IOVM_API int IoNumber_compare(IoNumber *self, IoNumber *v);
62 IOVM_API void IoNumber_print(IoNumber *self);
63 //void IoNumber_rawSet(IoNumber *self, double v);
64 #define IoNumber_rawSet(self, v) CNUMBER(self) = v;
65 
66 // -----------------------------------------------------------
67 
68 IOVM_API IO_METHOD(IoNumber, htonl);
69 IOVM_API IO_METHOD(IoNumber, ntohl);
70 
71 IOVM_API IO_METHOD(IoNumber, asNumber);
72 IOVM_API IO_METHOD(IoNumber, add_);
73 IOVM_API IO_METHOD(IoNumber, subtract);
74 IOVM_API IO_METHOD(IoNumber, divide);
75 IOVM_API IO_METHOD(IoNumber, multiply);
76 IOVM_API IO_METHOD(IoNumber, printNumber);
77 
78 IOVM_API IO_METHOD(IoNumber, asBuffer);
79 IOVM_API IO_METHOD(IoNumber, asString);
80 IOVM_API IO_METHOD(IoNumber, justAsString);
81 IOVM_API IO_METHOD(IoNumber, asCharacter);
82 IOVM_API IO_METHOD(IoNumber, asUint32Buffer);
83 //IO_METHOD(IoNumber, asDate);
84 
85 // no arg methods
86 
87 IOVM_API IO_METHOD(IoNumber, abs);
88 IOVM_API IO_METHOD(IoNumber, acos);
89 IOVM_API IO_METHOD(IoNumber, asin);
90 IOVM_API IO_METHOD(IoNumber, atan);
91 IOVM_API IO_METHOD(IoNumber, atan2);
92 IOVM_API IO_METHOD(IoNumber, ceil);
93 IOVM_API IO_METHOD(IoNumber, cos);
94 IOVM_API IO_METHOD(IoNumber, deg);
95 IOVM_API IO_METHOD(IoNumber, exp);
96 IOVM_API IO_METHOD(IoNumber, factorial);
97 IOVM_API IO_METHOD(IoNumber, floor);
98 IOVM_API IO_METHOD(IoNumber, log);
99 IOVM_API IO_METHOD(IoNumber, log2);
100 IOVM_API IO_METHOD(IoNumber, log10);
101 IOVM_API IO_METHOD(IoNumber, max);
102 IOVM_API IO_METHOD(IoNumber, min);
103 IOVM_API IO_METHOD(IoNumber, mod);
104 
105 //IO_METHOD(IoNumber, mod);
106 //IO_METHOD(IoNumber, rad);
107 
108 IOVM_API IO_METHOD(IoNumber, pow);
109 
110 IOVM_API IO_METHOD(IoNumber, round);
111 IOVM_API IO_METHOD(IoNumber, roundDown);
112 
113 IOVM_API IO_METHOD(IoNumber, sin);
114 IOVM_API IO_METHOD(IoNumber, sqrt);
115 
116 IOVM_API IO_METHOD(IoNumber, squared);
117 IOVM_API IO_METHOD(IoNumber, cubed);
118 
119 IOVM_API IO_METHOD(IoNumber, tan);
120 
121 //IO_METHOD(IoNumber, frexp);
122 //IO_METHOD(IoNumber, ldexp);
123 
124 IOVM_API IO_METHOD(IoNumber, random);
125 IOVM_API IO_METHOD(IoNumber, gaussianRandom);
126 IOVM_API IO_METHOD(IoNumber, randomseed);
127 IOVM_API IO_METHOD(IoNumber, toggle);
128 
129 // bitwise operations
130 
131 IOVM_API IO_METHOD(IoNumber, newBitwiseAnd);
132 IOVM_API IO_METHOD(IoNumber, newBitwiseOr);
133 
134 IOVM_API IO_METHOD(IoNumber, bitwiseAnd);
135 IOVM_API IO_METHOD(IoNumber, bitwiseOr);
136 IOVM_API IO_METHOD(IoNumber, bitwiseXor);
137 IOVM_API IO_METHOD(IoNumber, bitwiseComplement);
138 IOVM_API IO_METHOD(IoNumber, bitShiftLeft);
139 IOVM_API IO_METHOD(IoNumber, bitShiftRight);
140 
141 // even and odd
142 
143 IOVM_API IO_METHOD(IoNumber, isEven);
144 IOVM_API IO_METHOD(IoNumber, isOdd);
145 
146 // character operations
147 
148 IOVM_API IO_METHOD(IoNumber, isAlphaNumeric);
149 IOVM_API IO_METHOD(IoNumber, isLetter);
150 IOVM_API IO_METHOD(IoNumber, isControlCharacter);
151 IOVM_API IO_METHOD(IoNumber, isDigit);
152 IOVM_API IO_METHOD(IoNumber, isGraph);
153 IOVM_API IO_METHOD(IoNumber, isLowercase);
154 IOVM_API IO_METHOD(IoNumber, isUppercase);
155 IOVM_API IO_METHOD(IoNumber, isPrint);
156 IOVM_API IO_METHOD(IoNumber, isPunctuation);
157 IOVM_API IO_METHOD(IoNumber, isSpace);
158 IOVM_API IO_METHOD(IoNumber, isHexDigit);
159 
160 IOVM_API IO_METHOD(IoNumber, asLowercase);
161 IOVM_API IO_METHOD(IoNumber, asUppercase);
162 
163 IOVM_API IO_METHOD(IoNumber, between);
164 IOVM_API IO_METHOD(IoNumber, clip);
165 IOVM_API IO_METHOD(IoNumber, negate);
166 IOVM_API IO_METHOD(IoNumber, at);
167 
168 // limits
169 
170 IOVM_API IO_METHOD(IoNumber, integerMax);
171 IOVM_API IO_METHOD(IoNumber, integerMin);
172 IOVM_API IO_METHOD(IoNumber, longMax);
173 IOVM_API IO_METHOD(IoNumber, longMin);
174 IOVM_API IO_METHOD(IoNumber, shortMax);
175 IOVM_API IO_METHOD(IoNumber, shortMin);
176 IOVM_API IO_METHOD(IoNumber, unsignedLongMax);
177 IOVM_API IO_METHOD(IoNumber, unsignedIntMax);
178 IOVM_API IO_METHOD(IoNumber, floatMax);
179 IOVM_API IO_METHOD(IoNumber, floatMin);
180 IOVM_API IO_METHOD(IoNumber, isNan);
181 
182 // looping
183 
184 IOVM_API IO_METHOD(IoNumber, repeat);
185 
186 #ifdef __cplusplus
187 }
188 #endif
189 #endif
190