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%
10.7 KB · 256 lines cpp
Raw Blame History
1//-------------------------------------------------------------------------------------------------------------------------------------------------------------2//3// Foundation/NSString.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 "NSDefines.hpp"26#include "NSObjCRuntime.hpp"27#include "NSObject.hpp"28#include "NSPrivate.hpp"29#include "NSRange.hpp"30#include "NSTypes.hpp"3132//-------------------------------------------------------------------------------------------------------------------------------------------------------------3334namespace NS35{36_NS_ENUM(NS::UInteger, StringEncoding) {37    ASCIIStringEncoding = 1,38    NEXTSTEPStringEncoding = 2,39    JapaneseEUCStringEncoding = 3,40    UTF8StringEncoding = 4,41    ISOLatin1StringEncoding = 5,42    SymbolStringEncoding = 6,43    NonLossyASCIIStringEncoding = 7,44    ShiftJISStringEncoding = 8,45    ISOLatin2StringEncoding = 9,46    UnicodeStringEncoding = 10,47    WindowsCP1251StringEncoding = 11,48    WindowsCP1252StringEncoding = 12,49    WindowsCP1253StringEncoding = 13,50    WindowsCP1254StringEncoding = 14,51    WindowsCP1250StringEncoding = 15,52    ISO2022JPStringEncoding = 21,53    MacOSRomanStringEncoding = 30,5455    UTF16StringEncoding = UnicodeStringEncoding,5657    UTF16BigEndianStringEncoding = 0x90000100,58    UTF16LittleEndianStringEncoding = 0x94000100,5960    UTF32StringEncoding = 0x8c000100,61    UTF32BigEndianStringEncoding = 0x98000100,62    UTF32LittleEndianStringEncoding = 0x9c00010063};6465_NS_OPTIONS(NS::UInteger, StringCompareOptions) {66    CaseInsensitiveSearch = 1,67    LiteralSearch = 2,68    BackwardsSearch = 4,69    AnchoredSearch = 8,70    NumericSearch = 64,71    DiacriticInsensitiveSearch = 128,72    WidthInsensitiveSearch = 256,73    ForcedOrderingSearch = 512,74    RegularExpressionSearch = 102475};7677using unichar = unsigned short;7879class String : public Copying<String>80{81public:82    static String*   string();83    static String*   string(const String* pString);84    static String*   string(const char* pString, StringEncoding encoding);8586    static String*   alloc();87    String*          init();88    String*          init(const String* pString);89    String*          init(const char* pString, StringEncoding encoding);90    String*          init(void* pBytes, UInteger len, StringEncoding encoding, bool freeBuffer);9192    unichar          character(UInteger index) const;93    UInteger         length() const;9495    const char*      cString(StringEncoding encoding) const;96    const char*      utf8String() const;97    UInteger         maximumLengthOfBytes(StringEncoding encoding) const;98    UInteger         lengthOfBytes(StringEncoding encoding) const;99100    bool             isEqualToString(const String* pString) const;101    Range            rangeOfString(const String* pString, StringCompareOptions options) const;102103    const char*      fileSystemRepresentation() const;104105    String*          stringByAppendingString(const String* pString) const;106    ComparisonResult caseInsensitiveCompare(const String* pString) const;107};108109/// Create an NS::String* from a string literal.110#define MTLSTR(literal) (NS::String*)__builtin___CFStringMakeConstantString("" literal "")111112template <std::size_t _StringLen>113[[deprecated("please use MTLSTR(str)")]] constexpr const String* MakeConstantString(const char (&str)[_StringLen])114{115    return reinterpret_cast<const String*>(__CFStringMakeConstantString(str));116}117118}119120//-------------------------------------------------------------------------------------------------------------------------------------------------------------121122_NS_INLINE NS::String* NS::String::string()123{124    return Object::sendMessage<String*>(_NS_PRIVATE_CLS(NSString), _NS_PRIVATE_SEL(string));125}126127//-------------------------------------------------------------------------------------------------------------------------------------------------------------128129_NS_INLINE NS::String* NS::String::string(const String* pString)130{131    return Object::sendMessage<String*>(_NS_PRIVATE_CLS(NSString), _NS_PRIVATE_SEL(stringWithString_), pString);132}133134//-------------------------------------------------------------------------------------------------------------------------------------------------------------135136_NS_INLINE NS::String* NS::String::string(const char* pString, StringEncoding encoding)137{138    return Object::sendMessage<String*>(_NS_PRIVATE_CLS(NSString), _NS_PRIVATE_SEL(stringWithCString_encoding_), pString, encoding);139}140141//-------------------------------------------------------------------------------------------------------------------------------------------------------------142143_NS_INLINE NS::String* NS::String::alloc()144{145    return Object::alloc<String>(_NS_PRIVATE_CLS(NSString));146}147148//-------------------------------------------------------------------------------------------------------------------------------------------------------------149150_NS_INLINE NS::String* NS::String::init()151{152    return Object::init<String>();153}154155//-------------------------------------------------------------------------------------------------------------------------------------------------------------156157_NS_INLINE NS::String* NS::String::init(const String* pString)158{159    return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(initWithString_), pString);160}161162//-------------------------------------------------------------------------------------------------------------------------------------------------------------163164_NS_INLINE NS::String* NS::String::init(const char* pString, StringEncoding encoding)165{166    return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(initWithCString_encoding_), pString, encoding);167}168169//-------------------------------------------------------------------------------------------------------------------------------------------------------------170171_NS_INLINE NS::String* NS::String::init(void* pBytes, UInteger len, StringEncoding encoding, bool freeBuffer)172{173    return Object::sendMessage<String*>(this, _NS_PRIVATE_SEL(initWithBytesNoCopy_length_encoding_freeWhenDone_), pBytes, len, encoding, freeBuffer);174}175176//-------------------------------------------------------------------------------------------------------------------------------------------------------------177178_NS_INLINE NS::unichar NS::String::character(UInteger index) const179{180    return Object::sendMessage<unichar>(this, _NS_PRIVATE_SEL(characterAtIndex_), index);181}182183//-------------------------------------------------------------------------------------------------------------------------------------------------------------184185_NS_INLINE NS::UInteger NS::String::length() const186{187    return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(length));188}189190//-------------------------------------------------------------------------------------------------------------------------------------------------------------191192_NS_INLINE const char* NS::String::cString(StringEncoding encoding) const193{194    return Object::sendMessage<const char*>(this, _NS_PRIVATE_SEL(cStringUsingEncoding_), encoding);195}196197//-------------------------------------------------------------------------------------------------------------------------------------------------------------198199_NS_INLINE const char* NS::String::utf8String() const200{201    return Object::sendMessage<const char*>(this, _NS_PRIVATE_SEL(UTF8String));202}203204//-------------------------------------------------------------------------------------------------------------------------------------------------------------205206_NS_INLINE NS::UInteger NS::String::maximumLengthOfBytes(StringEncoding encoding) const207{208    return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(maximumLengthOfBytesUsingEncoding_), encoding);209}210211//-------------------------------------------------------------------------------------------------------------------------------------------------------------212213_NS_INLINE NS::UInteger NS::String::lengthOfBytes(StringEncoding encoding) const214{215    return Object::sendMessage<UInteger>(this, _NS_PRIVATE_SEL(lengthOfBytesUsingEncoding_), encoding);216}217218//-------------------------------------------------------------------------------------------------------------------------------------------------------------219220_NS_INLINE bool NS::String::isEqualToString(const NS::String* pString) const221{222    return Object::sendMessage<bool>(this, _NS_PRIVATE_SEL(isEqualToString_), pString);223}224225//-------------------------------------------------------------------------------------------------------------------------------------------------------------226227_NS_INLINE NS::Range NS::String::rangeOfString(const NS::String* pString, NS::StringCompareOptions options) const228{229    return Object::sendMessage<Range>(this, _NS_PRIVATE_SEL(rangeOfString_options_), pString, options);230}231232//-------------------------------------------------------------------------------------------------------------------------------------------------------------233234//-------------------------------------------------------------------------------------------------------------------------------------------------------------235236_NS_INLINE const char* NS::String::fileSystemRepresentation() const237{238    return Object::sendMessage<const char*>(this, _NS_PRIVATE_SEL(fileSystemRepresentation));239}240241//-------------------------------------------------------------------------------------------------------------------------------------------------------------242243_NS_INLINE NS::String* NS::String::stringByAppendingString(const String* pString) const244{245    return Object::sendMessage<NS::String*>(this, _NS_PRIVATE_SEL(stringByAppendingString_), pString);246}247248//-------------------------------------------------------------------------------------------------------------------------------------------------------------249250_NS_INLINE NS::ComparisonResult NS::String::caseInsensitiveCompare(const String* pString) const251{252    return Object::sendMessage<NS::ComparisonResult>(this, _NS_PRIVATE_SEL(caseInsensitiveCompare_), pString);253}254255//-------------------------------------------------------------------------------------------------------------------------------------------------------------256