Files
OpenVulkano/openVulkanoCpp/Data/Containers/String.hpp
2024-10-16 14:02:10 +03:00

123 lines
3.1 KiB
C++

/*
* 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 <string>
#include <c4/substr.hpp>
#include <c4/substr_fwd.hpp>
#include <c4/format.hpp>
#include <c4/charconv.hpp>
#include <type_traits>
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<typename T> String& operator=(const T& other)
{
m_string = other;
return *this;
}
template<typename T> String& operator=(T&& other)
{
m_string = std::move(other);
return *this;
}
template<typename T> String& operator+=(const T& other)
{
m_string += other;
return *this;
}
template<typename T> String operator+(const T& other) const { return m_string + other; }
String operator+(const String& other) const { return m_string + other.m_string; }
template<typename T> bool operator==(const T& other) const { return m_string == other; }
template<typename T> bool operator!=(const T& other) const { return m_string != other; }
operator std::string() const { return m_string; }
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(); }
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); }
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;
}
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<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>> 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;
};
template<typename T> String operator+(const T& lhs, const String& rhs) noexcept { return lhs + rhs; }
}