ObjFW  Diff

Differences From Artifact [b2aed0c6f3]:

To Artifact [8668a7987f]:


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

119

120
121
122
123
124

125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146


147
148
149
150
151
152
153
154
155







156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172

173
174

175
176
177

178
179

180
181
182

183
184

185
186
187

188
189

190
191
192
193
194
195
196
33
34
35
36
37
38
39
40










































































41
42
43
44
45
46
47
48
49
50
51

52






















53
54





55



56
57
58
59
60
61
62




63
64
65
66
67
68
69
70
71
72
73
74

75
76

77
78
79

80
81

82
83
84

85
86

87
88
89

90
91

92
93
94
95
96
97
98
99








-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-




+

+




-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-

-
-
-
+
+
+
+
+
+
+
-
-
-
-












-
+

-
+


-
+

-
+


-
+

-
+


-
+

-
+







#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.
 */
#ifndef OF_NUMBER_M
OF_SUBCLASSING_RESTRICTED
#endif
@interface OFNumber: OFValue <OFComparing, OFSerialization,
    OFJSONRepresentation, OFMessagePackRepresentation>
{
	union of_number_value {
		bool		   bool_;
		double    float_;
		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;
		intmax_t  signed_;
		uintmax_t unsigned_;
		ptrdiff_t	   ptrDiff;
		intptr_t	   intPtr;
		uintptr_t	   uIntPtr;
		float		   float_;
		double		   double_;
	} _value;
	of_number_type_t _type;
}

	enum of_number_type {
		OF_NUMBER_TYPE_FLOAT = 1,
		OF_NUMBER_TYPE_SIGNED,
		OF_NUMBER_TYPE_UNSIGNED
	} _type;
	const char *_typeEncoding;
}
/*!
 * @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`.
 * @brief The OFNumber as a `short`.
 */
@property (readonly, nonatomic) signed short shortValue;
@property (readonly, nonatomic) short shortValue;

/*!
 * @brief The OFNumber as a `signed int`.
 * @brief The OFNumber as an `int`.
 */
@property (readonly, nonatomic) signed int intValue;
@property (readonly, nonatomic) int intValue;

/*!
 * @brief The OFNumber as a `signed long`.
 * @brief The OFNumber as a `long`.
 */
@property (readonly, nonatomic) signed long longValue;
@property (readonly, nonatomic) long longValue;

/*!
 * @brief The OFNumber as a `signed long long`.
 * @brief The OFNumber as a `long long`.
 */
@property (readonly, nonatomic) signed long long longLongValue;
@property (readonly, nonatomic) long long longLongValue;

/*!
 * @brief The OFNumber as an `unsigned char`.
 */
@property (readonly, nonatomic) unsigned char unsignedCharValue;

/*!
327
328
329
330
331
332
333
334

335
336

337
338
339

340
341
342

343
344

345
346
347

348
349
350

351
352

353
354
355

356
357
358

359
360

361
362
363

364
365
366
367
368
369
370
230
231
232
233
234
235
236

237
238

239
240
241

242
243
244

245
246

247
248
249

250
251
252

253
254

255
256
257

258
259
260

261
262

263
264
265

266
267
268
269
270
271
272
273







-
+

-
+


-
+


-
+

-
+


-
+


-
+

-
+


-
+


-
+

-
+


-
+







 *
 * @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`.
 * @brief Creates a new OFNumber with the specified `short`.
 *
 * @param sShort A `signed short` which the OFNumber should contain
 * @param sShort A `short` which the OFNumber should contain
 * @return A new autoreleased OFNumber
 */
+ (instancetype)numberWithShort: (signed short)sShort;
+ (instancetype)numberWithShort: (short)sShort;

/*!
 * @brief Creates a new OFNumber with the specified `signed int`.
 * @brief Creates a new OFNumber with the specified `int`.
 *
 * @param sInt A `signed int` which the OFNumber should contain
 * @param sInt An `int` which the OFNumber should contain
 * @return A new autoreleased OFNumber
 */
+ (instancetype)numberWithInt: (signed int)sInt;
+ (instancetype)numberWithInt: (int)sInt;

/*!
 * @brief Creates a new OFNumber with the specified `signed long`.
 * @brief Creates a new OFNumber with the specified `long`.
 *
 * @param sLong A `signed long` which the OFNumber should contain
 * @param sLong A `long` which the OFNumber should contain
 * @return A new autoreleased OFNumber
 */
+ (instancetype)numberWithLong: (signed long)sLong;
+ (instancetype)numberWithLong: (long)sLong;

/*!
 * @brief Creates a new OFNumber with the specified `signed long long`.
 * @brief Creates a new OFNumber with the specified `long long`.
 *
 * @param sLongLong A `signed long long` which the OFNumber should contain
 * @param sLongLong A `long long` which the OFNumber should contain
 * @return A new autoreleased OFNumber
 */
+ (instancetype)numberWithLongLong: (signed long long)sLongLong;
+ (instancetype)numberWithLongLong: (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
 */
564
565
566
567
568
569
570
571

572
573
574

575
576
577

578
579
580

581
582
583

584
585
586

587
588
589

590
591
592

593
594
595

596
597
598
599

600
601

602
603
604

605
606
607
608
609
610
611
467
468
469
470
471
472
473

474

475

476
477
478

479
480
481

482

483

484
485
486

487
488
489

490

491

492
493
494

495
496
497
498

499
500

501
502
503

504
505
506
507
508
509
510
511







-
+
-

-
+


-
+


-
+
-

-
+


-
+


-
+
-

-
+


-
+



-
+

-
+


-
+







 *
 * @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
 * @brief Initializes an already allocated OFNumber with the specified `short`.
 *	  `signed short`.
 *
 * @param sShort A `signed short` which the OFNumber should contain
 * @param sShort A `short` which the OFNumber should contain
 * @return An initialized OFNumber
 */
- (instancetype)initWithShort: (signed short)sShort;
- (instancetype)initWithShort: (short)sShort;

/*!
 * @brief Initializes an already allocated OFNumber with the specified
 * @brief Initializes an already allocated OFNumber with the specified `int`.
 *	  `signed int`.
 *
 * @param sInt A `signed int` which the OFNumber should contain
 * @param sInt An `int` which the OFNumber should contain
 * @return An initialized OFNumber
 */
- (instancetype)initWithInt: (signed int)sInt;
- (instancetype)initWithInt: (int)sInt;

/*!
 * @brief Initializes an already allocated OFNumber with the specified
 * @brief Initializes an already allocated OFNumber with the specified `long`.
 *	  `signed long`.
 *
 * @param sLong A `signed long` which the OFNumber should contain
 * @param sLong A `long` which the OFNumber should contain
 * @return An initialized OFNumber
 */
- (instancetype)initWithLong: (signed long)sLong;
- (instancetype)initWithLong: (long)sLong;

/*!
 * @brief Initializes an already allocated OFNumber with the specified
 *	  `signed long long`.
 *	  `long long`.
 *
 * @param sLongLong A `signed long long` which the OFNumber should contain
 * @param sLongLong A `long long` which the OFNumber should contain
 * @return An initialized OFNumber
 */
- (instancetype)initWithLongLong: (signed long long)sLongLong;
- (instancetype)initWithLongLong: (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