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