spb/forge Public MIT
Forge — LLM training from scratch in pure C++20 + Metal on Apple Silicon.
C++ 61.2%
C 23%
Python 7.6%
TeX 7.2%
CMake 1.1%
1//-------------------------------------------------------------------------------------------------------------------------------------------------------------2//3// Foundation/NSNumber.hpp4//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 at10//11// http://www.apache.org/licenses/LICENSE-2.012//13// Unless required by applicable law or agreed to in writing, software14// 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 and17// limitations under the License.18//19//-------------------------------------------------------------------------------------------------------------------------------------------------------------2021#pragma once2223//-------------------------------------------------------------------------------------------------------------------------------------------------------------2425#include "NSObjCRuntime.hpp"26#include "NSObject.hpp"27#include "NSTypes.hpp"2829//-------------------------------------------------------------------------------------------------------------------------------------------------------------3031namespace NS32{33class Value : public Copying<Value>34{35public:36 static Value* value(const void* pValue, const char* pType);37 static Value* value(const void* pPointer);3839 static Value* alloc();4041 Value* init(const void* pValue, const char* pType);42 Value* init(const class Coder* pCoder);4344 void getValue(void* pValue, UInteger size) const;45 const char* objCType() const;4647 bool isEqualToValue(Value* pValue) const;48 void* pointerValue() const;49};5051class Number : public Copying<Number, Value>52{53public: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);6768 static Number* alloc();6970 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);8485 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;101102 ComparisonResult compare(const Number* pOtherNumber) const;103 bool isEqualToNumber(const Number* pNumber) const;104105 class String* descriptionWithLocale(const Object* pLocale) const;106};107}108109//-------------------------------------------------------------------------------------------------------------------------------------------------------------110111_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}115116//-------------------------------------------------------------------------------------------------------------------------------------------------------------117118_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}122123//-------------------------------------------------------------------------------------------------------------------------------------------------------------124125_NS_INLINE NS::Value* NS::Value::alloc()126{127 return NS::Object::alloc<Value>(_NS_PRIVATE_CLS(NSValue));128}129130//-------------------------------------------------------------------------------------------------------------------------------------------------------------131132_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}136137//-------------------------------------------------------------------------------------------------------------------------------------------------------------138139_NS_INLINE NS::Value* NS::Value::init(const class Coder* pCoder)140{141 return Object::sendMessage<Value*>(this, _NS_PRIVATE_SEL(initWithCoder_), pCoder);142}143144//-------------------------------------------------------------------------------------------------------------------------------------------------------------145146_NS_INLINE void NS::Value::getValue(void* pValue, UInteger size) const147{148 Object::sendMessage<void>(this, _NS_PRIVATE_SEL(getValue_size_), pValue, size);149}150151//-------------------------------------------------------------------------------------------------------------------------------------------------------------152153_NS_INLINE const char* NS::Value::objCType() const154{155 return Object::sendMessage<const char*>(this, _NS_PRIVATE_SEL(objCType));156}157158//-------------------------------------------------------------------------------------------------------------------------------------------------------------159160_NS_INLINE bool NS::Value::isEqualToValue(Value* pValue) const161{162 return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqualToValue_), pValue);163}164165//-------------------------------------------------------------------------------------------------------------------------------------------------------------166167_NS_INLINE void* NS::Value::pointerValue() const168{169 return Object::sendMessage<void*>(this, _NS_PRIVATE_SEL(pointerValue));170}171172//-------------------------------------------------------------------------------------------------------------------------------------------------------------173174_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}178179//-------------------------------------------------------------------------------------------------------------------------------------------------------------180181_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}185186//-------------------------------------------------------------------------------------------------------------------------------------------------------------187188_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}192193//-------------------------------------------------------------------------------------------------------------------------------------------------------------194195_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}199200//-------------------------------------------------------------------------------------------------------------------------------------------------------------201202_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}206207//-------------------------------------------------------------------------------------------------------------------------------------------------------------208209_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}213214//-------------------------------------------------------------------------------------------------------------------------------------------------------------215216_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}220221//-------------------------------------------------------------------------------------------------------------------------------------------------------------222223_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}227228//-------------------------------------------------------------------------------------------------------------------------------------------------------------229230_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}234235//-------------------------------------------------------------------------------------------------------------------------------------------------------------236237_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}241242//-------------------------------------------------------------------------------------------------------------------------------------------------------------243244_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}248249//-------------------------------------------------------------------------------------------------------------------------------------------------------------250251_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}255256//-------------------------------------------------------------------------------------------------------------------------------------------------------------257258_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}262263//-------------------------------------------------------------------------------------------------------------------------------------------------------------264265_NS_INLINE NS::Number* NS::Number::alloc()266{267 return NS::Object::alloc<Number>(_NS_PRIVATE_CLS(NSNumber));268}269270//-------------------------------------------------------------------------------------------------------------------------------------------------------------271272_NS_INLINE NS::Number* NS::Number::init(const Coder* pCoder)273{274 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithCoder_), pCoder);275}276277//-------------------------------------------------------------------------------------------------------------------------------------------------------------278279_NS_INLINE NS::Number* NS::Number::init(char value)280{281 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithChar_), value);282}283284//-------------------------------------------------------------------------------------------------------------------------------------------------------------285286_NS_INLINE NS::Number* NS::Number::init(unsigned char value)287{288 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedChar_), value);289}290291//-------------------------------------------------------------------------------------------------------------------------------------------------------------292293_NS_INLINE NS::Number* NS::Number::init(short value)294{295 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithShort_), value);296}297298//-------------------------------------------------------------------------------------------------------------------------------------------------------------299300_NS_INLINE NS::Number* NS::Number::init(unsigned short value)301{302 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedShort_), value);303}304305//-------------------------------------------------------------------------------------------------------------------------------------------------------------306307_NS_INLINE NS::Number* NS::Number::init(int value)308{309 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithInt_), value);310}311312//-------------------------------------------------------------------------------------------------------------------------------------------------------------313314_NS_INLINE NS::Number* NS::Number::init(unsigned int value)315{316 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedInt_), value);317}318319//-------------------------------------------------------------------------------------------------------------------------------------------------------------320321_NS_INLINE NS::Number* NS::Number::init(long value)322{323 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithLong_), value);324}325326//-------------------------------------------------------------------------------------------------------------------------------------------------------------327328_NS_INLINE NS::Number* NS::Number::init(unsigned long value)329{330 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedLong_), value);331}332333//-------------------------------------------------------------------------------------------------------------------------------------------------------------334335_NS_INLINE NS::Number* NS::Number::init(long long value)336{337 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithLongLong_), value);338}339340//-------------------------------------------------------------------------------------------------------------------------------------------------------------341342_NS_INLINE NS::Number* NS::Number::init(unsigned long long value)343{344 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithUnsignedLongLong_), value);345}346347//-------------------------------------------------------------------------------------------------------------------------------------------------------------348349_NS_INLINE NS::Number* NS::Number::init(float value)350{351 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithFloat_), value);352}353354//-------------------------------------------------------------------------------------------------------------------------------------------------------------355356_NS_INLINE NS::Number* NS::Number::init(double value)357{358 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithDouble_), value);359}360361//-------------------------------------------------------------------------------------------------------------------------------------------------------------362363_NS_INLINE NS::Number* NS::Number::init(bool value)364{365 return Object::sendMessage<Number*>(this, _NS_PRIVATE_SEL(initWithBool_), value);366}367368//-------------------------------------------------------------------------------------------------------------------------------------------------------------369370_NS_INLINE char NS::Number::charValue() const371{372 return Object::sendMessage<char>(this, _NS_PRIVATE_SEL(charValue));373}374375//-------------------------------------------------------------------------------------------------------------------------------------------------------------376377_NS_INLINE unsigned char NS::Number::unsignedCharValue() const378{379 return Object::sendMessage<unsigned char>(this, _NS_PRIVATE_SEL(unsignedCharValue));380}381382//-------------------------------------------------------------------------------------------------------------------------------------------------------------383384_NS_INLINE short NS::Number::shortValue() const385{386 return Object::sendMessage<short>(this, _NS_PRIVATE_SEL(shortValue));387}388389//-------------------------------------------------------------------------------------------------------------------------------------------------------------390391_NS_INLINE unsigned short NS::Number::unsignedShortValue() const392{393 return Object::sendMessage<unsigned short>(this, _NS_PRIVATE_SEL(unsignedShortValue));394}395396//-------------------------------------------------------------------------------------------------------------------------------------------------------------397398_NS_INLINE int NS::Number::intValue() const399{400 return Object::sendMessage<int>(this, _NS_PRIVATE_SEL(intValue));401}402403//-------------------------------------------------------------------------------------------------------------------------------------------------------------404405_NS_INLINE unsigned int NS::Number::unsignedIntValue() const406{407 return Object::sendMessage<unsigned int>(this, _NS_PRIVATE_SEL(unsignedIntValue));408}409410//-------------------------------------------------------------------------------------------------------------------------------------------------------------411412_NS_INLINE long NS::Number::longValue() const413{414 return Object::sendMessage<long>(this, _NS_PRIVATE_SEL(longValue));415}416417//-------------------------------------------------------------------------------------------------------------------------------------------------------------418419_NS_INLINE unsigned long NS::Number::unsignedLongValue() const420{421 return Object::sendMessage<unsigned long>(this, _NS_PRIVATE_SEL(unsignedLongValue));422}423424//-------------------------------------------------------------------------------------------------------------------------------------------------------------425426_NS_INLINE long long NS::Number::longLongValue() const427{428 return Object::sendMessage<long long>(this, _NS_PRIVATE_SEL(longLongValue));429}430431//-------------------------------------------------------------------------------------------------------------------------------------------------------------432433_NS_INLINE unsigned long long NS::Number::unsignedLongLongValue() const434{435 return Object::sendMessage<unsigned long long>(this, _NS_PRIVATE_SEL(unsignedLongLongValue));436}437438//-------------------------------------------------------------------------------------------------------------------------------------------------------------439440_NS_INLINE float NS::Number::floatValue() const441{442 return Object::sendMessage<float>(this, _NS_PRIVATE_SEL(floatValue));443}444445//-------------------------------------------------------------------------------------------------------------------------------------------------------------446447_NS_INLINE double NS::Number::doubleValue() const448{449 return Object::sendMessage<double>(this, _NS_PRIVATE_SEL(doubleValue));450}451452//-------------------------------------------------------------------------------------------------------------------------------------------------------------453454_NS_INLINE bool NS::Number::boolValue() const455{456 return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(boolValue));457}458459//-------------------------------------------------------------------------------------------------------------------------------------------------------------460461_NS_INLINE NS::Integer NS::Number::integerValue() const462{463 return Object::sendMessage<Integer>(this, _NS_PRIVATE_SEL(integerValue));464}465466//-------------------------------------------------------------------------------------------------------------------------------------------------------------467468_NS_INLINE NS::UInteger NS::Number::unsignedIntegerValue() const469{470 return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(unsignedIntegerValue));471}472473//-------------------------------------------------------------------------------------------------------------------------------------------------------------474475_NS_INLINE NS::String* NS::Number::stringValue() const476{477 return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(stringValue));478}479480//-------------------------------------------------------------------------------------------------------------------------------------------------------------481482_NS_INLINE NS::ComparisonResult NS::Number::compare(const Number* pOtherNumber) const483{484 return Object::sendMessage<ComparisonResult>(this, _NS_PRIVATE_SEL(compare_), pOtherNumber);485}486487//-------------------------------------------------------------------------------------------------------------------------------------------------------------488489_NS_INLINE bool NS::Number::isEqualToNumber(const Number* pNumber) const490{491 return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqualToNumber_), pNumber);492}493494//-------------------------------------------------------------------------------------------------------------------------------------------------------------495496_NS_INLINE NS::String* NS::Number::descriptionWithLocale(const Object* pLocale) const497{498 return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(descriptionWithLocale_), pLocale);499}500501//-------------------------------------------------------------------------------------------------------------------------------------------------------------502