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>
69 template<
class usings_
char_traits_t>
72 static constexpr
typename usings_char_traits_t::size_type align() noexcept
77 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
82 static constexpr
bool shrink_to_fit_when_small() noexcept
88 template<
class usings_
char_traits_t>
91 static constexpr
typename usings_char_traits_t::size_type align() noexcept
96 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
107 static constexpr
bool shrink_to_fit_when_small() noexcept
113 template<
class value_t,
class usings_
char_traits_t>
116 template<
class usings_
char_traits_t>
119 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
125 template<
class usings_
char_traits_t>
129 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
141 template<
class value_t,
class usings_
char_traits_t>
144 template<
class usings_
char_traits_t>
147 static constexpr
typename usings_char_traits_t::size_type align() noexcept
152 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
158 template<
class usings_
char_traits_t>
162 static constexpr
typename usings_char_traits_t::size_type align() noexcept
167 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
183 template<
class value_t,
class usings_
char_traits_t>
186 template<
class value_t>
189 static bool is_eng_alpha(value_t ch) noexcept
196 template<
class usings_
char_traits_t>
199 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
201 return std::isspace(
static_cast<int>(ch)) != 0;
204 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
206 return std::isdigit(ch) != 0;
210 template<
class usings_
char_traits_t>
213 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
215 return std::iswspace(
static_cast<wint_t
>(ch)) != 0;
218 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
220 return std::iswdigit(ch) != 0;
228 template<
class value_t,
class usings_
char_traits_t>
231 template<
class usings_
char_traits_t>
234 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
236 return static_cast<char>(std::tolower(ch));
239 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
241 return static_cast<char>(std::toupper(ch));
245 template<
class usings_
char_traits_t>
248 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
250 return std::towlower(ch);
253 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
255 return std::towupper(ch);
263 template<
class value_t,
class usings_
char_traits_t>
266 template<
class usings_
char_traits_t>
269 static constexpr
typename usings_char_traits_t::size_type length(
270 typename usings_char_traits_t::const_pointer pszStr) noexcept
272 if (std::is_constant_evaluated())
273 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
275 return static_cast<typename usings_char_traits_t::size_type
>(std::strlen(pszStr));
279 template<
class usings_
char_traits_t>
282 static constexpr
typename usings_char_traits_t::size_type length(
283 typename usings_char_traits_t::const_pointer pszStr) noexcept
285 if (std::is_constant_evaluated())
286 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
288 return static_cast<typename usings_char_traits_t::size_type
>(std::wcslen(pszStr));
296 template<
class value_t,
class usings_
char_traits_t>
299 template<
class usings_
char_traits_t>
303 typename usings_char_traits_t::const_pointer pszFirst,
304 typename usings_char_traits_t::const_pointer pszSecond) noexcept
306 return std::strcmp(pszFirst, pszSecond);
309 static int compare_n(
310 typename usings_char_traits_t::const_pointer pszFirst,
311 typename usings_char_traits_t::const_pointer pszSecond,
312 typename usings_char_traits_t::size_type nCount) noexcept
314 return std::strncmp(pszFirst, pszSecond, nCount);
318 template<
class usings_
char_traits_t>
322 typename usings_char_traits_t::const_pointer pszFirst,
323 typename usings_char_traits_t::const_pointer pszSecond) noexcept
325 return std::wcscmp(pszFirst, pszSecond);
328 static int compare_n(
329 typename usings_char_traits_t::const_pointer pszFirst,
330 typename usings_char_traits_t::const_pointer pszSecond,
331 typename usings_char_traits_t::size_type nCount) noexcept
333 return std::wcsncmp(pszFirst, pszSecond, nCount);
341 template<
class value_t,
class usings_
char_traits_t>
344 template<
class... args_t>
345 using format_string = std::basic_format_string<value_t, args_t...>;
352 template<
class value_t,
class usings_
char_traits_t>
355 template<
class usings_
char_traits_t>
358 template<
class... args_t>
360 typename usings_char_traits_t::const_pointer pszString,
361 typename usings_char_traits_t::const_pointer pszFormat,
362 args_t&&... args) noexcept
364 QX_PUSH_SUPPRESS_ALL_WARNINGS();
365 return std::sscanf(pszString, pszFormat, std::forward<args_t>(args)...);
366 QX_POP_SUPPRESS_WARNINGS();
369 template<
class output_it_t,
class... args_t>
370 static void format_to(
371 output_it_t itOutput,
372 typename usings_char_traits_t::string_view_type svFormat,
375 std::vformat_to(itOutput, svFormat, std::make_format_args(args...));
379 template<
class usings_
char_traits_t>
382 template<
class... args_t>
384 typename usings_char_traits_t::const_pointer pszString,
385 typename usings_char_traits_t::const_pointer pszFormat,
386 args_t&&... args) noexcept
388 QX_PUSH_SUPPRESS_ALL_WARNINGS();
389 return std::swscanf(pszString, pszFormat, std::forward<args_t>(args)...);
390 QX_POP_SUPPRESS_WARNINGS();
393 template<
class output_it_t,
class... args_t>
394 static void format_to(
395 output_it_t itOutput,
396 typename usings_char_traits_t::string_view_type svFormat,
399 std::vformat_to(itOutput, svFormat, std::make_wformat_args(args...));
403 template<
class... args_t>
412 template<
class value_t>
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