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 //-------------------------------------------------------------------------------------------------------------------------------------------------------------