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