/*
* Copyright (c) 2008, 2009, 2010, 2011
* Jonathan Schleifer <js@webkeks.org>
*
* 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.
*/
#include <unistd.h>
#import "OFObject.h"
#import "OFSerialization.h"
/**
* \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_type_t;
/**
* \brief Provides a way to store a number in an object.
*/
@interface OFNumber: OFObject <OFCopying, OFSerialization>
{
union of_number_value {
BOOL bool_;
signed char char_;
signed short short_;
signed int int_;
signed long long_;
unsigned char uchar;
unsigned short ushort;
unsigned int uint;
unsigned long ulong;
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 Creates a new OFNumber with the specified BOOL.
*
* \param bool_ A BOOL which the OFNumber should contain
* \return A new autoreleased OFNumber
*/
+ numberWithBool: (BOOL)bool_;
/**
* \brief Creates a new OFNumber with the specified signed char.
*
* \param char_ A signed char which the OFNumber should contain
* \return A new autoreleased OFNumber
*/
+ numberWithChar: (signed char)char_;
/**
* \brief Creates a new OFNumber with the specified signed short.
*
* \param short_ A signed short which the OFNumber should contain
* \return A new autoreleased OFNumber
*/
+ numberWithShort: (signed short)short_;
/**
* \brief Creates a new OFNumber with the specified signed int.
*
* \param int_ A signed int which the OFNumber should contain
* \return A new autoreleased OFNumber
*/
+ numberWithInt: (signed int)int_;
/**
* \brief Creates a new OFNumber with the specified signed long.
*
* \param long_ A signed long which the OFNumber should contain
* \return A new autoreleased OFNumber
*/
+ numberWithLong: (signed long)long_;
/**
* \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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ numberWithUnsignedLong: (unsigned long)ulong;
/**
* \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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ 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
*/
+ numberWithDouble: (double)double_;
/**
* \brief Initializes an already allocated OFNumber with the specified BOOL.
*
* \param bool_ A BOOL which the OFNumber should contain
* \return An initialized OFNumber
*/
- initWithBool: (BOOL)bool_;
/**
* \brief Initializes an already allocated OFNumber with the specified signed
* char.
*
* \param char_ A signed char which the OFNumber should contain
* \return An initialized OFNumber
*/
- initWithChar: (signed char)char_;
/**
* \brief Initializes an already allocated OFNumber with the specified signed
* short.
*
* \param short_ A signed short which the OFNumber should contain
* \return An initialized OFNumber
*/
- initWithShort: (signed short)short_;
/**
* \brief Initializes an already allocated OFNumber with the specified signed
* int.
*
* \param int_ A signed int which the OFNumber should contain
* \return An initialized OFNumber
*/
- initWithInt: (signed int)int_;
/**
* \brief Initializes an already allocated OFNumber with the specified signed
* long.
*
* \param long_ A signed long which the OFNumber should contain
* \return An initialized OFNumber
*/
- initWithLong: (signed long)long_;
/**
* \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
*/
- 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
*/
- 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
*/
- 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
*/
- initWithUnsignedLong: (unsigned long)ulong;
/**
* \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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- 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
*/
- initWithDouble: (double)double_;
/**
* \brief Returns the type of the number.
*
* \return An of_number_type_t indicating the type of the number
*/
- (of_number_type_t)type;
/**
* \brief Returns the OFNumber as a BOOL.
*
* \return The OFNumber as a BOOL
*/
- (BOOL)boolValue;
/**
* \brief Returns the OFNumber as a signed char.
*
* \return The OFNumber as a signed char
*/
- (signed char)charValue;
/**
* \brief Returns the OFNumber as a signed short.
*
* \return The OFNumber as a short
*/
- (signed short)shortValue;
/**
* \brief Returns the OFNumber as a signed int.
*
* \return The OFNumber as an int
*/
- (signed int)intValue;
/**
* \brief Returns the OFNumber as a signed long.
*
* \return The OFNumber as a long
*/
- (signed long)longValue;
/**
* \brief Returns the OFNumber as an unsigned char.
*
* \return The OFNumber as an unsigned char
*/
- (unsigned char)unsignedCharValue;
/**
* \brief Returns the OFNumber as an unsigned short.
*
* \return The OFNumber as an unsigned short
*/
- (unsigned short)unsignedShortValue;
/**
* \brief Returns the OFNumber as an unsigned int.
*
* \return The OFNumber as an unsigned int
*/
- (unsigned int)unsignedIntValue;
/**
* \brief Returns the OFNumber as an unsigned long.
*
* \return The OFNumber as an unsigned long
*/
- (unsigned long)unsignedLongValue;
/**
* \brief Returns the OFNumber as an int8_t.
*
* \return The OFNumber as an int8_t
*/
- (int8_t)int8Value;
/**
* \brief Returns the OFNumber as an int16_t.
*
* \return The OFNumber as an int16_t
*/
- (int16_t)int16Value;
/**
* \brief Returns the OFNumber as an int32_t.
*
* \return The OFNumber as an int32_t
*/
- (int32_t)int32Value;
/**
* \brief Returns the OFNumber as an int64_t.
*
* \return The OFNumber as an int64_t
*/
- (int64_t)int64Value;
/**
* \brief Returns the OFNumber as a uint8_t.
*
* \return The OFNumber as a uint8_t
*/
- (uint8_t)uInt8Value;
/**
* \brief Returns the OFNumber as a uint16_t.
*
* \return The OFNumber as a uint16_t
*/
- (uint16_t)uInt16Value;
/**
* \brief Returns the OFNumber as a uint32_t.
*
* \return The OFNumber as a uint32_t
*/
- (uint32_t)uInt32Value;
/**
* \brief Returns the OFNumber as a uint64_t.
*
* \return The OFNumber as a uint64_t
*/
- (uint64_t)uInt64Value;
/**
* \brief Returns the OFNumber as a size_t.
*
* \return The OFNumber as a size_t
*/
- (size_t)sizeValue;
/**
* \brief Returns the OFNumber as an ssize_t.
*
* \return The OFNumber as an ssize_t
*/
- (ssize_t)sSizeValue;
/**
* \brief Returns the OFNumber as an intmax_t.
*
* \return The OFNumber as an intmax_t
*/
- (intmax_t)intMaxValue;
/**
* \brief Returns the OFNumber as a uintmax_t.
*
* \return The OFNumber as a uintmax_t
*/
- (uintmax_t)uIntMaxValue;
/**
* \brief Returns the OFNumber as a ptrdiff_t.
*
* \return The OFNumber as a ptrdiff_t
*/
- (ptrdiff_t)ptrDiffValue;
/**
* \brief Returns the OFNumber as an intptr_t.
*
* \return The OFNumber as an intptr_t
*/
- (intptr_t)intPtrValue;
/**
* \brief Returns the OFNumber as a uintptr_t.
*
* \return The OFNumber as a uintptr_t
*/
- (uintptr_t)uIntPtrValue;
/**
* \brief Returns the OFNumber as a float.
*
* \return The OFNumber as a float
*/
- (float)floatValue;
/**
* \brief Returns the OFNumber as a double.
*
* \return The OFNumber as a double
*/
- (double)doubleValue;
/**
* \brief Creates a new OFNumber by adding the specified number.
*
* \param num The OFNumber to add
* \return A new autoreleased OFNumber added with the specified OFNumber
*/
- (OFNumber*)numberByAddingNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by subtracting the specified number.
*
* \param num The OFNumber to substract
* \return A new autoreleased OFNumber subtracted by the specified OFNumber
*/
- (OFNumber*)numberBySubtractingNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by multiplying with the specified number.
*
* \param num The OFNumber to multiply with
* \return A new autoreleased OFNumber multiplied with the specified OFNumber
*/
- (OFNumber*)numberByMultiplyingWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by dividing with with the specified number.
*
* \param num The OFNumber to divide by
* \return A new autoreleased OFNumber devided by the specified OFNumber
*/
- (OFNumber*)numberByDividingWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by ANDing with the specified number.
*
* Does not work with floating point types!
*
* \param num The number to AND with.
* \return A new autoreleased OFNumber ANDed with the specified OFNumber
*/
- (OFNumber*)numberByANDingWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by ORing with the specified number.
*
* Does not work with floating point types!
*
* \param num The number to OR with.
* \return A new autoreleased OFNumber ORed with the specified OFNumber
*/
- (OFNumber*)numberByORingWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by XORing with the specified number.
*
* Does not work with floating point types!
*
* \param num The number to XOR with.
* \return A new autoreleased OFNumber XORed with the specified OFNumber
*/
- (OFNumber*)numberByXORingWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by shifting to the left by the specified number
* of bits.
*
* Does not work with floating point types!
*
* \param num The number of bits to shift to the left
* \return A new autoreleased OFNumber bitshifted to the left with the
* specified OFNumber
*/
- (OFNumber*)numberByShiftingLeftWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by shifting to the right by the specified
* number of bits.
*
* Does not work with floating point types!
*
* \param num The number of bits to shift to the right
* \return A new autoreleased OFNumber bitshifted to the right with the
* specified OFNumber
*/
- (OFNumber*)numberByShiftingRightWithNumber: (OFNumber*)num;
/**
* \brief Creates a new OFNumber by with the same value increased by one.
*
* \return A new autoreleased OFNumber with the value increased by one.
*/
- (OFNumber*)numberByIncreasing;
/**
* \brief Creates a new OFNumber by with the same value decreased by one.
*
* \return A new autoreleased OFNumber with the value decreased by one.
*/
- (OFNumber*)numberByDecreasing;
/**
* \brief Creates a new OFNumber with the remainder of a division with the
* specified number.
*
* \param num The number to divide by
* \return The remainder of a division by the specified number
*/
- (OFNumber*)remainderOfDivisionWithNumber: (OFNumber*)num;
@end