/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018, 2019, 2020 * Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #include "objfw-defs.h" #ifdef OF_HAVE_SYS_TYPES_H # include <sys/types.h> #endif #import "OFJSONRepresentation.h" #import "OFMessagePackRepresentation.h" #import "OFSerialization.h" #import "OFValue.h" OF_ASSUME_NONNULL_BEGIN /*! @file */ /*! * @brief The C type of a number stored in an OFNumber. */ typedef enum { /*! `bool` */ OF_NUMBER_TYPE_BOOL = 0x01, /*! `unsigned char` */ OF_NUMBER_TYPE_UCHAR = 0x02, /*! `unsigned short` */ OF_NUMBER_TYPE_USHORT = 0x03, /*! `unsigned int` */ OF_NUMBER_TYPE_UINT = 0x04, /*! `unsigned long` */ OF_NUMBER_TYPE_ULONG = 0x05, /*! `unsigned long long` */ OF_NUMBER_TYPE_ULONGLONG = 0x06, /*! `size_t` */ OF_NUMBER_TYPE_SIZE = 0x07, /*! `uint8_t` */ OF_NUMBER_TYPE_UINT8 = 0x08, /*! `uint16_t` */ OF_NUMBER_TYPE_UINT16 = 0x09, /*! `uint32_t` */ OF_NUMBER_TYPE_UINT32 = 0x0A, /*! `uint64_t` */ OF_NUMBER_TYPE_UINT64 = 0x0B, /*! `uintptr_t` */ OF_NUMBER_TYPE_UINTPTR = 0x0C, /*! `uintmax_t` */ OF_NUMBER_TYPE_UINTMAX = 0x0D, OF_NUMBER_TYPE_SIGNED = 0x10, /*! `signed char` */ OF_NUMBER_TYPE_CHAR = OF_NUMBER_TYPE_UCHAR | OF_NUMBER_TYPE_SIGNED, /*! `signed short` */ OF_NUMBER_TYPE_SHORT = OF_NUMBER_TYPE_USHORT | OF_NUMBER_TYPE_SIGNED, /*! `signed int` */ OF_NUMBER_TYPE_INT = OF_NUMBER_TYPE_UINT | OF_NUMBER_TYPE_SIGNED, /*! `signed long` */ OF_NUMBER_TYPE_LONG = OF_NUMBER_TYPE_ULONG | OF_NUMBER_TYPE_SIGNED, /*! `signed long long` */ OF_NUMBER_TYPE_LONGLONG = OF_NUMBER_TYPE_ULONGLONG | OF_NUMBER_TYPE_SIGNED, /*! `int8_t` */ OF_NUMBER_TYPE_INT8 = OF_NUMBER_TYPE_UINT8 | OF_NUMBER_TYPE_SIGNED, /*! `int16_t` */ OF_NUMBER_TYPE_INT16 = OF_NUMBER_TYPE_UINT16 | OF_NUMBER_TYPE_SIGNED, /*! `int32_t` */ OF_NUMBER_TYPE_INT32 = OF_NUMBER_TYPE_UINT32 | OF_NUMBER_TYPE_SIGNED, /*! `int64_t` */ OF_NUMBER_TYPE_INT64 = OF_NUMBER_TYPE_UINT64 | OF_NUMBER_TYPE_SIGNED, /*! `ssize_t` */ OF_NUMBER_TYPE_SSIZE = OF_NUMBER_TYPE_SIZE | OF_NUMBER_TYPE_SIGNED, /*! `intmax_t` */ OF_NUMBER_TYPE_INTMAX = OF_NUMBER_TYPE_UINTMAX | OF_NUMBER_TYPE_SIGNED, /*! `ptrdiff_t` */ OF_NUMBER_TYPE_PTRDIFF = 0x0E | OF_NUMBER_TYPE_SIGNED, /*! `intptr_t` */ OF_NUMBER_TYPE_INTPTR = 0x0F | OF_NUMBER_TYPE_SIGNED, /*! `float` */ OF_NUMBER_TYPE_FLOAT = 0x20, /*! `double` */ OF_NUMBER_TYPE_DOUBLE = 0x40 | OF_NUMBER_TYPE_FLOAT } of_number_type_t; /*! * @class OFNumber OFNumber.h ObjFW/OFNumber.h * * @brief Provides a way to store a number in an object. */ OF_SUBCLASSING_RESTRICTED @interface OFNumber: OFValue <OFComparing, OFSerialization, OFJSONRepresentation, OFMessagePackRepresentation> { union of_number_value { bool bool_; signed char sChar; signed short sShort; signed int sInt; signed long sLong; signed long long sLongLong; unsigned char uChar; unsigned short uShort; unsigned int uInt; unsigned long uLong; unsigned long long uLongLong; int8_t int8; int16_t int16; int32_t int32; int64_t int64; uint8_t uInt8; uint16_t uInt16; uint32_t uInt32; uint64_t uInt64; size_t size; ssize_t sSize; intmax_t intMax; uintmax_t uIntMax; ptrdiff_t ptrDiff; intptr_t intPtr; uintptr_t uIntPtr; float float_; double double_; } _value; of_number_type_t _type; } /*! * @brief The type of the number. */ @property (readonly, nonatomic) of_number_type_t type; /*! * @brief The OFNumber as a `bool`. */ @property (readonly, nonatomic) bool boolValue; /*! * @brief The OFNumber as a `signed char`. */ @property (readonly, nonatomic) signed char charValue; /*! * @brief The OFNumber as a `signed short`. */ @property (readonly, nonatomic) signed short shortValue; /*! * @brief The OFNumber as a `signed int`. */ @property (readonly, nonatomic) signed int intValue; /*! * @brief The OFNumber as a `signed long`. */ @property (readonly, nonatomic) signed long longValue; /*! * @brief The OFNumber as a `signed long long`. */ @property (readonly, nonatomic) signed long long longLongValue; /*! * @brief The OFNumber as an `unsigned char`. */ @property (readonly, nonatomic) unsigned char unsignedCharValue; /*! * @brief The OFNumber as an `unsigned short`. */ @property (readonly, nonatomic) unsigned short unsignedShortValue; /*! * @brief The OFNumber as an `unsigned int`. */ @property (readonly, nonatomic) unsigned int unsignedIntValue; /*! * @brief The OFNumber as an `unsigned long`. */ @property (readonly, nonatomic) unsigned long unsignedLongValue; /*! * @brief The OFNumber as an `unsigned long long`. */ @property (readonly, nonatomic) unsigned long long unsignedLongLongValue; /*! * @brief The OFNumber as an `int8_t`. */ @property (readonly, nonatomic) int8_t int8Value; /*! * @brief The OFNumber as an `int16_t`. */ @property (readonly, nonatomic) int16_t int16Value; /*! * @brief The OFNumber as an `int32_t`. */ @property (readonly, nonatomic) int32_t int32Value; /*! * @brief The OFNumber as an `int64_t`. */ @property (readonly, nonatomic) int64_t int64Value; /*! * @brief The OFNumber as a `uint8_t`. */ @property (readonly, nonatomic) uint8_t uInt8Value; /*! * @brief The OFNumber as a `uint16_t`. */ @property (readonly, nonatomic) uint16_t uInt16Value; /*! * @brief The OFNumber as a `uint32_t`. */ @property (readonly, nonatomic) uint32_t uInt32Value; /*! * @brief The OFNumber as a `uint64_t`. */ @property (readonly, nonatomic) uint64_t uInt64Value; /*! * @brief The OFNumber as a `size_t`. */ @property (readonly, nonatomic) size_t sizeValue; /*! * @brief The OFNumber as an `ssize_t`. */ @property (readonly, nonatomic) ssize_t sSizeValue; /*! * @brief The OFNumber as an `intmax_t`. */ @property (readonly, nonatomic) intmax_t intMaxValue; /*! * @brief The OFNumber as a `uintmax_t`. */ @property (readonly, nonatomic) uintmax_t uIntMaxValue; /*! * @brief The OFNumber as a `ptrdiff_t`. */ @property (readonly, nonatomic) ptrdiff_t ptrDiffValue; /*! * @brief The OFNumber as an `intptr_t`. */ @property (readonly, nonatomic) intptr_t intPtrValue; /*! * @brief The OFNumber as a `uintptr_t`. */ @property (readonly, nonatomic) uintptr_t uIntPtrValue; /*! * @brief The OFNumber as a `float`. */ @property (readonly, nonatomic) float floatValue; /*! * @brief The OFNumber as a `double`. */ @property (readonly, nonatomic) double doubleValue; /*! * @brief The OFNumber as a string. */ @property (readonly, nonatomic) OFString *stringValue; #ifdef OF_HAVE_UNAVAILABLE + (instancetype)valueWithBytes: (const void *)bytes objCType: (const char *)objCType OF_UNAVAILABLE; + (instancetype)valueWithPointer: (const void *)pointer OF_UNAVAILABLE; + (instancetype)valueWithNonretainedObject: (id)object OF_UNAVAILABLE; + (instancetype)valueWithRange: (of_range_t)range OF_UNAVAILABLE; + (instancetype)valueWithPoint: (of_point_t)point OF_UNAVAILABLE; + (instancetype)valueWithDimension: (of_dimension_t)dimension OF_UNAVAILABLE; + (instancetype)valueWithRectangle: (of_rectangle_t)rectangle OF_UNAVAILABLE; #endif /*! * @brief Creates a new OFNumber with the specified `bool`. * * @param bool_ A `bool` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithBool: (bool)bool_; /*! * @brief Creates a new OFNumber with the specified `signed char`. * * @param sChar A `signed char` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithChar: (signed char)sChar; /*! * @brief Creates a new OFNumber with the specified `signed short`. * * @param sShort A `signed short` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithShort: (signed short)sShort; /*! * @brief Creates a new OFNumber with the specified `signed int`. * * @param sInt A `signed int` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithInt: (signed int)sInt; /*! * @brief Creates a new OFNumber with the specified `signed long`. * * @param sLong A `signed long` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithLong: (signed long)sLong; /*! * @brief Creates a new OFNumber with the specified `signed long long`. * * @param sLongLong A `signed long long` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithLongLong: (signed long long)sLongLong; /*! * @brief Creates a new OFNumber with the specified `unsigned char`. * * @param uChar An `unsigned char` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUnsignedChar: (unsigned char)uChar; /*! * @brief Creates a new OFNumber with the specified `unsigned short`. * * @param uShort An `unsigned short` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUnsignedShort: (unsigned short)uShort; /*! * @brief Creates a new OFNumber with the specified `unsigned int`. * * @param uInt An `unsigned int` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUnsignedInt: (unsigned int)uInt; /*! * @brief Creates a new OFNumber with the specified `unsigned long`. * * @param uLong An `unsigned long` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUnsignedLong: (unsigned long)uLong; /*! * @brief Creates a new OFNumber with the specified `unsigned long long`. * * @param uLongLong An `unsigned long long` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUnsignedLongLong: (unsigned long long)uLongLong; /*! * @brief Creates a new OFNumber with the specified `int8_t`. * * @param int8 An `int8_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithInt8: (int8_t)int8; /*! * @brief Creates a new OFNumber with the specified `int16_t`. * * @param int16 An `int16_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithInt16: (int16_t)int16; /*! * @brief Creates a new OFNumber with the specified `int32_t`. * * @param int32 An `int32_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithInt32: (int32_t)int32; /*! * @brief Creates a new OFNumber with the specified `int64_t`. * * @param int64 An `int64_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithInt64: (int64_t)int64; /*! * @brief Creates a new OFNumber with the specified `uint8_t`. * * @param uInt8 A `uint8_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUInt8: (uint8_t)uInt8; /*! * @brief Creates a new OFNumber with the specified `uint16_t`. * * @param uInt16 A `uint16_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUInt16: (uint16_t)uInt16; /*! * @brief Creates a new OFNumber with the specified `uint32_t`. * * @param uInt32 A `uint32_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUInt32: (uint32_t)uInt32; /*! * @brief Creates a new OFNumber with the specified `uint64_t`. * * @param uInt64 A `uint64_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUInt64: (uint64_t)uInt64; /*! * @brief Creates a new OFNumber with the specified `size_t`. * * @param size A `size_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithSize: (size_t)size; /*! * @brief Creates a new OFNumber with the specified `ssize_t`. * * @param sSize An `ssize_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithSSize: (ssize_t)sSize; /*! * @brief Creates a new OFNumber with the specified `intmax_t`. * * @param intMax An `intmax_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithIntMax: (intmax_t)intMax; /*! * @brief Creates a new OFNumber with the specified `uintmax_t`. * * @param uIntMax A `uintmax_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUIntMax: (uintmax_t)uIntMax; /*! * @brief Creates a new OFNumber with the specified `ptrdiff_t`. * * @param ptrDiff A `ptrdiff_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithPtrDiff: (ptrdiff_t)ptrDiff; /*! * @brief Creates a new OFNumber with the specified `intptr_t`. * * @param intPtr An `intptr_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithIntPtr: (intptr_t)intPtr; /*! * @brief Creates a new OFNumber with the specified `uintptr_t`. * * @param uIntPtr A `uintptr_t` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithUIntPtr: (uintptr_t)uIntPtr; /*! * @brief Creates a new OFNumber with the specified `float`. * * @param float_ A `float` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithFloat: (float)float_; /*! * @brief Creates a new OFNumber with the specified `double`. * * @param double_ A `double` which the OFNumber should contain * @return A new autoreleased OFNumber */ + (instancetype)numberWithDouble: (double)double_; - (instancetype)init OF_UNAVAILABLE; #ifdef OF_HAVE_UNAVAILABLE - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType OF_UNAVAILABLE; - (instancetype)initWithPointer: (const void *)pointer OF_UNAVAILABLE; - (instancetype)initWithNonretainedObject: (id)object OF_UNAVAILABLE; - (instancetype)initWithRange: (of_range_t)range OF_UNAVAILABLE; - (instancetype)initWithPoint: (of_point_t)point OF_UNAVAILABLE; - (instancetype)initWithDimension: (of_dimension_t)dimension OF_UNAVAILABLE; - (instancetype)initWithRectangle: (of_rectangle_t)rectangle OF_UNAVAILABLE; #endif /*! * @brief Initializes an already allocated OFNumber with the specified `bool`. * * @param bool_ A `bool` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithBool: (bool)bool_; /*! * @brief Initializes an already allocated OFNumber with the specified * `signed char`. * * @param sChar A `signed char` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithChar: (signed char)sChar; /*! * @brief Initializes an already allocated OFNumber with the specified * `signed short`. * * @param sShort A `signed short` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithShort: (signed short)sShort; /*! * @brief Initializes an already allocated OFNumber with the specified * `signed int`. * * @param sInt A `signed int` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithInt: (signed int)sInt; /*! * @brief Initializes an already allocated OFNumber with the specified * `signed long`. * * @param sLong A `signed long` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithLong: (signed long)sLong; /*! * @brief Initializes an already allocated OFNumber with the specified * `signed long long`. * * @param sLongLong A `signed long long` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithLongLong: (signed long long)sLongLong; /*! * @brief Initializes an already allocated OFNumber with the specified * `unsigned char`. * * @param uChar An `unsigned char` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUnsignedChar: (unsigned char)uChar; /*! * @brief Initializes an already allocated OFNumber with the specified * `unsigned short`. * * @param uShort An `unsigned short` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUnsignedShort: (unsigned short)uShort; /*! * @brief Initializes an already allocated OFNumber with the specified * `unsigned int`. * * @param uInt An `unsigned int` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUnsignedInt: (unsigned int)uInt; /*! * @brief Initializes an already allocated OFNumber with the specified * `unsigned long`. * * @param uLong An `unsigned long` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUnsignedLong: (unsigned long)uLong; /*! * @brief Initializes an already allocated OFNumber with the specified * `unsigned long long`. * * @param uLongLong An `unsigned long long` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUnsignedLongLong: (unsigned long long)uLongLong; /*! * @brief Initializes an already allocated OFNumber with the specified `int8_t`. * * @param int8 An `int8_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithInt8: (int8_t)int8; /*! * @brief Initializes an already allocated OFNumber with the specified * `int16_t`. * * @param int16 An `int16_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithInt16: (int16_t)int16; /*! * @brief Initializes an already allocated OFNumber with the specified * `int32_t`. * * @param int32 An `int32_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithInt32: (int32_t)int32; /*! * @brief Initializes an already allocated OFNumber with the specified * `int64_t`. * * @param int64 An `int64_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithInt64: (int64_t)int64; /*! * @brief Initializes an already allocated OFNumber with the specified * `uint8_t`. * * @param uInt8 A `uint8_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUInt8: (uint8_t)uInt8; /*! * @brief Initializes an already allocated OFNumber with the specified * `uint16_t`. * * @param uInt16 A `uint16_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUInt16: (uint16_t)uInt16; /*! * @brief Initializes an already allocated OFNumber with the specified * `uint32_t`. * * @param uInt32 A `uint32_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUInt32: (uint32_t)uInt32; /*! * @brief Initializes an already allocated OFNumber with the specified * `uint64_t`. * * @param uInt64 A `uint64_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUInt64: (uint64_t)uInt64; /*! * @brief Initializes an already allocated OFNumber with the specified `size_t`. * * @param size A `size_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithSize: (size_t)size; /*! * @brief Initializes an already allocated OFNumber with the specified * `ssize_t`. * * @param sSize An `ssize_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithSSize: (ssize_t)sSize; /*! * @brief Initializes an already allocated OFNumber with the specified * `intmax_t`. * * @param intMax An `intmax_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithIntMax: (intmax_t)intMax; /*! * @brief Initializes an already allocated OFNumber with the specified * `uintmax_t`. * * @param uIntMax A `uintmax_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUIntMax: (uintmax_t)uIntMax; /*! * @brief Initializes an already allocated OFNumber with the specified * `ptrdiff_t`. * * @param ptrDiff A `ptrdiff_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithPtrDiff: (ptrdiff_t)ptrDiff; /*! * @brief Initializes an already allocated OFNumber with the specified * `intptr_t`. * * @param intPtr An `intptr_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithIntPtr: (intptr_t)intPtr; /*! * @brief Initializes an already allocated OFNumber with the specified * `uintptr_t`. * * @param uIntPtr A `uintptr_t` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithUIntPtr: (uintptr_t)uIntPtr; /*! * @brief Initializes an already allocated OFNumber with the specified `float`. * * @param float_ A `float` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithFloat: (float)float_; /*! * @brief Initializes an already allocated OFNumber with the specified `double`. * * @param double_ A `double` which the OFNumber should contain * @return An initialized OFNumber */ - (instancetype)initWithDouble: (double)double_; @end OF_ASSUME_NONNULL_END #if !defined(NSINTEGER_DEFINED) && !__has_feature(modules) /* Required for number literals to work */ @compatibility_alias NSNumber OFNumber; #endif