/ include / Foundation / NSNumber.hpp
NSNumber.hpp
  1  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
  2  //
  3  // Foundation/NSNumber.hpp
  4  //
  5  // Copyright 2020-2024 Apple Inc.
  6  //
  7  // Licensed under the Apache License, Version 2.0 (the "License");
  8  // you may not use this file except in compliance with the License.
  9  // You may obtain a copy of the License at
 10  //
 11  //     http://www.apache.org/licenses/LICENSE-2.0
 12  //
 13  // Unless required by applicable law or agreed to in writing, software
 14  // distributed under the License is distributed on an "AS IS" BASIS,
 15  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 16  // See the License for the specific language governing permissions and
 17  // limitations under the License.
 18  //
 19  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
 20  
 21  #pragma once
 22  
 23  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
 24  
 25  #include "NSObjCRuntime.hpp"
 26  #include "NSObject.hpp"
 27  #include "NSTypes.hpp"
 28  
 29  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
 30  
 31  namespace NS
 32  {
 33  class Value : public Copying<Value>
 34  {
 35  public:
 36      static Value* value(const void* pValue, const char* pType);
 37      static Value* value(const void* pPointer);
 38  
 39      static Value* alloc();
 40  
 41      Value*        init(const void* pValue, const char* pType);
 42      Value*        init(const class Coder* pCoder);
 43  
 44      void          getValue(void* pValue, UInteger size) const;
 45      const char*   objCType() const;
 46  
 47      bool          isEqualToValue(Value* pValue) const;
 48      void*         pointerValue() const;
 49  };
 50  
 51  class Number : public Copying<Number, Value>
 52  {
 53  public:
 54      static Number*     number(char value);
 55      static Number*     number(unsigned char value);
 56      static Number*     number(short value);
 57      static Number*     number(unsigned short value);
 58      static Number*     number(int value);
 59      static Number*     number(unsigned int value);
 60      static Number*     number(long value);
 61      static Number*     number(unsigned long value);
 62      static Number*     number(long long value);
 63      static Number*     number(unsigned long long value);
 64      static Number*     number(float value);
 65      static Number*     number(double value);
 66      static Number*     number(bool value);
 67  
 68      static Number*     alloc();
 69  
 70      Number*            init(const class Coder* pCoder);
 71      Number*            init(char value);
 72      Number*            init(unsigned char value);
 73      Number*            init(short value);
 74      Number*            init(unsigned short value);
 75      Number*            init(int value);
 76      Number*            init(unsigned int value);
 77      Number*            init(long value);
 78      Number*            init(unsigned long value);
 79      Number*            init(long long value);
 80      Number*            init(unsigned long long value);
 81      Number*            init(float value);
 82      Number*            init(double value);
 83      Number*            init(bool value);
 84  
 85      char               charValue() const;
 86      unsigned char      unsignedCharValue() const;
 87      short              shortValue() const;
 88      unsigned short     unsignedShortValue() const;
 89      int                intValue() const;
 90      unsigned int       unsignedIntValue() const;
 91      long               longValue() const;
 92      unsigned long      unsignedLongValue() const;
 93      long long          longLongValue() const;
 94      unsigned long long unsignedLongLongValue() const;
 95      float              floatValue() const;
 96      double             doubleValue() const;
 97      bool               boolValue() const;
 98      Integer            integerValue() const;
 99      UInteger           unsignedIntegerValue() const;
100      class String*      stringValue() const;
101  
102      ComparisonResult   compare(const Number* pOtherNumber) const;
103      bool               isEqualToNumber(const Number* pNumber) const;
104  
105      class String*      descriptionWithLocale(const Object* pLocale) const;
106  };
107  }
108  
109  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
110  
111  _NS_INLINE NS::Value* NS::Value::value(const void* pValue, const char* pType)
112  {
113      return Object::sendMessage<Value*>(_NS_PRIVATE_CLS(NSValue), _NS_PRIVATE_SEL(valueWithBytes_objCType_), pValue, pType);
114  }
115  
116  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
117  
118  _NS_INLINE NS::Value* NS::Value::value(const void* pPointer)
119  {
120      return Object::sendMessage<Value*>(_NS_PRIVATE_CLS(NSValue), _NS_PRIVATE_SEL(valueWithPointer_), pPointer);
121  }
122  
123  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
124  
125  _NS_INLINE NS::Value* NS::Value::alloc()
126  {
127      return NS::Object::alloc<Value>(_NS_PRIVATE_CLS(NSValue));
128  }
129  
130  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
131  
132  _NS_INLINE NS::Value* NS::Value::init(const void* pValue, const char* pType)
133  {
134      return Object::sendMessage<Value*>(this, _NS_PRIVATE_SEL(initWithBytes_objCType_), pValue, pType);
135  }
136  
137  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
138  
139  _NS_INLINE NS::Value* NS::Value::init(const class Coder* pCoder)
140  {
141      return Object::sendMessage<Value*>(this, _NS_PRIVATE_SEL(initWithCoder_), pCoder);
142  }
143  
144  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
145  
146  _NS_INLINE void NS::Value::getValue(void* pValue, UInteger size) const
147  {
148      Object::sendMessage<void>(this, _NS_PRIVATE_SEL(getValue_size_), pValue, size);
149  }
150  
151  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
152  
153  _NS_INLINE const char* NS::Value::objCType() const
154  {
155      return Object::sendMessage<const char*>(this, _NS_PRIVATE_SEL(objCType));
156  }
157  
158  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
159  
160  _NS_INLINE bool NS::Value::isEqualToValue(Value* pValue) const
161  {
162      return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqualToValue_), pValue);
163  }
164  
165  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
166  
167  _NS_INLINE void* NS::Value::pointerValue() const
168  {
169      return Object::sendMessage<void*>(this, _NS_PRIVATE_SEL(pointerValue));
170  }
171  
172  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
173  
174  _NS_INLINE NS::Number* NS::Number::number(char value)
175  {
176      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithChar_), value);
177  }
178  
179  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
180  
181  _NS_INLINE NS::Number* NS::Number::number(unsigned char value)
182  {
183      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithUnsignedChar_), value);
184  }
185  
186  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
187  
188  _NS_INLINE NS::Number* NS::Number::number(short value)
189  {
190      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithShort_), value);
191  }
192  
193  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
194  
195  _NS_INLINE NS::Number* NS::Number::number(unsigned short value)
196  {
197      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithUnsignedShort_), value);
198  }
199  
200  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
201  
202  _NS_INLINE NS::Number* NS::Number::number(int value)
203  {
204      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithInt_), value);
205  }
206  
207  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
208  
209  _NS_INLINE NS::Number* NS::Number::number(unsigned int value)
210  {
211      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithUnsignedInt_), value);
212  }
213  
214  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
215  
216  _NS_INLINE NS::Number* NS::Number::number(long value)
217  {
218      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithLong_), value);
219  }
220  
221  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
222  
223  _NS_INLINE NS::Number* NS::Number::number(unsigned long value)
224  {
225      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithUnsignedLong_), value);
226  }
227  
228  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
229  
230  _NS_INLINE NS::Number* NS::Number::number(long long value)
231  {
232      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithLongLong_), value);
233  }
234  
235  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
236  
237  _NS_INLINE NS::Number* NS::Number::number(unsigned long long value)
238  {
239      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithUnsignedLongLong_), value);
240  }
241  
242  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
243  
244  _NS_INLINE NS::Number* NS::Number::number(float value)
245  {
246      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithFloat_), value);
247  }
248  
249  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
250  
251  _NS_INLINE NS::Number* NS::Number::number(double value)
252  {
253      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithDouble_), value);
254  }
255  
256  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
257  
258  _NS_INLINE NS::Number* NS::Number::number(bool value)
259  {
260      return Object::sendMessage<Number*>(_NS_PRIVATE_CLS(NSNumber), _NS_PRIVATE_SEL(numberWithBool_), value);
261  }
262  
263  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
264  
265  _NS_INLINE NS::Number* NS::Number::alloc()
266  {
267      return NS::Object::alloc<Number>(_NS_PRIVATE_CLS(NSNumber));
268  }
269  
270  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
271  
272  _NS_INLINE NS::Number* NS::Number::init(const Coder* pCoder)
273  {
274      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithCoder_), pCoder);
275  }
276  
277  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
278  
279  _NS_INLINE NS::Number* NS::Number::init(char value)
280  {
281      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithChar_), value);
282  }
283  
284  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
285  
286  _NS_INLINE NS::Number* NS::Number::init(unsigned char value)
287  {
288      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedChar_), value);
289  }
290  
291  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
292  
293  _NS_INLINE NS::Number* NS::Number::init(short value)
294  {
295      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithShort_), value);
296  }
297  
298  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
299  
300  _NS_INLINE NS::Number* NS::Number::init(unsigned short value)
301  {
302      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedShort_), value);
303  }
304  
305  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
306  
307  _NS_INLINE NS::Number* NS::Number::init(int value)
308  {
309      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithInt_), value);
310  }
311  
312  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
313  
314  _NS_INLINE NS::Number* NS::Number::init(unsigned int value)
315  {
316      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedInt_), value);
317  }
318  
319  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
320  
321  _NS_INLINE NS::Number* NS::Number::init(long value)
322  {
323      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithLong_), value);
324  }
325  
326  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
327  
328  _NS_INLINE NS::Number* NS::Number::init(unsigned long value)
329  {
330      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedLong_), value);
331  }
332  
333  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
334  
335  _NS_INLINE NS::Number* NS::Number::init(long long value)
336  {
337      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithLongLong_), value);
338  }
339  
340  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
341  
342  _NS_INLINE NS::Number* NS::Number::init(unsigned long long value)
343  {
344      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedLongLong_), value);
345  }
346  
347  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
348  
349  _NS_INLINE NS::Number* NS::Number::init(float value)
350  {
351      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithFloat_), value);
352  }
353  
354  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
355  
356  _NS_INLINE NS::Number* NS::Number::init(double value)
357  {
358      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithDouble_), value);
359  }
360  
361  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
362  
363  _NS_INLINE NS::Number* NS::Number::init(bool value)
364  {
365      return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithBool_), value);
366  }
367  
368  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
369  
370  _NS_INLINE char NS::Number::charValue() const
371  {
372      return Object::sendMessage<char>(this, _NS_PRIVATE_SEL(charValue));
373  }
374  
375  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
376  
377  _NS_INLINE unsigned char NS::Number::unsignedCharValue() const
378  {
379      return Object::sendMessage<unsigned char>(this, _NS_PRIVATE_SEL(unsignedCharValue));
380  }
381  
382  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
383  
384  _NS_INLINE short NS::Number::shortValue() const
385  {
386      return Object::sendMessage<short>(this, _NS_PRIVATE_SEL(shortValue));
387  }
388  
389  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
390  
391  _NS_INLINE unsigned short NS::Number::unsignedShortValue() const
392  {
393      return Object::sendMessage<unsigned short>(this, _NS_PRIVATE_SEL(unsignedShortValue));
394  }
395  
396  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
397  
398  _NS_INLINE int NS::Number::intValue() const
399  {
400      return Object::sendMessage<int>(this, _NS_PRIVATE_SEL(intValue));
401  }
402  
403  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
404  
405  _NS_INLINE unsigned int NS::Number::unsignedIntValue() const
406  {
407      return Object::sendMessage<unsigned int>(this, _NS_PRIVATE_SEL(unsignedIntValue));
408  }
409  
410  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
411  
412  _NS_INLINE long NS::Number::longValue() const
413  {
414      return Object::sendMessage<long>(this, _NS_PRIVATE_SEL(longValue));
415  }
416  
417  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
418  
419  _NS_INLINE unsigned long NS::Number::unsignedLongValue() const
420  {
421      return Object::sendMessage<unsigned long>(this, _NS_PRIVATE_SEL(unsignedLongValue));
422  }
423  
424  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
425  
426  _NS_INLINE long long NS::Number::longLongValue() const
427  {
428      return Object::sendMessage<long long>(this, _NS_PRIVATE_SEL(longLongValue));
429  }
430  
431  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
432  
433  _NS_INLINE unsigned long long NS::Number::unsignedLongLongValue() const
434  {
435      return Object::sendMessage<unsigned long long>(this, _NS_PRIVATE_SEL(unsignedLongLongValue));
436  }
437  
438  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
439  
440  _NS_INLINE float NS::Number::floatValue() const
441  {
442      return Object::sendMessage<float>(this, _NS_PRIVATE_SEL(floatValue));
443  }
444  
445  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
446  
447  _NS_INLINE double NS::Number::doubleValue() const
448  {
449      return Object::sendMessage<double>(this, _NS_PRIVATE_SEL(doubleValue));
450  }
451  
452  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
453  
454  _NS_INLINE bool NS::Number::boolValue() const
455  {
456      return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(boolValue));
457  }
458  
459  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
460  
461  _NS_INLINE NS::Integer NS::Number::integerValue() const
462  {
463      return Object::sendMessage<Integer>(this, _NS_PRIVATE_SEL(integerValue));
464  }
465  
466  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
467  
468  _NS_INLINE NS::UInteger NS::Number::unsignedIntegerValue() const
469  {
470      return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(unsignedIntegerValue));
471  }
472  
473  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
474  
475  _NS_INLINE NS::String* NS::Number::stringValue() const
476  {
477      return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(stringValue));
478  }
479  
480  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
481  
482  _NS_INLINE NS::ComparisonResult NS::Number::compare(const Number* pOtherNumber) const
483  {
484      return Object::sendMessage<ComparisonResult>(this, _NS_PRIVATE_SEL(compare_), pOtherNumber);
485  }
486  
487  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
488  
489  _NS_INLINE bool NS::Number::isEqualToNumber(const Number* pNumber) const
490  {
491      return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqualToNumber_), pNumber);
492  }
493  
494  //-------------------------------------------------------------------------------------------------------------------------------------------------------------
495  
496  _NS_INLINE NS::String* NS::Number::descriptionWithLocale(const Object* pLocale) const
497  {
498      return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(descriptionWithLocale_), pLocale);
499  }
500  
501  //-------------------------------------------------------------------------------------------------------------------------------------------------------------