SPB Git

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%
21.6 KB · 502 lines cpp
Raw Blame History
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