Index: src/OFNumber.h ================================================================== --- src/OFNumber.h +++ src/OFNumber.h @@ -29,36 +29,37 @@ /** * \brief The type of a number. */ typedef enum of_number_type_t { - OF_NUMBER_BOOL, - OF_NUMBER_CHAR, - OF_NUMBER_SHORT, - OF_NUMBER_INT, - OF_NUMBER_LONG, - OF_NUMBER_UCHAR, - OF_NUMBER_USHORT, - OF_NUMBER_UINT, - OF_NUMBER_ULONG, - OF_NUMBER_INT8, - OF_NUMBER_INT16, - OF_NUMBER_INT32, - OF_NUMBER_INT64, - OF_NUMBER_UINT8, - OF_NUMBER_UINT16, - OF_NUMBER_UINT32, - OF_NUMBER_UINT64, - OF_NUMBER_SIZE, - OF_NUMBER_SSIZE, - OF_NUMBER_INTMAX, - OF_NUMBER_UINTMAX, - OF_NUMBER_PTRDIFF, - OF_NUMBER_INTPTR, - OF_NUMBER_UINTPTR, - OF_NUMBER_FLOAT, - OF_NUMBER_DOUBLE, + OF_NUMBER_BOOL = 0x01, + OF_NUMBER_UCHAR = 0x02, + OF_NUMBER_USHORT = 0x03, + OF_NUMBER_UINT = 0x04, + OF_NUMBER_ULONG = 0x05, + OF_NUMBER_SIZE = 0x06, + OF_NUMBER_UINT8 = 0x07, + OF_NUMBER_UINT16 = 0x08, + OF_NUMBER_UINT32 = 0x09, + OF_NUMBER_UINT64 = 0x0A, + OF_NUMBER_UINTPTR = 0x0B, + OF_NUMBER_UINTMAX = 0x0C, + OF_NUMBER_SIGNED = 0x10, + OF_NUMBER_CHAR = OF_NUMBER_UCHAR | OF_NUMBER_SIGNED, + OF_NUMBER_SHORT = OF_NUMBER_USHORT | OF_NUMBER_SIGNED, + OF_NUMBER_INT = OF_NUMBER_UINT | OF_NUMBER_SIGNED, + OF_NUMBER_LONG = OF_NUMBER_ULONG | OF_NUMBER_SIGNED, + OF_NUMBER_INT8 = OF_NUMBER_UINT8 | OF_NUMBER_SIGNED, + OF_NUMBER_INT16 = OF_NUMBER_UINT16 | OF_NUMBER_SIGNED, + OF_NUMBER_INT32 = OF_NUMBER_UINT32 | OF_NUMBER_SIGNED, + OF_NUMBER_INT64 = OF_NUMBER_UINT64 | OF_NUMBER_SIGNED, + OF_NUMBER_SSIZE = OF_NUMBER_SIZE | OF_NUMBER_SIGNED, + OF_NUMBER_INTMAX = OF_NUMBER_UINTMAX | OF_NUMBER_SIGNED, + OF_NUMBER_PTRDIFF = 0x0D | OF_NUMBER_SIGNED, + OF_NUMBER_INTPTR = 0x0E | OF_NUMBER_SIGNED, + OF_NUMBER_FLOAT = 0x20, + OF_NUMBER_DOUBLE = 0x40 | OF_NUMBER_FLOAT, } of_number_type_t; /** * \brief Provides a way to store a number in an object. */ Index: src/OFNumber.m ================================================================== --- src/OFNumber.m +++ src/OFNumber.m @@ -927,43 +927,17 @@ if (![object isKindOfClass: [OFNumber class]]) return NO; number = object; - switch (type) { - case OF_NUMBER_BOOL: - case OF_NUMBER_CHAR: - case OF_NUMBER_SHORT: - case OF_NUMBER_INT: - case OF_NUMBER_LONG: - case OF_NUMBER_INT8: - case OF_NUMBER_INT16: - case OF_NUMBER_INT32: - case OF_NUMBER_INT64: - case OF_NUMBER_INTMAX: - case OF_NUMBER_PTRDIFF: + if (type & OF_NUMBER_FLOAT || number->type & OF_NUMBER_FLOAT) + return ([number doubleValue] == [self doubleValue]); + + if (type & OF_NUMBER_SIGNED || number->type & OF_NUMBER_SIGNED) return ([number intMaxValue] == [self intMaxValue]); - case OF_NUMBER_SSIZE: - case OF_NUMBER_UCHAR: - case OF_NUMBER_USHORT: - case OF_NUMBER_UINT: - case OF_NUMBER_ULONG: - case OF_NUMBER_UINT8: - case OF_NUMBER_UINT16: - case OF_NUMBER_UINT32: - case OF_NUMBER_UINT64: - case OF_NUMBER_SIZE: - case OF_NUMBER_UINTMAX: - case OF_NUMBER_INTPTR: - case OF_NUMBER_UINTPTR: - return ([number uIntMaxValue] == [self uIntMaxValue]); - case OF_NUMBER_FLOAT: - case OF_NUMBER_DOUBLE: - return ([number doubleValue] == [self doubleValue]); - default: - return NO; - } + + return ([number uIntMaxValue] == [self uIntMaxValue]); } - (uint32_t)hash { uint32_t hash;