19#if __has_include(<fmt/format.h>)
21#include <fmt/format.h>
26 template<
typename T,
typename CharTraits = std::
char_traits<T>,
typename RawAllocator = DefaultAllocator>
class BasicString;
27 template<
typename T,
typename CharTraits = std::
char_traits<T>>
class BasicStringView;
29 template<
typename Self,
typename T,
typename CharTraits>
45 template<
typename U,
typename... Args> [[
nodiscard]]
U to(Args&&... args)
const;
52 const Self&
self()
const {
return static_cast<const Self&
>(*this); }
55 Self&
self() {
return static_cast<Self&
>(*this); }
59 template<
typename T,
typename CharTraits,
typename RawAllocator>
60 class BasicString :
public std::basic_string<T, CharTraits, StdAllocator<T, RawAllocator>>,
public BasicStringBase<BasicString<T, CharTraits, RawAllocator>, T, CharTraits> {
61 using super = std::basic_string<T, CharTraits, StdAllocator<T, RawAllocator>>;
74 using super::operator=;
79#if defined(CE_HAS_FMT)
82 template<
typename... Args>
inline BasicString format(Args&&... args) {
83 return fromString(this->get_allocator(), *
this, std::forward<Args>(args)...);
87 template<
typename S,
typename... Args>
requires(std::is_same_v<fmt::char_t<S>,
T>)
90 string.reserve(fmt::formatted_size(fmt::detail::to_string_view(format), args...));
91 fmt::format_to(std::back_inserter(
string), fmt::detail::to_string_view(format), std::forward<Args>(args)...);
96 template<
typename S,
typename... Args>
requires(std::is_same_v<fmt::char_t<S>,
T>)
98 BasicString string(allocator);
99 string.reserve(fmt::formatted_size(fmt::detail::to_string_view(format), args...));
100 fmt::format_to(std::back_inserter(
string), fmt::detail::to_string_view(format), std::forward<Args>(args)...);
108 template<
typename U,
typename... Args> [[
nodiscard]]
static decltype(
auto)
from(
U value, Args&&... args);
118 template<
typename T,
typename CharTraits,
typename RawAllocator>
120 using super = std::basic_string<T, CharTraits, StdAllocator<T, RawAllocator>>;
124 template<
typename T,
typename CharTraits,
typename RawAllocator>
126 using super = std::basic_string<T, CharTraits, StdAllocator<T, RawAllocator>>;
135 template<
typename T,
typename CharTraits>
class BasicStringView :
public std::basic_string_view<T, CharTraits>,
public BasicStringBase<BasicStringView<T, CharTraits>, T, CharTraits> {
136 using super = std::basic_string_view<T, CharTraits>;
155 template<
typename Self,
typename T,
typename CharTraits>
157 return self().find(text) != Self::npos;
206 template<
typename T>
struct CiCharTraits :
public std::char_traits<T> {
207 static bool eq(
T c1,
T c2) {
return std::toupper(
c1) == std::toupper(
c2); }
208 static bool ne(
T c1,
T c2) {
return std::toupper(
c1) != std::toupper(
c2); }
209 static bool lt(
T c1,
T c2) {
return std::toupper(
c1) < std::toupper(
c2); }
213 if(std::toupper(*
s1) < std::toupper(*
s2)) {
217 if(std::toupper(*
s1) > std::toupper(*
s2)) {
228 const auto ua = std::toupper(a);
230 if(std::toupper(*
s) ==
ua) {
322 using namespace std::string_literals;
323 using namespace std::string_view_literals;
325 inline String operator"" _s(
const char* str,
const size_t length) {
return String(str, length); }
339#define CE_STRING_CONVERSION_DECL(T) \
340 template<> struct StringConversion<T> { \
341 static String toString(T val, unsigned short width = 0, char fill = ' '); \
342 static T fromString(StringView string, T defaultValue = 0); \
357#undef CE_STRING_CONVERSION_DECL
368 template<
typename T,
typename U>
concept CSame = std::is_same_v<T, U>;
375 static decltype(
auto)
toString(
const T& value) {
return value.toString(); }
380 template<
typename T>
concept ConvertibleToString =
requires(
T value) { StringConversion<T>::toString(value); };
384 template<
typename T,
typename CharTraits,
typename RawAllocator>
385 template<
typename U,
typename... Args>
399 template<
typename Self,
typename T,
typename CharTraits>
400 template<
typename U,
typename... Args>
407 template<
typename Self,
typename T,
typename CharTraits>
408 template<
typename Func>
410 using SizeT =
typename Self::size_type;
416 for(
SizeT i = 0;
i < view.size();
i++) {
427 func(view.substr(index, length));
439 func(view.substr(index, length));
442 template<
typename Self,
typename T,
typename CharTraits>
443 template<
typename Func>
445 using SizeT =
typename Self::size_type;
451 for(
SizeT i = 0;
i < view.size();
i++) {
459 func(view.substr(index, length));
475 return std::move(lhs.append(rhs));
#define CE_EXPLICIT(EXPR)
Definition Macros.hpp:413
#define CE_STRING_CONVERSION_DECL(T)
Definition String.hpp:339
Self & self()
Converts a BasicStringBase into the underlying Type.
Definition String.hpp:55
StringViewType view() const
Converts a BasicStringBase into a StringViewType.
Definition String.hpp:49
BasicStringView< T, CharTraits > StringViewType
Definition String.hpp:33
bool contains(const BasicStringView< T, CharTraits > &text) const
Definition String.hpp:156
U to(Args &&... args) const
Converts the string into it's object representation.
Definition String.hpp:401
void split(const StringViewType delimiter, Func &&func, bool skipEmpty=false) const
Definition String.hpp:409
void split(const T delimiter, Func &&func) const
Definition String.hpp:444
const Self & self() const
Converts a BasicStringBase into the underlying Type.
Definition String.hpp:52
Basic string that uses framework's memory allocators.
Definition String.hpp:60
BasicString(const BasicString &str)=default
static decltype(auto) from(U value, Args &&... args)
Converts a value into it's string representation.
Definition String.hpp:386
BasicString & operator=(BasicString &&str)=default
BasicString(BasicString &&str) noexcept=default
BasicString & operator=(const BasicString &str)=default
std::basic_string< T, CharTraits, StdAllocator< T, RawAllocator > > super
Definition String.hpp:61
Basic string view.
Definition String.hpp:135
constexpr BasicStringView(const BasicString< T, CharTraits, RawAllocator > &string)
Definition String.hpp:139
std::basic_string_view< T, CharTraits > super
Definition String.hpp:136
A concept that checks if the type T can be converted from a StringView by using a StringConverter.
Definition String.hpp:393
A concept that checks if the type T is convertible to a String by using a StringConverter.
Definition String.hpp:380
Definition String.hpp:368
Definition String.hpp:370
Definition Application.hpp:19
std::uint64_t UInt64
Definition DataTypes.hpp:26
BasicStringView< char > StringView
Narrow string view used for handling narrow encoded text in UTF-8.
Definition String.hpp:190
CiBasicStringView< T > toCaseInsensitive(const BasicString< T, RawAllocator > &view)
Definition String.hpp:294
foonathan::memory::temporary_allocator TemporaryAllocator
Definition Allocator.hpp:110
auto move(Vector3 position)
Moves a entity to the given position.
Definition Helpers.hpp:22
std::int32_t Int32
Definition DataTypes.hpp:21
std::uint16_t UInt16
Definition DataTypes.hpp:20
std::uint8_t UInt8
Definition DataTypes.hpp:17
std::int64_t Int64
Definition DataTypes.hpp:24
BasicStringView< T > toCaseSensitive(const CiBasicString< T, RawAllocator > &view)
Definition String.hpp:303
std::uint32_t UInt32
Definition DataTypes.hpp:23
BasicString< T, CharTraits, RawAllocator > operator+(const BasicString< T, CharTraits, RawAllocator > &lhs, const T *rhs)
Definition String.hpp:119
BasicString< char > String
Narrow string used for handling narrow encoded text in UTF-8.
Definition String.hpp:163
std::int8_t Int8
Definition DataTypes.hpp:15
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
std::int16_t Int16
Definition DataTypes.hpp:18
Case insensitive character traits structure.
Definition String.hpp:206
static const T * find(const T *s, int n, T a)
Definition String.hpp:227
static int compare(const T *s1, const T *s2, size_t n)
Definition String.hpp:211
static bool lt(T c1, T c2)
Definition String.hpp:209
static bool ne(T c1, T c2)
Definition String.hpp:208
static bool eq(T c1, T c2)
Definition String.hpp:207
static T fromString(StringView string, const T &defaultValue=false)
Definition String.hpp:364
static String toString(const T &value)
Definition String.hpp:363
static decltype(auto) toString(const T &value)
Definition String.hpp:375
static bool fromString(StringView string, bool defaultValue=false)
static String toString(bool value)
A template that can be specialized to implement toString and fromString.
Definition String.hpp:331
Definition String.hpp:314
size_t length
Definition String.hpp:316
char value[N]
Definition String.hpp:315
constexpr StringLiteral(const char(&str)[N])
Definition String.hpp:317