From ed07e7117a66227c12658ac1e02e87e46cc19768 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Wed, 16 Oct 2024 17:10:25 +0300 Subject: [PATCH] working version with requested funcs. P.S: W.I.P template SFINAE protection for unwanted equations --- openVulkanoCpp/Data/Containers/String.hpp | 56 +++++++++++++++++++++-- tests/StringTest.cpp | 15 ++++-- 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 1f73185..0bef97c 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -7,10 +7,12 @@ #pragma once #include +#include #include #include #include #include +#include #include namespace OpenVulkano @@ -21,6 +23,7 @@ namespace OpenVulkano String() = default; String(const char* str) : m_string(str) {} String(const std::string& str) : m_string(str) {} + String(const std::string_view& str) : m_string(str) {} String(const String& other) : m_string(other.m_string) {} String(String&& other) noexcept : m_string(std::move(other.m_string)) {} ~String() = default; @@ -30,17 +33,31 @@ namespace OpenVulkano m_string = other; return *this; } + template String& operator=(T&& other) { m_string = std::move(other); return *this; } + template String& operator=(const String& other) + { + m_string = other.m_string; + return *this; + } + template String& operator+=(const T& other) { m_string += other; return *this; } + + template String& operator+=(const String& other) + { + m_string += other.m_string; + return *this; + } + template String operator+(const T& other) const { return m_string + other; } String operator+(const String& other) const { return m_string + other.m_string; } @@ -50,19 +67,28 @@ namespace OpenVulkano operator std::string() const { return m_string; } explicit operator std::string_view() const { return m_string; } + const char& operator[](size_t index) const noexcept { return m_string[index]; } + const char& At(size_t index) const { return m_string.at(index); } const char* CharString() const { return m_string.c_str(); } const char* Data() { return m_string.data(); } size_t Length() const { return m_string.length(); } size_t Size() const { return m_string.size(); } + bool Empty() const { return m_string.empty(); } + size_t Capacity() const { return m_string.capacity(); } + size_t CharCount() const { return utf8::distance(m_string.begin(), m_string.end()); } char& Front() { return m_string.front(); } char& Back() { return m_string.back(); } void PopBack() { m_string.pop_back(); } void Clear() { m_string.clear(); } void Shrink() { m_string.shrink_to_fit(); } - String Substring(size_t start, size_t end) const { return m_string.substr(start, end); } + String SubString(size_t start, size_t end) const { return m_string.substr(start, end); } + bool StartsWith(const String& str) const { return m_string.find(str) == 0; } + bool EndsWith(const String& str) const { return m_string.rfind(str) == m_string.size() - str.Size(); } + bool Contains(const String& str) const { return m_string.find(str) != std::string::npos; } size_t FindStartIndexOf(const String& str) const { return m_string.find(str); } + size_t FindEndIndexOf(const String& str) const { return m_string.rfind(str); } String& Trim() noexcept { @@ -72,6 +98,20 @@ namespace OpenVulkano return *this; } + String& TrimFront() + { + size_t start = m_string.find_first_not_of(" \t\n"); + m_string = m_string.substr(start); + return *this; + } + + String& TrimBack() + { + size_t end = m_string.find_last_not_of(" \t\n"); + m_string = m_string.substr(0, end + 1); + return *this; + } + void ToUpper() noexcept { for (char& c: m_string) @@ -95,7 +135,7 @@ namespace OpenVulkano } // Makes "i am a string" to "I Am A String" also need a better name for the function - void ToUpperStarters() + void FirstLettersUpper() { for (size_t i = 0; i < m_string.size(); ++i) { @@ -114,9 +154,19 @@ namespace OpenVulkano return value; } + // iterators + std::string::iterator begin() { return m_string.begin(); } + std::string::iterator end() { return m_string.end(); } + std::string::const_iterator cbegin() const { return m_string.cbegin(); } + std::string::const_iterator cend() const { return m_string.cend(); } + std::string::reverse_iterator rbegin() { return m_string.rbegin(); } + std::string::reverse_iterator rend() { return m_string.rend(); } + std::reverse_iterator crbegin() const { return m_string.crbegin(); } + std::reverse_iterator crend() const { return m_string.crend(); } + private: std::string m_string; }; - template String operator+(const T& lhs, const String& rhs) noexcept { return lhs + rhs; } + template String operator+(const T& lhs, const String& rhs) noexcept { return String(lhs) + rhs; } } diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index 44a2d57..7f26a87 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -74,6 +74,15 @@ TEST_CASE("String") String str8("Hello"); String str9 = str8 + String(" World"); REQUIRE(str9 == "Hello World"); + + String str10 = String("Hello") + " World"; + REQUIRE(str10 == "Hello World"); + + String str11 = String("Hello") + std::string(" World"); + REQUIRE(str11 == "Hello World"); + + String str12 = std::string("Hello") + String(" World"); + REQUIRE(str12 == "Hello World"); } SECTION("Comparison") @@ -110,15 +119,15 @@ TEST_CASE("String") REQUIRE(str2 == "hello world"); String str3("Georg will save us all from our doom"); - str3.ToUpperStarters(); + str3.FirstLettersUpper(); REQUIRE(str3 == "Georg Will Save Us All From Our Doom"); } SECTION("Substring") { String str1("Hello World"); - REQUIRE(str1.Substring(0, 5) == "Hello"); - REQUIRE(str1.Substring(6, 11) == "World"); + REQUIRE(str1.SubString(0, 5) == "Hello"); + REQUIRE(str1.SubString(6, 11) == "World"); } SECTION("FromString")