LiteFX 0.4.1.2025
Computer Graphics Engine
Loading...
Searching...
No Matches
string.hpp
1#pragma once
2
3#include <string>
4#include <string_view>
5#include <iterator>
6#include <vector>
7#include <stdexcept>
8#include <algorithm>
9#include <ranges>
10
11#if defined _WIN32 || defined WINCE
12#define LITEFX_CODECVT_USE_WIN32
13#include <Windows.h>
14#else
15// Continue using std::codecvt for now, since other platforms than Win32 are currently unsupported anyway.
16#include <codecvt>
17#endif
18
19namespace LiteFX {
20
21 using namespace std::string_literals;
22 using namespace std::string_view_literals;
23
24 using String = std::string;
25 using WString = std::wstring;
26 using StringView = std::string_view;
27 using WStringView = std::wstring_view;
28
29 constexpr auto Join(std::ranges::input_range auto&& elements, StringView delimiter = ""sv) requires
30 std::convertible_to<std::ranges::range_value_t<decltype(elements)>, String>
31 {
32 return std::ranges::fold_left(elements | std::views::join_with(delimiter), String{}, std::plus<>{});
33 }
34
35 constexpr auto WJoin(std::ranges::input_range auto&& elements, WStringView delimiter = L""sv) requires
36 std::convertible_to<std::ranges::range_value_t<decltype(elements)>, String>
37 {
38 return std::ranges::fold_left(elements | std::views::join_with(delimiter), WString{}, std::plus<>{});
39 }
40
46 constexpr static std::uint64_t hash(StringView string) noexcept
47 {
48 const std::uint64_t prime = 0x00000100000001b3;
49 std::uint64_t seed = 0xcbf29ce484222325; // NOLINT
50
51 for (auto ptr = string.begin(); ptr != string.end(); ptr++)
52 seed = (seed ^ *ptr) * prime;
53
54 return seed;
55 }
56
62 constexpr static std::uint64_t hash(WStringView string) noexcept
63 {
64 const std::uint64_t prime = 0x00000100000001b3;
65 std::uint64_t seed = 0xcbf29ce484222325; // NOLINT
66
67 for (auto ptr = string.begin(); ptr != string.end(); ptr++)
68 seed = (seed ^ *ptr) * prime;
69
70 return seed;
71 }
72
79 consteval std::uint64_t operator"" _hash(const char* string, size_t chars) noexcept
80 {
81 return hash(StringView(string, chars));
82 }
83
90 consteval std::uint64_t operator"" _hash(const wchar_t* string, size_t chars) noexcept
91 {
92 return hash(WStringView(string, chars));
93 }
94
101 {
102#if defined LITEFX_CODECVT_USE_WIN32
103 if (utf8.empty())
104 return L"";
105
106 const auto size = ::MultiByteToWideChar(CP_UTF8, 0, utf8.data(), static_cast<int>(utf8.size()), nullptr, 0);
107
108 if (size <= 0)
109 throw std::runtime_error("Unable to convert string to UTF-16: " + std::to_string(size));
110
111 WString result(size, 0);
112 ::MultiByteToWideChar(CP_UTF8, 0, utf8.data(), static_cast<int>(utf8.size()), result.data(), size);
113
114 return result;
115#else
116 std::wstring_convert<std::codecvt_utf8_utf16<WCHAR>> conv;
117 return conv.from_bytes(utf8);
118#endif
119 }
120
127 {
128#if defined LITEFX_CODECVT_USE_WIN32
129 if (utf16.empty())
130 return "";
131
132 const auto size = ::WideCharToMultiByte(CP_UTF8, 0, utf16.data(), static_cast<int>(utf16.size()), nullptr, 0, nullptr, nullptr);
133
134 if (size <= 0)
135 throw std::runtime_error("Unable to convert string to UTF-8: " + std::to_string(size));
136
137 String result(size, 0);
138 ::WideCharToMultiByte(CP_UTF8, 0, utf16.data(), static_cast<int>(utf16.size()), result.data(), size, nullptr, nullptr);
139
140 return result;
141#else
142 std::wstring_convert<std::codecvt_utf8_utf16<WCHAR>> conv;
143 return conv.to_bytes(utf16);
144#endif
145 }
146}
147
148#undef LITEFX_CODECVT_USE_WIN32
Definition app.hpp:6
String Narrow(WStringView utf16)
Converts an UTF-16 multi-byte encoded string into an UTF-8 representation.
Definition string.hpp:126
WString Widen(StringView utf8)
Converts an UTF-8 single-byte encoded string into an UTF-16 representation.
Definition string.hpp:100
constexpr auto Join(std::ranges::input_range auto &&elements, StringView delimiter=""sv)
Definition string.hpp:29
std::string String
Definition string.hpp:24
constexpr auto WJoin(std::ranges::input_range auto &&elements, WStringView delimiter=L""sv)
Definition string.hpp:35
std::string_view StringView
Definition string.hpp:26
std::wstring_view WStringView
Definition string.hpp:27
std::wstring WString
Definition string.hpp:25