From 5256ef8ff3a3be009d64fbe66a93f9651660b3af Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Wed, 16 Oct 2024 11:57:05 +0300 Subject: [PATCH 01/13] billboard example error fix + string wrapper first implementation --- openVulkanoCpp/Data/Containers/String.hpp | 71 +++++++++++++++++ openVulkanoCpp/Host/GraphicsAppManager.cpp | 2 +- tests/StringTest.cpp | 89 ++++++++++++++++++++++ 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 openVulkanoCpp/Data/Containers/String.hpp create mode 100644 tests/StringTest.cpp diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp new file mode 100644 index 0000000..1440915 --- /dev/null +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -0,0 +1,71 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include + +namespace OpenVulkano +{ + class String final + { + public: + String() = default; + String(const char* str) : m_string(str) {} + String(const std::string& 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; + + template String& operator=(const T& other) + { + m_string = other; + return *this; + } + template String& operator=(T&& other) + { + m_string = std::move(other); + return *this; + } + + template String& operator+=(const T& other) + { + m_string += other; + 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; } + + template bool operator==(const T& other) const { return m_string == other; } + template bool operator!=(const T& other) const { return m_string != other; } + + operator std::string() const { return m_string; } + const char* CStr() 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(); } + + char& Front() { return m_string.front(); } + char& Back() { return m_string.back(); } + void PopBack() { m_string.pop_back(); } + void Clear() { m_string.clear(); } + + size_t FindStartIndexOf(const String& str) const { return m_string.find(str); } + + String& Trim() noexcept + { + size_t start = m_string.find_first_not_of(" \t\n"); + size_t end = m_string.find_last_not_of(" \t\n"); + m_string = m_string.substr(start, end - start + 1); + return *this; + } + + private: + std::string m_string; + }; + + template String operator+(const T& lhs, const String& rhs) noexcept { return lhs + rhs; } +} diff --git a/openVulkanoCpp/Host/GraphicsAppManager.cpp b/openVulkanoCpp/Host/GraphicsAppManager.cpp index 918a361..e49123b 100644 --- a/openVulkanoCpp/Host/GraphicsAppManager.cpp +++ b/openVulkanoCpp/Host/GraphicsAppManager.cpp @@ -87,7 +87,7 @@ namespace OpenVulkano void GraphicsAppManager::UpdateCappedFpsInfo(int32_t newFpsCap) { - if (newFpsCap < 0) + if (newFpsCap <= 0) { cappedFrameTime = std::chrono::microseconds(0); } diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp new file mode 100644 index 0000000..717ff4c --- /dev/null +++ b/tests/StringTest.cpp @@ -0,0 +1,89 @@ +/* +* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at https://mozilla.org/MPL/2.0/. +*/ + +#include + +#include "Data/Containers/String.hpp" + +using namespace OpenVulkano; + +TEST_CASE("String") +{ + SECTION("Constructors") + { + String str1; + REQUIRE(str1 == ""); + + String str2("Hello"); + REQUIRE(str2 == "Hello"); + + String str3(std::string("World")); + REQUIRE(str3 == "World"); + + String str4(str2); + REQUIRE(str4 == "Hello"); + + String str5(std::move(str3)); + REQUIRE(str5 == "World"); + } + + SECTION("Assignment") + { + String str1; + str1 = "Hello"; + REQUIRE(str1 == "Hello"); + + String str2; + str2 = std::string("World"); + REQUIRE(str2 == "World"); + + String str3; + str3 = str1; + REQUIRE(str3 == "Hello"); + + String str4; + str4 = std::move(str2); + REQUIRE(str4 == "World"); + } + + SECTION("Concatenation") + { + String str1("Hello"); + str1 += " World"; + REQUIRE(str1 == "Hello World"); + + String str2("Hello"); + String str3 = str2 + " World"; + REQUIRE(str3 == "Hello World"); + + String str4("Hello"); + str4 += std::string(" World"); + REQUIRE(str4 == "Hello World"); + + String str5("Hello"); + String str6 = str5 + std::string(" World"); + REQUIRE(str6 == "Hello World"); + + String str7("Hello"); + str7 += String(" World"); + REQUIRE(str7 == "Hello World"); + + String str8("Hello"); + String str9 = str8 + String(" World"); + REQUIRE(str9 == "Hello World"); + } + + SECTION("Comparison") + { + String str1("Hello"); + REQUIRE(str1 == "Hello"); + REQUIRE(str1 != "World"); + + String str2("World"); + REQUIRE(str2 == "World"); + REQUIRE(str2 != "Hello"); + } +} \ No newline at end of file From 6d53ff9c7619c6a6c5e87b9c2bd48d011bbf2c80 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Wed, 16 Oct 2024 14:02:10 +0300 Subject: [PATCH 02/13] couple new features for string wrapper --- openVulkanoCpp/Data/Containers/String.hpp | 53 ++++++++++++++++++++++- tests/StringTest.cpp | 43 ++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 1440915..1f73185 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -7,6 +7,11 @@ #pragma once #include +#include +#include +#include +#include +#include namespace OpenVulkano { @@ -43,7 +48,9 @@ namespace OpenVulkano template bool operator!=(const T& other) const { return m_string != other; } operator std::string() const { return m_string; } - const char* CStr() const { return m_string.c_str(); } + explicit operator std::string_view() const { return m_string; } + + 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(); } @@ -52,6 +59,8 @@ namespace OpenVulkano 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); } size_t FindStartIndexOf(const String& str) const { return m_string.find(str); } @@ -63,6 +72,48 @@ namespace OpenVulkano return *this; } + void ToUpper() noexcept + { + for (char& c: m_string) + { + if (c >= 'a' && c <= 'z') + { + c -= 32; + } + } + } + + void ToLower() noexcept + { + for (char& c: m_string) + { + if (c >= 'A' && c <= 'Z') + { + c += 32; + } + } + } + + // Makes "i am a string" to "I Am A String" also need a better name for the function + void ToUpperStarters() + { + for (size_t i = 0; i < m_string.size(); ++i) + { + if (m_string[i] == ' ') + { + m_string[i + 1] -= 32; + } + } + } + + template>> T FromString() const + { + T value; + c4::csubstr str = c4::to_csubstr(m_string.c_str()); + c4::from_chars(str, &value); + return value; + } + private: std::string m_string; }; diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index 717ff4c..44a2d57 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -86,4 +86,47 @@ TEST_CASE("String") REQUIRE(str2 == "World"); REQUIRE(str2 != "Hello"); } + + SECTION("Trim") + { + String str1(" Hello World "); + REQUIRE(str1.Trim() == "Hello World"); + } + + SECTION("FindIndex") + { + String str1("Georg will save us all from our doom"); + REQUIRE(str1.FindStartIndexOf("save") == 11); + } + + SECTION("Upper/Lower") + { + String str1("Hello World"); + str1.ToUpper(); + REQUIRE(str1 == "HELLO WORLD"); + + String str2("Hello World"); + str2.ToLower(); + REQUIRE(str2 == "hello world"); + + String str3("Georg will save us all from our doom"); + str3.ToUpperStarters(); + 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"); + } + + SECTION("FromString") + { + String str1("42"); + REQUIRE(str1.FromString() == 42); + + String str2("42.42"); + REQUIRE(str2.FromString() == 42.42f); + } } \ No newline at end of file From ed07e7117a66227c12658ac1e02e87e46cc19768 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Wed, 16 Oct 2024 17:10:25 +0300 Subject: [PATCH 03/13] 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") From 03a7ca30409d100c441d887dcf916342d1bb9866 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Wed, 16 Oct 2024 17:40:39 +0300 Subject: [PATCH 04/13] waiting for full review on String wrapper --- openVulkanoCpp/Data/Containers/String.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 0bef97c..2648712 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -134,7 +134,6 @@ namespace OpenVulkano } } - // Makes "i am a string" to "I Am A String" also need a better name for the function void FirstLettersUpper() { for (size_t i = 0; i < m_string.size(); ++i) From b6d74ea4f7343beb6d6757ca382489ea58133b9b Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Thu, 17 Oct 2024 16:00:38 +0300 Subject: [PATCH 05/13] fix string according to reviews --- openVulkanoCpp/Data/Containers/String.hpp | 89 ++++++++++++--------- tests/StringTest.cpp | 94 ++++++++++++++++++++++- 2 files changed, 143 insertions(+), 40 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 2648712..c6e6f03 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -61,13 +61,20 @@ namespace OpenVulkano template String operator+(const T& other) const { return m_string + other; } String operator+(const String& other) const { return m_string + other.m_string; } +#if defined(_HAS_CXX20) + template int operator<=>(const T& other) const { return m_string <=> other; } +#endif + template bool operator==(const T& other) const { return m_string == other; } template bool operator!=(const T& other) const { return m_string != other; } + explicit operator bool() const { return !m_string.empty(); } operator std::string() const { return m_string; } explicit operator std::string_view() const { return m_string; } + char& operator[](size_t index) noexcept { return m_string[index]; } const char& operator[](size_t index) const noexcept { return m_string[index]; } + char& At(size_t index) { return m_string.at(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(); } @@ -81,67 +88,77 @@ namespace OpenVulkano 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); } - 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; } + void ShrinkToFit() { m_string.shrink_to_fit(); } + String SubString(size_t start, size_t elementCount) const { return m_string.substr(start, elementCount); } + bool StartsWith(const std::string_view& str) const { return m_string.find(str) == 0; } + bool EndsWith(const std::string_view& str) const { return m_string.rfind(str) == m_string.size() - str.size(); } + bool Contains(const std::string_view& 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); } + size_t FindStartIndexOf(const std::string_view& str) const { return m_string.find(str); } + size_t FindEndIndexOf(const std::string_view& str) const { return m_string.rfind(str); } String& Trim() noexcept { - size_t start = m_string.find_first_not_of(" \t\n"); - size_t end = m_string.find_last_not_of(" \t\n"); - m_string = m_string.substr(start, end - start + 1); + size_t start = m_string.find_first_not_of(" \t\n\r"); + if (start == std::string::npos) + { + m_string.clear(); + return *this; + } + + size_t end = m_string.find_last_not_of(" \t\n\r"); + + m_string.erase(0, start); + m_string.resize(end - start + 1); + return *this; } - String& TrimFront() + String& TrimFront() noexcept { - size_t start = m_string.find_first_not_of(" \t\n"); - m_string = m_string.substr(start); + size_t start = m_string.find_first_not_of(" \t\n\r"); + if (start == std::string::npos) + { + m_string.clear(); + } + else + { + m_string.erase(0, start); + } return *this; } - String& TrimBack() + String& TrimBack() noexcept { - size_t end = m_string.find_last_not_of(" \t\n"); - m_string = m_string.substr(0, end + 1); + size_t end = m_string.find_last_not_of(" \t\n\r"); + if (end == std::string::npos) + { + m_string.clear(); + } + else + { + m_string.resize(end + 1); + } return *this; } void ToUpper() noexcept { - for (char& c: m_string) - { - if (c >= 'a' && c <= 'z') - { - c -= 32; - } - } + std::transform(m_string.begin(), m_string.end(), m_string.begin(), + [](unsigned char c) { return std::toupper(c); }); } void ToLower() noexcept { - for (char& c: m_string) - { - if (c >= 'A' && c <= 'Z') - { - c += 32; - } - } + std::transform(m_string.begin(), m_string.end(), m_string.begin(), + [](unsigned char c) { return std::tolower(c); }); } - void FirstLettersUpper() + void Capitalize() noexcept { - for (size_t i = 0; i < m_string.size(); ++i) + if (!m_string.empty()) { - if (m_string[i] == ' ') - { - m_string[i + 1] -= 32; - } + m_string[0] = std::toupper(m_string[0]); } } diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index 7f26a87..5b700d0 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -117,10 +117,6 @@ TEST_CASE("String") String str2("Hello World"); str2.ToLower(); REQUIRE(str2 == "hello world"); - - String str3("Georg will save us all from our doom"); - str3.FirstLettersUpper(); - REQUIRE(str3 == "Georg Will Save Us All From Our Doom"); } SECTION("Substring") @@ -138,4 +134,94 @@ TEST_CASE("String") String str2("42.42"); REQUIRE(str2.FromString() == 42.42f); } + + SECTION("StartsWith") + { + String str1("Hello World"); + REQUIRE(str1.StartsWith("Hello")); + REQUIRE(!str1.StartsWith("World")); + } + + SECTION("EndsWith") + { + String str1("Hello World"); + REQUIRE(str1.EndsWith("World")); + REQUIRE(!str1.EndsWith("Hello")); + } + + SECTION("Contains") + { + String str1("Hello World"); + REQUIRE(str1.Contains("Hello")); + REQUIRE(str1.Contains("World")); + REQUIRE(!str1.Contains("Georg")); + } + + SECTION("FindEndIndexOf") + { + String str1("Georg will save us all from our doom"); + REQUIRE(str1.FindEndIndexOf("save") == 11); + } + + SECTION("TrimFront") + { + String str1(" Hello World"); + REQUIRE(str1.TrimFront() == "Hello World"); + } + + SECTION("TrimBack") + { + String str1("Hello World "); + REQUIRE(str1.TrimBack() == "Hello World"); + } + + SECTION("Empty") + { + String str1; + REQUIRE(str1.Empty()); + REQUIRE(!str1); + + String str2("Hello World"); + REQUIRE(!str2.Empty()); + REQUIRE(!!str2); + } + + SECTION("Size") + { + String str1("Hello World"); + REQUIRE(str1.Size() == 11); + } + + SECTION("Capacity") + { + String str1("Hello World"); + REQUIRE(str1.Capacity() >= 11); + } + + SECTION("CharCount") + { + String str1("Hello World"); + REQUIRE(str1.CharCount() == 11); + } + + SECTION("PopBack") + { + String str1("Hello World"); + str1.PopBack(); + REQUIRE(str1 == "Hello Worl"); + } + + SECTION("Clear") + { + String str1("Hello World"); + str1.Clear(); + REQUIRE(str1.Empty()); + } + + SECTION("ShrinkToFit") + { + String str1("Hello World"); + str1.ShrinkToFit(); + REQUIRE(str1.Capacity() == 15); // 11 + 4 null terminators due to sso + } } \ No newline at end of file From f7c6682cf5c8ead7635a235aaf9bcefdb26b1eeb Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Thu, 17 Oct 2024 16:55:02 +0300 Subject: [PATCH 06/13] string test detailed look --- tests/StringTest.cpp | 340 +++++++++++++++++++++---------------------- 1 file changed, 165 insertions(+), 175 deletions(-) diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index 5b700d0..a14821b 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -10,218 +10,208 @@ using namespace OpenVulkano; -TEST_CASE("String") +TEST_CASE("Constructors") { - SECTION("Constructors") - { - String str1; - REQUIRE(str1 == ""); + String str1; + REQUIRE(str1 == ""); - String str2("Hello"); - REQUIRE(str2 == "Hello"); + String str2("Hello"); + REQUIRE(str2 == "Hello"); - String str3(std::string("World")); - REQUIRE(str3 == "World"); + String str3(std::string("World")); + REQUIRE(str3 == "World"); - String str4(str2); - REQUIRE(str4 == "Hello"); + String str4(str2); + REQUIRE(str4 == "Hello"); - String str5(std::move(str3)); - REQUIRE(str5 == "World"); - } + String str5(std::move(str3)); + REQUIRE(str5 == "World"); +} - SECTION("Assignment") - { - String str1; - str1 = "Hello"; - REQUIRE(str1 == "Hello"); +TEST_CASE("Assignment") +{ + String str1; + str1 = "Hello"; + REQUIRE(str1 == "Hello"); - String str2; - str2 = std::string("World"); - REQUIRE(str2 == "World"); + String str2; + str2 = std::string("World"); + REQUIRE(str2 == "World"); - String str3; - str3 = str1; - REQUIRE(str3 == "Hello"); + String str3; + str3 = str1; + REQUIRE(str3 == "Hello"); - String str4; - str4 = std::move(str2); - REQUIRE(str4 == "World"); - } + String str4; + str4 = std::move(str2); + REQUIRE(str4 == "World"); +} - SECTION("Concatenation") - { - String str1("Hello"); - str1 += " World"; - REQUIRE(str1 == "Hello World"); +TEST_CASE("Concatenation") +{ + String str1("Hello"); + str1 += " World"; + REQUIRE(str1 == "Hello World"); - String str2("Hello"); - String str3 = str2 + " World"; - REQUIRE(str3 == "Hello World"); + String str2("Hello"); + String str3 = str2 + " World"; + REQUIRE(str3 == "Hello World"); - String str4("Hello"); - str4 += std::string(" World"); - REQUIRE(str4 == "Hello World"); + String str4("Hello"); + str4 += std::string(" World"); + REQUIRE(str4 == "Hello World"); - String str5("Hello"); - String str6 = str5 + std::string(" World"); - REQUIRE(str6 == "Hello World"); + String str5("Hello"); + String str6 = str5 + std::string(" World"); + REQUIRE(str6 == "Hello World"); - String str7("Hello"); - str7 += String(" World"); - REQUIRE(str7 == "Hello World"); + String str7("Hello"); + str7 += String(" World"); + REQUIRE(str7 == "Hello World"); - String str8("Hello"); - String str9 = str8 + String(" World"); - REQUIRE(str9 == "Hello World"); + String str8("Hello"); + String str9 = str8 + String(" World"); + REQUIRE(str9 == "Hello World"); - String str10 = String("Hello") + " World"; - REQUIRE(str10 == "Hello World"); + String str10 = String("Hello") + " World"; + REQUIRE(str10 == "Hello World"); - String str11 = String("Hello") + std::string(" World"); - REQUIRE(str11 == "Hello World"); + String str11 = String("Hello") + std::string(" World"); + REQUIRE(str11 == "Hello World"); - String str12 = std::string("Hello") + String(" World"); - REQUIRE(str12 == "Hello World"); - } + String str12 = std::string("Hello") + String(" World"); + REQUIRE(str12 == "Hello World"); +} - SECTION("Comparison") - { - String str1("Hello"); - REQUIRE(str1 == "Hello"); - REQUIRE(str1 != "World"); +TEST_CASE("Comparison") +{ + String str1("Hello"); + REQUIRE(str1 == "Hello"); + REQUIRE(str1 != "World"); - String str2("World"); - REQUIRE(str2 == "World"); - REQUIRE(str2 != "Hello"); - } + String str2("World"); + REQUIRE(str2 == "World"); + REQUIRE(str2 != "Hello"); +} - SECTION("Trim") - { - String str1(" Hello World "); - REQUIRE(str1.Trim() == "Hello World"); - } +TEST_CASE("Trim") +{ + String str1(" Hello World "); + REQUIRE(str1.Trim() == "Hello World"); +} - SECTION("FindIndex") - { - String str1("Georg will save us all from our doom"); - REQUIRE(str1.FindStartIndexOf("save") == 11); - } +TEST_CASE("FindIndex") +{ + String str1("Georg will save us all from our doom"); + REQUIRE(str1.FindStartIndexOf("save") == 11); +} - SECTION("Upper/Lower") - { - String str1("Hello World"); - str1.ToUpper(); - REQUIRE(str1 == "HELLO WORLD"); +TEST_CASE("Upper/Lower") +{ + String str1("Hello World"); + str1.ToUpper(); + REQUIRE(str1 == "HELLO WORLD"); - String str2("Hello World"); - str2.ToLower(); - REQUIRE(str2 == "hello world"); - } + String str2("Hello World"); + str2.ToLower(); + REQUIRE(str2 == "hello world"); +} - SECTION("Substring") - { - String str1("Hello World"); - REQUIRE(str1.SubString(0, 5) == "Hello"); - REQUIRE(str1.SubString(6, 11) == "World"); - } +TEST_CASE("Substring") +{ + String str1("Hello World"); + REQUIRE(str1.SubString(0, 5) == "Hello"); + REQUIRE(str1.SubString(6, 11) == "World"); +} - SECTION("FromString") - { - String str1("42"); - REQUIRE(str1.FromString() == 42); +TEST_CASE("FromString") +{ + String str1("42"); + REQUIRE(str1.FromString() == 42); - String str2("42.42"); - REQUIRE(str2.FromString() == 42.42f); - } + String str2("42.42"); + REQUIRE(str2.FromString() == 42.42f); +} - SECTION("StartsWith") - { - String str1("Hello World"); - REQUIRE(str1.StartsWith("Hello")); - REQUIRE(!str1.StartsWith("World")); - } +TEST_CASE("StartsWith") +{ + String str1("Hello World"); + REQUIRE(str1.StartsWith("Hello")); + REQUIRE(!str1.StartsWith("World")); +} - SECTION("EndsWith") - { - String str1("Hello World"); - REQUIRE(str1.EndsWith("World")); - REQUIRE(!str1.EndsWith("Hello")); - } +TEST_CASE("EndsWith") +{ + String str1("Hello World"); + REQUIRE(str1.EndsWith("World")); + REQUIRE(!str1.EndsWith("Hello")); +} - SECTION("Contains") - { - String str1("Hello World"); - REQUIRE(str1.Contains("Hello")); - REQUIRE(str1.Contains("World")); - REQUIRE(!str1.Contains("Georg")); - } +TEST_CASE("Contains") +{ + String str1("Hello World"); + REQUIRE(str1.Contains("Hello")); + REQUIRE(str1.Contains("World")); + REQUIRE(!str1.Contains("Georg")); +} - SECTION("FindEndIndexOf") - { - String str1("Georg will save us all from our doom"); - REQUIRE(str1.FindEndIndexOf("save") == 11); - } +TEST_CASE("FindEndIndexOf") +{ + String str1("Georg will save us all from our doom"); + REQUIRE(str1.FindEndIndexOf("save") == 11); +} - SECTION("TrimFront") - { - String str1(" Hello World"); - REQUIRE(str1.TrimFront() == "Hello World"); - } +TEST_CASE("TrimFront") +{ + String str1(" Hello World"); + REQUIRE(str1.TrimFront() == "Hello World"); +} - SECTION("TrimBack") - { - String str1("Hello World "); - REQUIRE(str1.TrimBack() == "Hello World"); - } +TEST_CASE("TrimBack") +{ + String str1("Hello World "); + REQUIRE(str1.TrimBack() == "Hello World"); +} - SECTION("Empty") - { - String str1; - REQUIRE(str1.Empty()); - REQUIRE(!str1); +TEST_CASE("Empty") +{ + String str1; + REQUIRE(str1.Empty()); + REQUIRE(!str1); - String str2("Hello World"); - REQUIRE(!str2.Empty()); - REQUIRE(!!str2); - } + String str2("Hello World"); + REQUIRE(!str2.Empty()); + REQUIRE(!!str2); +} - SECTION("Size") - { - String str1("Hello World"); - REQUIRE(str1.Size() == 11); - } +TEST_CASE("Size") +{ + String str1("Hello World"); + REQUIRE(str1.Size() == 11); +} - SECTION("Capacity") - { - String str1("Hello World"); - REQUIRE(str1.Capacity() >= 11); - } +TEST_CASE("Capacity") +{ + String str1("Hello World"); + REQUIRE(str1.Capacity() >= 11); +} - SECTION("CharCount") - { - String str1("Hello World"); - REQUIRE(str1.CharCount() == 11); - } +TEST_CASE("CharCount") +{ + String str1("Hello World"); + REQUIRE(str1.CharCount() == 11); +} - SECTION("PopBack") - { - String str1("Hello World"); - str1.PopBack(); - REQUIRE(str1 == "Hello Worl"); - } +TEST_CASE("PopBack") +{ + String str1("Hello World"); + str1.PopBack(); + REQUIRE(str1 == "Hello Worl"); +} - SECTION("Clear") - { - String str1("Hello World"); - str1.Clear(); - REQUIRE(str1.Empty()); - } - - SECTION("ShrinkToFit") - { - String str1("Hello World"); - str1.ShrinkToFit(); - REQUIRE(str1.Capacity() == 15); // 11 + 4 null terminators due to sso - } -} \ No newline at end of file +TEST_CASE("Clear") +{ + String str1("Hello World"); + str1.Clear(); + REQUIRE(str1.Empty()); +} From b75fdc64588578ef95da1cbc3b898c1ebf5a1af8 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Thu, 17 Oct 2024 18:07:27 +0300 Subject: [PATCH 07/13] review fix for string --- openVulkanoCpp/Data/Containers/String.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index c6e6f03..629fc7e 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -61,12 +61,7 @@ namespace OpenVulkano template String operator+(const T& other) const { return m_string + other; } String operator+(const String& other) const { return m_string + other.m_string; } -#if defined(_HAS_CXX20) template int operator<=>(const T& other) const { return m_string <=> other; } -#endif - - template bool operator==(const T& other) const { return m_string == other; } - template bool operator!=(const T& other) const { return m_string != other; } explicit operator bool() const { return !m_string.empty(); } operator std::string() const { return m_string; } From 022cd2093ffb3d0bbec3333950a39774357051a6 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Thu, 17 Oct 2024 18:44:33 +0300 Subject: [PATCH 08/13] spaceship operator fix --- openVulkanoCpp/Data/Containers/String.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 629fc7e..05c70ff 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -61,7 +61,8 @@ namespace OpenVulkano template String operator+(const T& other) const { return m_string + other; } String operator+(const String& other) const { return m_string + other.m_string; } - template int operator<=>(const T& other) const { return m_string <=> other; } + template auto operator<=>(const T& other) const { return m_string <=> other; } + auto operator<=>(const String& other) const = default; explicit operator bool() const { return !m_string.empty(); } operator std::string() const { return m_string; } From dfa064399e27c8017a51c8af09de414722de9769 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Fri, 18 Oct 2024 18:36:32 +0300 Subject: [PATCH 09/13] more features on String --- openVulkanoCpp/Data/Containers/String.hpp | 157 +++++++++++++++++++--- tests/StringTest.cpp | 64 +++++++++ 2 files changed, 206 insertions(+), 15 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 05c70ff..6796a37 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -93,21 +94,10 @@ namespace OpenVulkano size_t FindStartIndexOf(const std::string_view& str) const { return m_string.find(str); } size_t FindEndIndexOf(const std::string_view& str) const { return m_string.rfind(str); } - String& Trim() noexcept + String Trim() noexcept { - size_t start = m_string.find_first_not_of(" \t\n\r"); - if (start == std::string::npos) - { - m_string.clear(); - return *this; - } - - size_t end = m_string.find_last_not_of(" \t\n\r"); - - m_string.erase(0, start); - m_string.resize(end - start + 1); - - return *this; + String trimmed = TrimBack(); + return trimmed.TrimFront(); } String& TrimFront() noexcept @@ -119,7 +109,7 @@ namespace OpenVulkano } else { - m_string.erase(0, start); + m_string.erase(0, start); } return *this; } @@ -138,6 +128,143 @@ namespace OpenVulkano return *this; } + std::vector Split(const std::string_view& delimiter) const + { + std::vector result; + size_t start = 0; + size_t end = m_string.find(delimiter); + while (end != std::string::npos) + { + result.push_back(m_string.substr(start, end - start)); + start = end + delimiter.size(); + end = m_string.find(delimiter, start); + } + result.push_back(m_string.substr(start, end)); + return result; + } + + std::pair SplitAtLastOccurrence(const std::string_view& delimiter) const + { + size_t end = m_string.rfind(delimiter); + if (end == std::string::npos) + { + return { m_string, "" }; + } + return { m_string.substr(0, end), m_string.substr(end + delimiter.size()) }; + } + + std::pair SplitAtFirstOccurrence(const std::string_view& delimiter) const + { + size_t end = m_string.find(delimiter); + if (end == std::string::npos) + { + return { m_string, "" }; + } + return { m_string.substr(0, end), m_string.substr(end + delimiter.size()) }; + } + + std::vector SplitAsStringViews(const std::string_view& delimiter) const + { + std::vector result; + size_t start = 0; + size_t end = m_string.find(delimiter); + while (end != std::string::npos) + { + result.push_back(std::string_view(m_string.c_str() + start, end - start)); + start = end + delimiter.size(); + end = m_string.find(delimiter, start); + } + result.push_back( + std::string_view(m_string.c_str() + start, m_string.size() - (start + end + delimiter.size()))); + return result; + } + + std::pair + SplitAtLastOccurenceAsStringViews(const std::string_view& delimiter) const + { + size_t end = m_string.rfind(delimiter); + if (end == std::string::npos) + { + return { m_string, "" }; + } + return { std::string_view(m_string.c_str(), end), + std::string_view(m_string.c_str() + end + delimiter.size(), + m_string.size() - end - delimiter.size()) }; + } + + std::pair + SplitAtFirstOccurenceAsStringViews(const std::string_view& delimiter) const + { + size_t end = m_string.find(delimiter); + if (end == std::string::npos) + { + return { m_string, "" }; + } + return { std::string_view(m_string.c_str(), end), + std::string_view(m_string.c_str() + end + delimiter.size(), + m_string.size() - end - delimiter.size()) }; + } + + static inline constexpr int64_t OctToInt(std::string_view string) + { + int64_t result = 0; + for (int i = 0; i < static_cast(string.length()); i++) + { + char c = string[i]; + if (c == 0) + { + break; + } + if (c == ' ') + { + continue; + } + if (c < '0' || c > '7') + { + return -1; + } + result = result * 8 + c - '0'; + } + return result; + } + + constexpr int64_t OctToInt() { return OctToInt(m_string); } + + static inline constexpr int64_t HexToInt(std::string string) + { + int64_t result = 0; + for (char c: string) + { + if (c == 0) + { + break; + } + if (c == ' ') + { + continue; + } + if (c >= '0' && c <= '9') + { + result = result * 16 + c - '0'; + } + else if (c >= 'A' && c <= 'F') + { + result = result * 16 + c - 'A' + 10; + } + else if (c >= 'a' && c <= 'f') + { + result = result * 16 + c - 'a' + 10; + } + else + { + return -1; + } + } + return result; + } + + constexpr int64_t HexToInt() { return HexToInt(m_string); } + void ToUpper() noexcept { std::transform(m_string.begin(), m_string.end(), m_string.begin(), diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index a14821b..5f2d7c3 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -215,3 +215,67 @@ TEST_CASE("Clear") str1.Clear(); REQUIRE(str1.Empty()); } + +TEST_CASE("Split") +{ + String str1("Hello,World"); + auto split = str1.Split(","); + REQUIRE(split.size() == 2); + REQUIRE(split[0] == "Hello"); + REQUIRE(split[1] == "World"); +} + +TEST_CASE("SplitAtLastOccurrence") +{ + String str1 = "Hello,World,Georg"; + auto split = str1.SplitAtLastOccurrence(","); + REQUIRE(split.first == "Hello,World"); + REQUIRE(split.second == "Georg"); +} + +TEST_CASE("SplitAtFirstOccurrence") +{ + String str1 = "Hello,World,Georg"; + auto split = str1.SplitAtFirstOccurrence(","); + REQUIRE(split.first == "Hello"); + REQUIRE(split.second == "World,Georg"); +} + +TEST_CASE("SplitAsStringViews") +{ + String str1("Hello,World"); + auto split = str1.SplitAsStringViews(","); + REQUIRE(split.size() == 2); + REQUIRE(split[0] == "Hello"); + REQUIRE(split[1] == "World"); +} + +TEST_CASE("SplitAtFirstOccurrenceAsStringViews") +{ + String str1 = "Hello,World,Georg"; + auto split = str1.SplitAtFirstOccurenceAsStringViews(","); + REQUIRE(split.first == "Hello"); + REQUIRE(split.second == "World,Georg"); +} + +TEST_CASE("SplitAtLastOccurenceAsStringViews") +{ + String str1 = "Hello,World,Georg"; + auto split = str1.SplitAtLastOccurenceAsStringViews(","); + REQUIRE(split.first == "Hello,World"); + REQUIRE(split.second == "Georg"); +} + +TEST_CASE("OctToInt") +{ + String str1("47"); + REQUIRE(str1.OctToInt() == 39); + REQUIRE(String::OctToInt("552") == 362); +} + +TEST_CASE("HexToInt") +{ + String str1("2A"); + REQUIRE(str1.HexToInt() == 42); + REQUIRE(String::HexToInt("FF") == 255); +} From 3d601d7d6639d7a4cdfe55bd2050fc48f258ce16 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Sat, 19 Oct 2024 17:05:09 +0300 Subject: [PATCH 10/13] fix for reviews on string --- openVulkanoCpp/Data/Containers/String.hpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 6796a37..5c5defe 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -96,8 +96,7 @@ namespace OpenVulkano String Trim() noexcept { - String trimmed = TrimBack(); - return trimmed.TrimFront(); + return TrimBack().TrimFront(); } String& TrimFront() noexcept @@ -205,7 +204,7 @@ namespace OpenVulkano m_string.size() - end - delimiter.size()) }; } - static inline constexpr int64_t OctToInt(std::string_view string) + static inline constexpr int64_t OctToInt(const std::string_view& string) { int64_t result = 0; for (int i = 0; i < static_cast(string.length()); i++) @@ -228,9 +227,9 @@ namespace OpenVulkano return result; } - constexpr int64_t OctToInt() { return OctToInt(m_string); } + constexpr int64_t OctToInt() const { return OctToInt(m_string); } - static inline constexpr int64_t HexToInt(std::string string) + static inline constexpr int64_t HexToInt(const std::string_view& string) { int64_t result = 0; for (char c: string) @@ -265,6 +264,11 @@ namespace OpenVulkano constexpr int64_t HexToInt() { return HexToInt(m_string); } + bool IsUrl(const std::string_view& str) + { + return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; + } + void ToUpper() noexcept { std::transform(m_string.begin(), m_string.end(), m_string.begin(), From 9fa25d6922097c64164a65da44b5f502493bbe47 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Sun, 20 Oct 2024 13:40:24 +0300 Subject: [PATCH 11/13] review fix for string.hpp --- .gitea/workflows/build_pc.yml | 6 +++--- openVulkanoCpp/Data/Containers/String.hpp | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitea/workflows/build_pc.yml b/.gitea/workflows/build_pc.yml index 781fdcf..8b8ef2d 100644 --- a/.gitea/workflows/build_pc.yml +++ b/.gitea/workflows/build_pc.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ windows_x64, ubuntu-latest, mac_arm ] + os: [ windows_x64, ubuntu-24.04, mac_arm ] steps: - name: Checkout @@ -24,13 +24,13 @@ jobs: with: submodules: true - name: Install Vulkan SDK - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-24.04' uses: humbletim/install-vulkan-sdk@v1.1.1 with: version: 1.3.250.1 cache: true - name: Install Dev Packages - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-24.04' run: > sudo apt update && sudo apt install -y extra-cmake-modules libwayland-dev libxkbcommon-dev xorg-dev libarchive-dev libassimp-dev ninja-build glslang-tools glslang-dev unzip zip libcurl4-openssl-dev libfreetype-dev libjpeg-turbo8-dev nasm && sudo wget https://sourceforge.net/projects/bin2c/files/1.1/bin2c-1.1.zip && sudo unzip bin2c-1.1.zip && cd bin2c && sudo gcc -o bin2c bin2c.c && sudo mv bin2c /usr/bin diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 5c5defe..57ae75b 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -94,10 +94,9 @@ namespace OpenVulkano size_t FindStartIndexOf(const std::string_view& str) const { return m_string.find(str); } size_t FindEndIndexOf(const std::string_view& str) const { return m_string.rfind(str); } - String Trim() noexcept - { - return TrimBack().TrimFront(); - } + String& Trim() noexcept { return TrimBack().TrimFront(); } + + [[nodiscard]] String Trim() const { return Trim(); } String& TrimFront() noexcept { @@ -264,11 +263,13 @@ namespace OpenVulkano constexpr int64_t HexToInt() { return HexToInt(m_string); } - bool IsUrl(const std::string_view& str) + static bool IsUrl(const std::string_view& str) { return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; } + bool IsUrl() const { return IsUrl(m_string); } + void ToUpper() noexcept { std::transform(m_string.begin(), m_string.end(), m_string.begin(), From b047a7c6c32e4c6b66194eee0131f35c59715c15 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Sun, 20 Oct 2024 14:02:40 +0300 Subject: [PATCH 12/13] consexpr deletion from string --- .gitea/workflows/build_pc.yml | 6 +++--- openVulkanoCpp/Data/Containers/String.hpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/build_pc.yml b/.gitea/workflows/build_pc.yml index 8b8ef2d..781fdcf 100644 --- a/.gitea/workflows/build_pc.yml +++ b/.gitea/workflows/build_pc.yml @@ -16,7 +16,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ windows_x64, ubuntu-24.04, mac_arm ] + os: [ windows_x64, ubuntu-latest, mac_arm ] steps: - name: Checkout @@ -24,13 +24,13 @@ jobs: with: submodules: true - name: Install Vulkan SDK - if: matrix.os == 'ubuntu-24.04' + if: matrix.os == 'ubuntu-latest' uses: humbletim/install-vulkan-sdk@v1.1.1 with: version: 1.3.250.1 cache: true - name: Install Dev Packages - if: matrix.os == 'ubuntu-24.04' + if: matrix.os == 'ubuntu-latest' run: > sudo apt update && sudo apt install -y extra-cmake-modules libwayland-dev libxkbcommon-dev xorg-dev libarchive-dev libassimp-dev ninja-build glslang-tools glslang-dev unzip zip libcurl4-openssl-dev libfreetype-dev libjpeg-turbo8-dev nasm && sudo wget https://sourceforge.net/projects/bin2c/files/1.1/bin2c-1.1.zip && sudo unzip bin2c-1.1.zip && cd bin2c && sudo gcc -o bin2c bin2c.c && sudo mv bin2c /usr/bin diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 57ae75b..933512e 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -203,7 +203,7 @@ namespace OpenVulkano m_string.size() - end - delimiter.size()) }; } - static inline constexpr int64_t OctToInt(const std::string_view& string) + static inline int64_t OctToInt(const std::string_view& string) { int64_t result = 0; for (int i = 0; i < static_cast(string.length()); i++) @@ -226,9 +226,9 @@ namespace OpenVulkano return result; } - constexpr int64_t OctToInt() const { return OctToInt(m_string); } + int64_t OctToInt() const { return OctToInt(m_string); } - static inline constexpr int64_t HexToInt(const std::string_view& string) + static inline int64_t HexToInt(const std::string_view& string) { int64_t result = 0; for (char c: string) @@ -261,7 +261,7 @@ namespace OpenVulkano return result; } - constexpr int64_t HexToInt() { return HexToInt(m_string); } + int64_t HexToInt() { return HexToInt(m_string); } static bool IsUrl(const std::string_view& str) { From 11ca0e93d7d92b4461b52f4e3a7ade01fc829279 Mon Sep 17 00:00:00 2001 From: Metehan Tuncbilek Date: Mon, 21 Oct 2024 12:35:45 +0300 Subject: [PATCH 13/13] another adjustments for string --- openVulkanoCpp/Data/Containers/String.hpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/openVulkanoCpp/Data/Containers/String.hpp b/openVulkanoCpp/Data/Containers/String.hpp index 933512e..b74ddd3 100644 --- a/openVulkanoCpp/Data/Containers/String.hpp +++ b/openVulkanoCpp/Data/Containers/String.hpp @@ -27,6 +27,7 @@ namespace OpenVulkano 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(std::string&& other) noexcept : m_string(std::move(other)) {} ~String() = default; template String& operator=(const T& other) @@ -41,24 +42,32 @@ namespace OpenVulkano return *this; } - template String& operator=(const String& other) + String& operator=(const String& other) { m_string = other.m_string; return *this; } + String& operator=(String&& other) + { + m_string = std::move(other.m_string); + return *this; + } + template String& operator+=(const T& other) { m_string += other; return *this; } - template String& operator+=(const String& other) + 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; } @@ -96,7 +105,7 @@ namespace OpenVulkano String& Trim() noexcept { return TrimBack().TrimFront(); } - [[nodiscard]] String Trim() const { return Trim(); } + [[nodiscard]] String Trim() const { return Trim(); } String& TrimFront() noexcept { @@ -203,7 +212,7 @@ namespace OpenVulkano m_string.size() - end - delimiter.size()) }; } - static inline int64_t OctToInt(const std::string_view& string) + static inline int64_t OctToInt(const std::string_view& string) { int64_t result = 0; for (int i = 0; i < static_cast(string.length()); i++) @@ -263,7 +272,7 @@ namespace OpenVulkano int64_t HexToInt() { return HexToInt(m_string); } - static bool IsUrl(const std::string_view& str) + static constexpr bool IsUrl(const std::string_view& str) { return str.find("http://") == 0 || str.find("https://") == 0 || str.find("ftp://") == 0; }