23 namespace qx::string_traits
28 template<
class value_t>
31 using value_type = value_t;
32 using pointer = value_t*;
33 using const_pointer =
const value_t*;
34 using reference = value_t&;
35 using const_reference =
const value_t&;
36 using difference_type = std::ptrdiff_t;
37 using size_type = size_t;
38 using string_view_type = basic_string_view<value_t>;
45 template<
class value_t,
class usings_
char_traits_t>
48 static constexpr
typename usings_char_traits_t::size_type hash_function(
49 typename usings_char_traits_t::const_pointer pszStr,
51 typename usings_char_traits_t::size_type nLen) noexcept
56 static constexpr
u32 hash_seed() noexcept
66 template<
class value_t,
class usings_
char_traits_t,
size_t nSmallStringBytes,
bool bShrinkToFitWhenSmall>
67 requires(nSmallStringBytes %
sizeof(value_t) == 0)
68 struct allocation_traits
70 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
72 return nSmallStringBytes /
sizeof(value_t);
75 static constexpr
bool shrink_to_fit_when_small() noexcept
77 return bShrinkToFitWhenSmall;
85 template<
class value_t,
class usings_
char_traits_t>
88 template<
class value_t>
91 static bool is_eng_alpha(value_t ch) noexcept
98 template<
class usings_
char_traits_t>
101 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
103 return std::isspace(
static_cast<int>(ch)) != 0;
106 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
108 return std::isdigit(ch) != 0;
112 template<
class usings_
char_traits_t>
115 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
117 return std::iswspace(
static_cast<wint_t
>(ch)) != 0;
120 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
122 return std::iswdigit(ch) != 0;
130 template<
class value_t,
class usings_
char_traits_t>
133 template<
class usings_
char_traits_t>
136 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
138 return static_cast<char>(std::tolower(ch));
141 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
143 return static_cast<char>(std::toupper(ch));
147 template<
class usings_
char_traits_t>
150 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
152 return std::towlower(ch);
155 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
157 return std::towupper(ch);
165 template<
class value_t,
class usings_
char_traits_t>
168 template<
class usings_
char_traits_t>
171 static constexpr
typename usings_char_traits_t::size_type length(
172 typename usings_char_traits_t::const_pointer pszStr) noexcept
174 if (std::is_constant_evaluated())
175 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
177 return static_cast<typename usings_char_traits_t::size_type
>(std::strlen(pszStr));
181 template<
class usings_
char_traits_t>
184 static constexpr
typename usings_char_traits_t::size_type length(
185 typename usings_char_traits_t::const_pointer pszStr) noexcept
187 if (std::is_constant_evaluated())
188 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
190 return static_cast<typename usings_char_traits_t::size_type
>(std::wcslen(pszStr));
198 template<
class value_t,
class usings_
char_traits_t>
201 template<
class usings_
char_traits_t>
205 typename usings_char_traits_t::const_pointer pszFirst,
206 typename usings_char_traits_t::const_pointer pszSecond) noexcept
208 return std::strcmp(pszFirst, pszSecond);
211 static int compare_n(
212 typename usings_char_traits_t::const_pointer pszFirst,
213 typename usings_char_traits_t::const_pointer pszSecond,
214 typename usings_char_traits_t::size_type nCount) noexcept
216 return std::strncmp(pszFirst, pszSecond, nCount);
220 template<
class usings_
char_traits_t>
224 typename usings_char_traits_t::const_pointer pszFirst,
225 typename usings_char_traits_t::const_pointer pszSecond) noexcept
227 return std::wcscmp(pszFirst, pszSecond);
230 static int compare_n(
231 typename usings_char_traits_t::const_pointer pszFirst,
232 typename usings_char_traits_t::const_pointer pszSecond,
233 typename usings_char_traits_t::size_type nCount) noexcept
235 return std::wcsncmp(pszFirst, pszSecond, nCount);
243 template<
class value_t,
class usings_
char_traits_t>
246 template<
class... args_t>
247 using format_string = QX_FMT_NS::basic_format_string<value_t, args_t...>;
254 template<
class value_t,
class usings_
char_traits_t>
257 template<
class usings_
char_traits_t>
260 static constexpr
typename usings_char_traits_t::size_type nMemoryBufferSize = 1024;
262 template<
class... args_t>
263 static auto make_format_args(args_t&... args)
265 return QX_FMT_NS::make_format_args(args...);
268 template<
class... args_t>
270 typename usings_char_traits_t::const_pointer pszString,
271 typename usings_char_traits_t::const_pointer pszFormat,
272 args_t&&... args) noexcept
274 QX_PUSH_SUPPRESS_ALL_WARNINGS();
275 return std::sscanf(pszString, pszFormat, std::forward<args_t>(args)...);
276 QX_POP_SUPPRESS_WARNINGS();
280 template<
class usings_
char_traits_t>
283 static constexpr
typename usings_char_traits_t::size_type nMemoryBufferSize =
290 template<
class... args_t>
291 static auto make_format_args(args_t&... args)
293 return QX_FMT_NS::make_wformat_args(args...);
296 template<
class... args_t>
298 typename usings_char_traits_t::const_pointer pszString,
299 typename usings_char_traits_t::const_pointer pszFormat,
300 args_t&&... args) noexcept
302 QX_PUSH_SUPPRESS_ALL_WARNINGS();
303 return std::swscanf(pszString, pszFormat, std::forward<args_t>(args)...);
304 QX_POP_SUPPRESS_WARNINGS();
315 class allocation_traits_t = allocation_traits<value_t, usings_traits_t, 64, false>,
324 template<
class... args_t>
335 transform_char_traits_t,
338 format_string_traits_t,
344 template<
class trait_overr
ide_t>
351 transform_char_traits_t,
354 format_string_traits_t,
357 template<
class trait_overr
ide_t>
364 transform_char_traits_t,
367 format_string_traits_t,
370 template<
class trait_overr
ide_t>
377 transform_char_traits_t,
380 format_string_traits_t,
383 template<
class trait_overr
ide_t>
390 transform_char_traits_t,
393 format_string_traits_t,
396 template<
class trait_overr
ide_t>
406 format_string_traits_t,
409 template<
class trait_overr
ide_t>
416 transform_char_traits_t,
419 format_string_traits_t,
422 template<
class trait_overr
ide_t>
429 transform_char_traits_t,
432 format_string_traits_t,
435 template<
class trait_overr
ide_t>
442 transform_char_traits_t,
448 template<
class trait_overr
ide_t>
455 transform_char_traits_t,
458 format_string_traits_t,
464 template<
class value_t>
467 template<
class traits_t>
472 template<
class value_t>
474 allocation_traits<value_t, usings_traits<value_t>, 32,
false>>::type;
476 template<
class value_t>
478 allocation_traits<value_t, usings_traits<value_t>, 128,
false>>::type;
480 template<
class value_t>
482 allocation_traits<value_t, usings_traits<value_t>, 256,
false>>::type;
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.
constexpr size_t djb2a_hash(const value_t *pszStr, size_t nSeed, size_t nLen)
djb2a hash
#define QX_CHAR_PREFIX(value_t, ch)
Chose witch of prefixes add to char : L or none.
constexpr std::size_t strlen(const value_t *psz)
Naive but constexpr string length algorithm, for runtime prefer std::strlen as there are may be a lot...
std::uint32_t u32
0 .. 18 446 744 073 709 551 615