ActiveLib
Loading...
Searching...
No Matches
String.h
1
6#ifndef ACTIVE_UTILITY_STRING
7#define ACTIVE_UTILITY_STRING
8
9#include "Active/Utility/DataFormat.h"
10#include "Active/Utility/MathFunctions.h"
11#include "Active/Utility/Memory.h"
12
13#include <functional>
14#include <locale>
15#include <memory>
16#include <optional>
17#include <string>
18#include <vector>
19
20namespace active::utility {
21
22 class BufferIn;
23 class BufferOut;
24
26
51 class String {
52 public:
53
54 using enum TextEncoding;
55
56 //MARK: - Types
57
59 using Unique = std::unique_ptr<String>;
61 using Shared = std::shared_ptr<String>;
63 using Option = std::optional<String>;
65 using size_type = std::string::size_type;
67 using sizeOption = std::optional<size_type>;
69 using Filter = std::function<bool(char32_t)>;
71 using Function = std::function<std::optional<char32_t>(char32_t)>;
72
73 //MARK: - Constants
74
76 static constexpr size_type npos = std::string::npos;
78 static const String lineTerminator;
80 static const String allWhiteSpace;
82 static const String allLineEnding;
84 static const String allDigit;
86 static const String allNumeric;
88 static const String allFloat;
89
90 //MARK: - Constructors
91
95 String() {}
100 String(const BufferIn&& source);
107 String(const char* source, sizeOption howMany = std::nullopt, DataFormat format = DataFormat{});
108#ifndef __CLR_VER
114 String(const char8_t* source, sizeOption howMany = std::nullopt) : String{reinterpret_cast<const char*>(source), howMany, DataFormat{}} {}
115#endif
121 String(const char16_t* source, sizeOption howMany = std::nullopt, bool isBigEndian = Memory::defaultEndian) : String{reinterpret_cast<const char*>(source),
122 howMany ? String::sizeOption(*howMany * sizeof(char16_t)) : std::nullopt, DataFormat{UTF16, isBigEndian}} {}
128 String(const char32_t* source, sizeOption howMany = std::nullopt, bool isBigEndian = Memory::defaultEndian) : String{reinterpret_cast<const char*>(source),
129 howMany ? String::sizeOption(*howMany * sizeof(char32_t)) : std::nullopt, DataFormat{UTF32, isBigEndian}} {}
136 String(const std::string& source, sizeOption howMany = std::nullopt, DataFormat format = DataFormat{}) :
137 String{source.data(), howMany, format} {}
138#ifndef __CLR_VER
144 String(const std::u8string& source, sizeOption howMany = std::nullopt) : String(source.data(), howMany) {}
145#endif
151 String(const std::u16string& source, sizeOption howMany = std::nullopt);
157 String(const std::u32string& source, sizeOption howMany = std::nullopt);
163 String(size_type newSize, const String& fillText);
168 explicit String(char val) : m_string{val} {}
173 explicit String(int16_t val) { m_string = std::to_string(val); }
178 explicit String(uint16_t val) { m_string = std::to_string(val); }
183 explicit String(int32_t val) { m_string = std::to_string(val); }
188 explicit String(uint32_t val) { m_string = std::to_string(val); }
193 explicit String(int64_t val) { m_string = std::to_string(val); }
198 explicit String(uint64_t val) { m_string = std::to_string(val); }
199#if !defined(WINDOWS) && !defined(__linux__)
204 explicit String(size_t val) { m_string = std::to_string(static_cast<uint64_t>(val)); }
205#endif //WINDOWS
212 explicit String(double val, double prec = math::eps, bool padZero = false);
217 String(const String& source);
222 String(String&& source) noexcept;
227
228 //MARK: - Static functions
229
238 static size_type getValidByteCount(const char* text, sizeOption howMany = std::nullopt, sizeOption charCount = std::nullopt, DataFormat format = DataFormat{});
246 static sizeOption getCharacterByteCount(const char* text, sizeOption howMany = std::nullopt, DataFormat format = DataFormat{});
254 static String::sizeOption getCharacterCount(const char* text, sizeOption howMany = std::nullopt, DataFormat format = DataFormat{});
262 static std::pair<char32_t, size_type> getUnicodeChar(const char* text, sizeOption howMany = std::nullopt, DataFormat format = DataFormat{});
270 static std::optional<std::u32string> toUnicode(const char*& text, String::sizeOption howMany = std::nullopt, bool isCountRequired = false);
279 static std::optional<String> fromUnicode(const char32_t*& text, bool isBigEndian, String::sizeOption howMany = std::nullopt, bool isCountRequired = false);
288 static std::optional<std::u32string> fromUTF16(const char16_t*& text, bool isBigEndian, String::sizeOption howMany = std::nullopt, bool isCountRequired = false);
296 static std::optional<std::u16string> toUTF16(const char32_t*& text, String::sizeOption howMany = std::nullopt, bool isCountRequired = false);
297
298 //MARK: - Conversion operators
299
301 operator std::string() const { return m_string; }
302#ifndef __CLR_VER
304 operator std::u8string() const;
305#endif
307 operator std::u16string() const;
309 operator std::u32string() const;
311 explicit operator int16_t() const { return toInt16().value_or(0); }
313 explicit operator int32_t() const { return toInt32().value_or(0); }
315 explicit operator uint32_t() const { return toUInt32().value_or(0); }
317 explicit operator int64_t() const { return toInt64().value_or(0); }
319 explicit operator uint64_t() const { return toUInt64().value_or(0); }
321 explicit operator float() const { return toFloat().value_or(0.0); }
323 explicit operator double() const { return toDouble().value_or(0.0); }
324
325 //MARK: - Operators
326
332 char32_t operator[](size_type index) const;
338 String& operator= (const String& source);
344 String& operator= (String&& source) noexcept;
350 String& operator= (const char* source);
356 std::strong_ordering operator<=> (const String& ref) const { return compare(ref); }
362 bool operator== (const String& ref) const { return m_string == ref.m_string; }
368 bool operator!= (const String& ref) const { return !(*this == ref); }
374 String& operator+=(const String& source) { return append(source); }
380 String& operator+=(char source) { return append(source); }
381
382 //MARK: - Functions (const)
383
388 size_type capacity() const;
393 size_type size() const;
398 size_type length() const { return size(); }
404 size_type dataSize(sizeOption howMany = std::nullopt) const;
409 bool empty() const { return m_string.empty(); }
414 const char* data() const { return m_string.data(); }
419 std::string string() const { return m_string; }
425 char32_t at(size_type index) const;
430 void forEach(const Function& func) const;
437 String substr(size_type startPos = 0, sizeOption howMany = std::nullopt) const;
442 String uppercase() const;
447 String lowercase() const;
449 std::optional<int16_t> toInt16() const { try { return std::stoi(m_string); } catch(...) { return std::nullopt; } }
451 std::optional<int32_t> toInt32() const { try { return std::stol(m_string); } catch(...) { return std::nullopt; } }
453 std::optional<uint32_t> toUInt32() const { try { return std::stoul(m_string); } catch(...) { return std::nullopt; } }
455 std::optional<int64_t> toInt64() const { try { return std::stoll(m_string); } catch(...) { return std::nullopt; } }
457 std::optional<uint64_t> toUInt64() const { try { return std::stoull(m_string); } catch(...) { return std::nullopt; } }
459 std::optional<float> toFloat() const { try { return std::stof(m_string); } catch(...) { return std::nullopt; } }
461 std::optional<double> toDouble() const { try { return std::stod(m_string); } catch(...) { return std::nullopt; } }
471 const BufferOut& writeTo(const BufferOut& buffer, DataFormat format = UTF8, bool isNullAdded = true,
472 sizeOption howMany = std::nullopt, sizeOption maxLen = std::nullopt) const;
481 const BufferOut& writeUTF8(const BufferOut& buffer, bool isNullAdded = true, sizeOption howMany = std::nullopt, sizeOption maxLen = std::nullopt) const;
491 const BufferOut& writeUTF16(const BufferOut& buffer, bool isNullAdded = true, bool isBigEndian = DataFormat::defaultEndian,
492 sizeOption howMany = std::nullopt, sizeOption maxLen = std::nullopt) const;
502 const BufferOut& writeUTF32(const BufferOut& buffer, bool isNullAdded = true, bool isBigEndian = DataFormat::defaultEndian,
503 sizeOption howMany = std::nullopt, sizeOption maxLen = std::nullopt) const;
510 bool isAlphaNumeric(size_type startPos = 0, sizeOption howMany = std::nullopt) const;
517 bool isAlpha(size_type startPos = 0, sizeOption howMany = std::nullopt) const;
524 bool isNumeric(size_type startPos = 0, sizeOption howMany = std::nullopt) const;
530 std::strong_ordering compare(const String& ref) const;
537 sizeOption find(const String& toFind, size_type startPos = 0) const;
543 sizeOption findIf(const Filter& filter) const;
549 bool contains(const String& toFind) const { return find(toFind).has_value(); }
555 bool startsWith(const String& toFind) const { return m_string.starts_with(toFind.m_string); }
561 bool endsWith(const String& toFind) const { return m_string.ends_with(toFind.m_string); }
568 sizeOption findFirstOf(const String& toFind, size_type startPos = 0) const;
575 sizeOption findFirstNotOf(const String& toFind, size_type startPos = 0) const;
582 sizeOption findLastOf(const String& toFind, sizeOption lastPos = std::nullopt) const;
589 sizeOption findLastNotOf(const String& toFind, sizeOption lastPos = std::nullopt) const;
596 sizeOption rfind(const String& toFind, sizeOption lastPos = std::nullopt) const;
597
598 //MARK: - Functions (mutating)
599
604 void reserve(size_type newSize);
610 void resize(size_type newSize, const String& padding = "");
614 void clear() { m_string.clear(); }
619 void forEach(const Function& func);
625 String& assign(const String& source);
634 size_type assign(const char* source, sizeOption byteCount = std::nullopt, sizeOption charCount = std::nullopt, DataFormat format = DataFormat{});
640 String& append(const String& source);
646 String& append(char source) {
647 if (auto uniChar = getUnicodeChar(&source, 1, ISO8859_1); uniChar.second > 0)
648 append(uniChar.first);
649 return *this;
650 }
656 String& append(char32_t source) {
657 const char32_t* sourcePtr = &source;
658 if (auto sourceStr = fromUnicode(sourcePtr, Memory::defaultEndian, 1); sourceStr)
659 m_string += *sourceStr;
660 return *this;
661 }
670 String& insert(size_type pos, const String& source, size_type start = 0, sizeOption howMany = std::nullopt);
680 String& replace(sizeOption pos, sizeOption num, const String& source, size_type start = 0, sizeOption howMany = std::nullopt);
687 String& replaceAll(const String& toFind, const String& replacement = String());
694 String& replaceIf(const Filter& filter, const String& replacement = String());
701 String& replaceAnyOf(const String& charsToFind, const String& replacement = String());
708 String& erase(size_type pos = 0, sizeOption howMany = std::nullopt);
712 void popBack();
719 String& padRight(size_type length, const String& repeat = " ");
726 String& padLeft(size_type length, const String& repeat = " ");
727
728 private:
730 std::string m_string;
731 };
732
733
740 inline String operator+(const String& str1, const String& str2) {
741 return String{str1}.append(str2);
742 }
743
744
750 inline bool isWhiteSpace(char32_t uniChar) {
751 switch (uniChar) {
752 case U' ': case U'\t': case U'\r': case U'\n':
753 return true;
754 default:
755 return false;
756 }
757 }
758
759
765 inline bool isLineEnding(char32_t uniChar) {
766 return ((uniChar == U'\r') || (uniChar == U'\n'));
767 }
768
769
775 inline bool isDigit(char32_t uniChar) {
776 return ((uniChar <= U'9') && (uniChar >= U'0'));
777 }
778
779
785 inline bool isNumeric(char32_t uniChar) {
786 return (isDigit(uniChar) || (uniChar == U'-'));
787 }
788
789
795 inline bool isFloat(char32_t uniChar) {
796 return (isNumeric(uniChar) || (uniChar == U'.'));
797 }
798
799}
800
802template <>
803struct std::hash<active::utility::String> {
804 std::size_t operator()(const active::utility::String& k) const {
805 return hash<std::string>()(k); //Just use the hashing provided by std::string
806 }
807};
808
809#endif //ACTIVE_UTILITY_STRING
Definition BufferIn.h:27
Definition BufferOut.h:23
A Unicode-aware string class.
Definition String.h:51
String & padLeft(size_type length, const String &repeat=" ")
Definition String.cpp:1680
static const String lineTerminator
The line terminating char(s) for the current platform.
Definition String.h:78
String()
Definition String.h:95
std::strong_ordering compare(const String &ref) const
Definition String.cpp:1240
static const String allNumeric
All numeric characters (integer and signed)
Definition String.h:86
String & replace(sizeOption pos, sizeOption num, const String &source, size_type start=0, sizeOption howMany=std::nullopt)
Definition String.cpp:1564
bool operator!=(const String &ref) const
Definition String.h:368
static String::sizeOption getCharacterCount(const char *text, sizeOption howMany=std::nullopt, DataFormat format=DataFormat{})
Definition String.cpp:594
sizeOption findFirstOf(const String &toFind, size_type startPos=0) const
Definition String.cpp:1293
sizeOption find(const String &toFind, size_type startPos=0) const
Definition String.cpp:1254
String & operator+=(const String &source)
Definition String.h:374
sizeOption findLastNotOf(const String &toFind, sizeOption lastPos=std::nullopt) const
Definition String.cpp:1393
String & append(char source)
Definition String.h:646
String(const std::string &source, sizeOption howMany=std::nullopt, DataFormat format=DataFormat{})
Definition String.h:136
std::optional< uint32_t > toUInt32() const
Conversion to optional uint32_t (nullopt if conversion impossible)
Definition String.h:453
void clear()
Definition String.h:614
const BufferOut & writeUTF8(const BufferOut &buffer, bool isNullAdded=true, sizeOption howMany=std::nullopt, sizeOption maxLen=std::nullopt) const
Definition String.cpp:1054
std::strong_ordering operator<=>(const String &ref) const
Definition String.h:356
bool endsWith(const String &toFind) const
Definition String.h:561
char32_t at(size_type index) const
Definition String.cpp:931
String & insert(size_type pos, const String &source, size_type start=0, sizeOption howMany=std::nullopt)
Definition String.cpp:1548
~String()
Definition String.h:226
static std::pair< char32_t, size_type > getUnicodeChar(const char *text, sizeOption howMany=std::nullopt, DataFormat format=DataFormat{})
Definition String.cpp:624
std::string string() const
Definition String.h:419
sizeOption findLastOf(const String &toFind, sizeOption lastPos=std::nullopt) const
Definition String.cpp:1365
String uppercase() const
Definition String.cpp:971
String(uint16_t val)
Definition String.h:178
void resize(size_type newSize, const String &padding="")
Definition String.cpp:1468
String & replaceAnyOf(const String &charsToFind, const String &replacement=String())
Definition String.cpp:1620
String & replaceAll(const String &toFind, const String &replacement=String())
Definition String.cpp:1584
static std::optional< std::u16string > toUTF16(const char32_t *&text, String::sizeOption howMany=std::nullopt, bool isCountRequired=false)
Definition String.cpp:766
String & append(char32_t source)
Definition String.h:656
static const String allFloat
All floating point characters (floating and integer)
Definition String.h:88
String(uint32_t val)
Definition String.h:188
std::optional< float > toFloat() const
Conversion to optional float (nullopt if conversion impossible)
Definition String.h:459
bool contains(const String &toFind) const
Definition String.h:549
size_type capacity() const
Definition String.cpp:893
void forEach(const Function &func) const
Definition String.cpp:945
static size_type getValidByteCount(const char *text, sizeOption howMany=std::nullopt, sizeOption charCount=std::nullopt, DataFormat format=DataFormat{})
Definition String.cpp:501
std::optional< int16_t > toInt16() const
Conversion to optional int16_t (nullopt if conversion impossible)
Definition String.h:449
std::optional< int64_t > toInt64() const
Conversion to optional int64_t (nullopt if conversion impossible)
Definition String.h:455
bool operator==(const String &ref) const
Definition String.h:362
std::optional< String > Option
Optional.
Definition String.h:63
String & replaceIf(const Filter &filter, const String &replacement=String())
Definition String.cpp:1602
std::optional< int32_t > toInt32() const
Conversion to optional int32_t (nullopt if conversion impossible)
Definition String.h:451
static const String allLineEnding
All line ending characters.
Definition String.h:82
String(const char32_t *source, sizeOption howMany=std::nullopt, bool isBigEndian=Memory::defaultEndian)
Definition String.h:128
const BufferOut & writeTo(const BufferOut &buffer, DataFormat format=UTF8, bool isNullAdded=true, sizeOption howMany=std::nullopt, sizeOption maxLen=std::nullopt) const
Definition String.cpp:1031
String lowercase() const
Definition String.cpp:998
sizeOption findFirstNotOf(const String &toFind, size_type startPos=0) const
Definition String.cpp:1323
String(int16_t val)
Definition String.h:173
bool startsWith(const String &toFind) const
Definition String.h:555
static const String allDigit
All digit characters (0-9)
Definition String.h:84
void reserve(size_type newSize)
Definition String.cpp:1457
bool empty() const
Definition String.h:409
String & assign(const String &source)
Definition String.cpp:1503
String(const char8_t *source, sizeOption howMany=std::nullopt)
Definition String.h:114
String(const char16_t *source, sizeOption howMany=std::nullopt, bool isBigEndian=Memory::defaultEndian)
Definition String.h:121
static const String allWhiteSpace
All white space characters.
Definition String.h:80
const BufferOut & writeUTF32(const BufferOut &buffer, bool isNullAdded=true, bool isBigEndian=DataFormat::defaultEndian, sizeOption howMany=std::nullopt, sizeOption maxLen=std::nullopt) const
Definition String.cpp:1123
std::optional< double > toDouble() const
Conversion to optional double (nullopt if conversion impossible)
Definition String.h:461
String(size_t val)
Definition String.h:204
static std::optional< std::u32string > toUnicode(const char *&text, String::sizeOption howMany=std::nullopt, bool isCountRequired=false)
Definition String.cpp:713
String(int64_t val)
Definition String.h:193
std::function< bool(char32_t)> Filter
Unary predicate for filtering strings.
Definition String.h:69
const char * data() const
Definition String.h:414
static constexpr size_type npos
Constant to indicate an unspecified or non-existant position in std::string - use std::nullopt in thi...
Definition String.h:76
static std::optional< String > fromUnicode(const char32_t *&text, bool isBigEndian, String::sizeOption howMany=std::nullopt, bool isCountRequired=false)
Definition String.cpp:668
std::string::size_type size_type
Class size type.
Definition String.h:65
String & erase(size_type pos=0, sizeOption howMany=std::nullopt)
Definition String.cpp:1638
String(const std::u8string &source, sizeOption howMany=std::nullopt)
Definition String.h:144
sizeOption findIf(const Filter &filter) const
Definition String.cpp:1272
String & append(const String &source)
Definition String.cpp:1532
bool isAlpha(size_type startPos=0, sizeOption howMany=std::nullopt) const
Definition String.cpp:1183
static sizeOption getCharacterByteCount(const char *text, sizeOption howMany=std::nullopt, DataFormat format=DataFormat{})
Definition String.cpp:530
size_type dataSize(sizeOption howMany=std::nullopt) const
Definition String.cpp:915
String & operator=(const String &source)
Definition String.cpp:853
bool isNumeric(size_type startPos=0, sizeOption howMany=std::nullopt) const
Definition String.cpp:1212
String & operator+=(char source)
Definition String.h:380
String substr(size_type startPos=0, sizeOption howMany=std::nullopt) const
Definition String.cpp:958
std::shared_ptr< String > Shared
Shared pointer.
Definition String.h:61
std::function< std::optional< char32_t >(char32_t)> Function
Unary functions for processing string characters.
Definition String.h:71
std::optional< uint64_t > toUInt64() const
Conversion to optional uint64_t (nullopt if conversion impossible)
Definition String.h:457
char32_t operator[](size_type index) const
Definition String.cpp:839
String & padRight(size_type length, const String &repeat=" ")
Definition String.cpp:1660
String(uint64_t val)
Definition String.h:198
const BufferOut & writeUTF16(const BufferOut &buffer, bool isNullAdded=true, bool isBigEndian=DataFormat::defaultEndian, sizeOption howMany=std::nullopt, sizeOption maxLen=std::nullopt) const
Definition String.cpp:1087
sizeOption rfind(const String &toFind, sizeOption lastPos=std::nullopt) const
Definition String.cpp:1442
std::optional< size_type > sizeOption
Optional size type (used to indicate an unspecified or non-existant position)
Definition String.h:67
bool isAlphaNumeric(size_type startPos=0, sizeOption howMany=std::nullopt) const
Definition String.cpp:1154
String(int32_t val)
Definition String.h:183
static std::optional< std::u32string > fromUTF16(const char16_t *&text, bool isBigEndian, String::sizeOption howMany=std::nullopt, bool isCountRequired=false)
Definition String.cpp:740
String(char val)
Definition String.h:168
void popBack()
Definition String.cpp:1646
size_type length() const
Definition String.h:398
std::unique_ptr< String > Unique
Unique pointer.
Definition String.h:59
size_type size() const
Definition String.cpp:903
Definition Base64Transport.h:11
bool isLineEnding(char32_t uniChar)
Definition String.h:765
String operator+(const String &str1, const String &str2)
Definition String.h:740
bool isNumeric(char32_t uniChar)
Definition String.h:785
bool isFloat(char32_t uniChar)
Definition String.h:795
bool isDigit(char32_t uniChar)
Definition String.h:775
bool isWhiteSpace(char32_t uniChar)
Definition String.h:750
Definition DataFormat.h:20