@@ -87,251 +87,10 @@ case OF_NUMBER_TYPE_DOUBLE: \ return (t)_value.double_; \ default: \ @throw [OFInvalidFormatException exception]; \ } -#define CALCULATE(o, n) \ - switch (_type) { \ - case OF_NUMBER_TYPE_BOOL: \ - return [OFNumber numberWithBool: \ - _value.bool_ o [n boolValue]]; \ - case OF_NUMBER_TYPE_CHAR: \ - return [OFNumber numberWithChar: \ - _value.schar o [n charValue]]; \ - case OF_NUMBER_TYPE_SHORT: \ - return [OFNumber numberWithShort: \ - _value.sshort o [n shortValue]]; \ - case OF_NUMBER_TYPE_INT: \ - return [OFNumber numberWithInt: \ - _value.sint o [n intValue]]; \ - case OF_NUMBER_TYPE_LONG: \ - return [OFNumber numberWithLong: \ - _value.slong o [n longValue]]; \ - case OF_NUMBER_TYPE_LONGLONG: \ - return [OFNumber numberWithLongLong: \ - _value.slonglong o [n longLongValue]]; \ - case OF_NUMBER_TYPE_UCHAR: \ - return [OFNumber numberWithUnsignedChar: \ - _value.uchar o [n unsignedCharValue]]; \ - case OF_NUMBER_TYPE_USHORT: \ - return [OFNumber numberWithUnsignedShort: \ - _value.ushort o [n unsignedShortValue]]; \ - case OF_NUMBER_TYPE_UINT: \ - return [OFNumber numberWithUnsignedInt: \ - _value.uint o [n unsignedIntValue]]; \ - case OF_NUMBER_TYPE_ULONG: \ - return [OFNumber numberWithUnsignedLong: \ - _value.ulong o [n unsignedLongValue]]; \ - case OF_NUMBER_TYPE_ULONGLONG: \ - return [OFNumber numberWithUnsignedLongLong: \ - _value.ulonglong o [n unsignedLongLongValue]]; \ - case OF_NUMBER_TYPE_INT8: \ - return [OFNumber numberWithInt8: \ - _value.int8 o [n int8Value]]; \ - case OF_NUMBER_TYPE_INT16: \ - return [OFNumber numberWithInt16: \ - _value.int16 o [n int16Value]]; \ - case OF_NUMBER_TYPE_INT32: \ - return [OFNumber numberWithInt32: \ - _value.int32 o [n int32Value]]; \ - case OF_NUMBER_TYPE_INT64: \ - return [OFNumber numberWithInt64: \ - _value.int64 o [n int64Value]]; \ - case OF_NUMBER_TYPE_UINT8: \ - return [OFNumber numberWithUInt8: \ - _value.uint8 o [n uInt8Value]]; \ - case OF_NUMBER_TYPE_UINT16: \ - return [OFNumber numberWithUInt16: \ - _value.uint16 o [n uInt16Value]]; \ - case OF_NUMBER_TYPE_UINT32: \ - return [OFNumber numberWithUInt32: \ - _value.uint32 o [n uInt32Value]]; \ - case OF_NUMBER_TYPE_UINT64: \ - return [OFNumber numberWithUInt64: \ - _value.uint64 o [n uInt64Value]]; \ - case OF_NUMBER_TYPE_SIZE: \ - return [OFNumber numberWithSize: \ - _value.size o [n sizeValue]]; \ - case OF_NUMBER_TYPE_SSIZE: \ - return [OFNumber numberWithSSize: \ - _value.ssize o [n sSizeValue]]; \ - case OF_NUMBER_TYPE_INTMAX: \ - return [OFNumber numberWithIntMax: \ - _value.intmax o [n intMaxValue]]; \ - case OF_NUMBER_TYPE_UINTMAX: \ - return [OFNumber numberWithUIntMax: \ - _value.uintmax o [n uIntMaxValue]]; \ - case OF_NUMBER_TYPE_PTRDIFF: \ - return [OFNumber numberWithPtrDiff: \ - _value.ptrdiff o [n ptrDiffValue]]; \ - case OF_NUMBER_TYPE_INTPTR: \ - return [OFNumber numberWithIntPtr: \ - _value.intptr o [n intPtrValue]]; \ - case OF_NUMBER_TYPE_UINTPTR: \ - return [OFNumber numberWithUIntPtr: \ - _value.uintptr o [n uIntPtrValue]]; \ - case OF_NUMBER_TYPE_FLOAT: \ - return [OFNumber numberWithFloat: \ - _value.float_ o [n floatValue]]; \ - case OF_NUMBER_TYPE_DOUBLE: \ - return [OFNumber numberWithDouble: \ - _value.double_ o [n doubleValue]]; \ - default: \ - @throw [OFInvalidFormatException exception]; \ - } -#define CALCULATE2(o, n) \ - switch (_type) { \ - case OF_NUMBER_TYPE_BOOL: \ - return [OFNumber numberWithBool: \ - _value.bool_ o [n boolValue]]; \ - case OF_NUMBER_TYPE_CHAR: \ - return [OFNumber numberWithChar: \ - _value.schar o [n charValue]]; \ - case OF_NUMBER_TYPE_SHORT: \ - return [OFNumber numberWithShort: \ - _value.sshort o [n shortValue]]; \ - case OF_NUMBER_TYPE_INT: \ - return [OFNumber numberWithInt: \ - _value.sint o [n intValue]]; \ - case OF_NUMBER_TYPE_LONG: \ - return [OFNumber numberWithLong: \ - _value.slong o [n longValue]]; \ - case OF_NUMBER_TYPE_LONGLONG: \ - return [OFNumber numberWithLongLong: \ - _value.slonglong o [n longLongValue]]; \ - case OF_NUMBER_TYPE_UCHAR: \ - return [OFNumber numberWithUnsignedChar: \ - _value.uchar o [n unsignedCharValue]]; \ - case OF_NUMBER_TYPE_USHORT: \ - return [OFNumber numberWithUnsignedShort: \ - _value.ushort o [n unsignedShortValue]]; \ - case OF_NUMBER_TYPE_UINT: \ - return [OFNumber numberWithUnsignedInt: \ - _value.uint o [n unsignedIntValue]]; \ - case OF_NUMBER_TYPE_ULONG: \ - return [OFNumber numberWithUnsignedLong: \ - _value.ulong o [n unsignedLongValue]]; \ - case OF_NUMBER_TYPE_ULONGLONG: \ - return [OFNumber numberWithUnsignedLongLong: \ - _value.ulonglong o [n unsignedLongLongValue]]; \ - case OF_NUMBER_TYPE_INT8: \ - return [OFNumber numberWithInt8: \ - _value.int8 o [n int8Value]]; \ - case OF_NUMBER_TYPE_INT16: \ - return [OFNumber numberWithInt16: \ - _value.int16 o [n int16Value]]; \ - case OF_NUMBER_TYPE_INT32: \ - return [OFNumber numberWithInt32: \ - _value.int32 o [n int32Value]]; \ - case OF_NUMBER_TYPE_INT64: \ - return [OFNumber numberWithInt64: \ - _value.int64 o [n int64Value]]; \ - case OF_NUMBER_TYPE_UINT8: \ - return [OFNumber numberWithUInt8: \ - _value.uint8 o [n uInt8Value]]; \ - case OF_NUMBER_TYPE_UINT16: \ - return [OFNumber numberWithUInt16: \ - _value.uint16 o [n uInt16Value]]; \ - case OF_NUMBER_TYPE_UINT32: \ - return [OFNumber numberWithUInt32: \ - _value.uint32 o [n uInt32Value]]; \ - case OF_NUMBER_TYPE_UINT64: \ - return [OFNumber numberWithUInt64: \ - _value.uint64 o [n uInt64Value]]; \ - case OF_NUMBER_TYPE_SIZE: \ - return [OFNumber numberWithSize: \ - _value.size o [n sizeValue]]; \ - case OF_NUMBER_TYPE_SSIZE: \ - return [OFNumber numberWithSSize: \ - _value.ssize o [n sSizeValue]]; \ - case OF_NUMBER_TYPE_INTMAX: \ - return [OFNumber numberWithIntMax: \ - _value.intmax o [n intMaxValue]]; \ - case OF_NUMBER_TYPE_UINTMAX: \ - return [OFNumber numberWithUIntMax: \ - _value.uintmax o [n uIntMaxValue]]; \ - case OF_NUMBER_TYPE_PTRDIFF: \ - return [OFNumber numberWithPtrDiff: \ - _value.ptrdiff o [n ptrDiffValue]]; \ - case OF_NUMBER_TYPE_INTPTR: \ - return [OFNumber numberWithIntPtr: \ - _value.intptr o [n intPtrValue]]; \ - case OF_NUMBER_TYPE_UINTPTR: \ - return [OFNumber numberWithUIntPtr: \ - _value.uintptr o [n uIntPtrValue]]; \ - case OF_NUMBER_TYPE_FLOAT: \ - case OF_NUMBER_TYPE_DOUBLE: \ - @throw [OFInvalidArgumentException exception]; \ - default: \ - @throw [OFInvalidFormatException exception]; \ - } -#define CALCULATE3(o) \ - switch (_type) { \ - case OF_NUMBER_TYPE_BOOL: \ - return [OFNumber numberWithBool: _value.bool_ o]; \ - case OF_NUMBER_TYPE_CHAR: \ - return [OFNumber numberWithChar: _value.schar o]; \ - case OF_NUMBER_TYPE_SHORT: \ - return [OFNumber numberWithShort: _value.sshort o]; \ - case OF_NUMBER_TYPE_INT: \ - return [OFNumber numberWithInt: _value.sint o]; \ - case OF_NUMBER_TYPE_LONG: \ - return [OFNumber numberWithLong: _value.slong o]; \ - case OF_NUMBER_TYPE_LONGLONG: \ - return [OFNumber numberWithLongLong: \ - _value.slonglong o]; \ - case OF_NUMBER_TYPE_UCHAR: \ - return [OFNumber numberWithUnsignedChar: \ - _value.uchar o]; \ - case OF_NUMBER_TYPE_USHORT: \ - return [OFNumber numberWithUnsignedShort: \ - _value.ushort o]; \ - case OF_NUMBER_TYPE_UINT: \ - return [OFNumber numberWithUnsignedInt: _value.uint o]; \ - case OF_NUMBER_TYPE_ULONG: \ - return [OFNumber numberWithUnsignedLong: \ - _value.ulong o]; \ - case OF_NUMBER_TYPE_ULONGLONG: \ - return [OFNumber numberWithUnsignedLongLong: \ - _value.ulonglong o]; \ - case OF_NUMBER_TYPE_INT8: \ - return [OFNumber numberWithInt8: _value.int8 o]; \ - case OF_NUMBER_TYPE_INT16: \ - return [OFNumber numberWithInt16: _value.int16 o]; \ - case OF_NUMBER_TYPE_INT32: \ - return [OFNumber numberWithInt32: _value.int32 o]; \ - case OF_NUMBER_TYPE_INT64: \ - return [OFNumber numberWithInt64: _value.int64 o]; \ - case OF_NUMBER_TYPE_UINT8: \ - return [OFNumber numberWithUInt8: _value.uint8 o]; \ - case OF_NUMBER_TYPE_UINT16: \ - return [OFNumber numberWithUInt16: _value.uint16 o]; \ - case OF_NUMBER_TYPE_UINT32: \ - return [OFNumber numberWithUInt32: _value.uint32 o]; \ - case OF_NUMBER_TYPE_UINT64: \ - return [OFNumber numberWithUInt64: _value.uint64 o]; \ - case OF_NUMBER_TYPE_SIZE: \ - return [OFNumber numberWithSize: _value.size o]; \ - case OF_NUMBER_TYPE_SSIZE: \ - return [OFNumber numberWithSSize: _value.ssize o]; \ - case OF_NUMBER_TYPE_INTMAX: \ - return [OFNumber numberWithIntMax: _value.intmax o]; \ - case OF_NUMBER_TYPE_UINTMAX: \ - return [OFNumber numberWithUIntMax: _value.uintmax o]; \ - case OF_NUMBER_TYPE_PTRDIFF: \ - return [OFNumber numberWithPtrDiff: _value.ptrdiff o]; \ - case OF_NUMBER_TYPE_INTPTR: \ - return [OFNumber numberWithIntPtr: _value.intptr o]; \ - case OF_NUMBER_TYPE_UINTPTR: \ - return [OFNumber numberWithUIntPtr: _value.uintptr o]; \ - case OF_NUMBER_TYPE_FLOAT: \ - return [OFNumber numberWithFloat: _value.float_ o]; \ - case OF_NUMBER_TYPE_DOUBLE: \ - return [OFNumber numberWithDouble: _value.double_ o]; \ - default: \ - @throw [OFInvalidFormatException exception]; \ - } @interface OFNumber (OF_PRIVATE_CATEGORY) - (OFString*)OF_JSONRepresentationWithOptions: (int)options depth: (size_t)depth; @end @@ -1106,157 +865,10 @@ OF_HASH_FINALIZE(hash); return hash; } -- (OFNumber*)numberByAddingNumber: (OFNumber*)num -{ - CALCULATE(+, num) -} - -- (OFNumber*)numberBySubtractingNumber: (OFNumber*)num -{ - CALCULATE(-, num) -} - -- (OFNumber*)numberByMultiplyingWithNumber: (OFNumber*)num -{ - CALCULATE(*, num) -} - -- (OFNumber*)numberByDividingWithNumber: (OFNumber*)num -{ - CALCULATE(/, num) -} - -- (OFNumber*)numberByANDingWithNumber: (OFNumber*)num -{ - CALCULATE2(&, num) -} - -- (OFNumber*)numberByORingWithNumber: (OFNumber*)num -{ - CALCULATE2(|, num) -} - -- (OFNumber*)numberByXORingWithNumber: (OFNumber*)num -{ - CALCULATE2(^, num) -} - -- (OFNumber*)numberByShiftingLeftWithNumber: (OFNumber*)num -{ - CALCULATE2(<<, num) -} - -- (OFNumber*)numberByShiftingRightWithNumber: (OFNumber*)num -{ - CALCULATE2(>>, num) -} - -- (OFNumber*)numberByIncreasing -{ - CALCULATE3(+ 1) -} - -- (OFNumber*)numberByDecreasing -{ - CALCULATE3(- 1) -} - -- (OFNumber*)remainderOfDivisionWithNumber: (OFNumber*)number -{ - switch (_type) { - case OF_NUMBER_TYPE_BOOL: - return [OFNumber numberWithBool: - _value.bool_ % [number boolValue]]; - case OF_NUMBER_TYPE_CHAR: - return [OFNumber numberWithChar: - _value.schar % [number charValue]]; - case OF_NUMBER_TYPE_SHORT: - return [OFNumber numberWithShort: - _value.sshort % [number shortValue]]; - case OF_NUMBER_TYPE_INT: - return [OFNumber numberWithInt: - _value.sint % [number intValue]]; - case OF_NUMBER_TYPE_LONG: - return [OFNumber numberWithLong: - _value.slong % [number longValue]]; - case OF_NUMBER_TYPE_LONGLONG: - return [OFNumber numberWithLongLong: - _value.slonglong % [number longLongValue]]; - case OF_NUMBER_TYPE_UCHAR: - return [OFNumber numberWithUnsignedChar: - _value.uchar % [number unsignedCharValue]]; - case OF_NUMBER_TYPE_USHORT: - return [OFNumber numberWithUnsignedShort: - _value.ushort % [number unsignedShortValue]]; - case OF_NUMBER_TYPE_UINT: - return [OFNumber numberWithUnsignedInt: - _value.uint % [number unsignedIntValue]]; - case OF_NUMBER_TYPE_ULONG: - return [OFNumber numberWithUnsignedLong: - _value.ulong % [number unsignedLongValue]]; - case OF_NUMBER_TYPE_ULONGLONG: - return [OFNumber numberWithUnsignedLongLong: - _value.ulonglong % [number unsignedLongLongValue]]; - case OF_NUMBER_TYPE_INT8: - return [OFNumber numberWithInt8: - _value.int8 % [number int8Value]]; - case OF_NUMBER_TYPE_INT16: - return [OFNumber numberWithInt16: - _value.int16 % [number int16Value]]; - case OF_NUMBER_TYPE_INT32: - return [OFNumber numberWithInt32: - _value.int32 % [number int32Value]]; - case OF_NUMBER_TYPE_INT64: - return [OFNumber numberWithInt64: - _value.int64 % [number int64Value]]; - case OF_NUMBER_TYPE_UINT8: - return [OFNumber numberWithUInt8: - _value.uint8 % [number uInt8Value]]; - case OF_NUMBER_TYPE_UINT16: - return [OFNumber numberWithUInt16: - _value.uint16 % [number uInt16Value]]; - case OF_NUMBER_TYPE_UINT32: - return [OFNumber numberWithUInt32: - _value.uint32 % [number uInt32Value]]; - case OF_NUMBER_TYPE_UINT64: - return [OFNumber numberWithUInt64: - _value.uint64 % [number uInt64Value]]; - case OF_NUMBER_TYPE_SIZE: - return [OFNumber numberWithSize: - _value.size % [number sizeValue]]; - case OF_NUMBER_TYPE_SSIZE: - return [OFNumber numberWithSSize: - _value.ssize % [number sSizeValue]]; - case OF_NUMBER_TYPE_INTMAX: - return [OFNumber numberWithIntMax: - _value.intmax % [number intMaxValue]]; - case OF_NUMBER_TYPE_UINTMAX: - return [OFNumber numberWithUIntMax: - _value.uintmax % [number uIntMaxValue]]; - case OF_NUMBER_TYPE_PTRDIFF: - return [OFNumber numberWithPtrDiff: - _value.ptrdiff % [number ptrDiffValue]]; - case OF_NUMBER_TYPE_INTPTR: - return [OFNumber numberWithIntPtr: - _value.intptr % [number intPtrValue]]; - case OF_NUMBER_TYPE_UINTPTR: - return [OFNumber numberWithUIntPtr: - _value.uintptr % [number uIntPtrValue]]; - case OF_NUMBER_TYPE_FLOAT: - return [OFNumber numberWithFloat: - fmodf(_value.float_, [number floatValue])]; - case OF_NUMBER_TYPE_DOUBLE: - return [OFNumber numberWithDouble: - fmod(_value.double_, [number doubleValue])]; - default: - @throw [OFInvalidFormatException exception]; - } -} - - copy { return [self retain]; }