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 small_string_size() noexcept
77 static constexpr
bool shrink_to_fit_when_small() noexcept
83 template<
class usings_
char_traits_t>
86 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
97 static constexpr
bool shrink_to_fit_when_small() noexcept
103 template<
class value_t,
class usings_
char_traits_t>
106 template<
class usings_
char_traits_t>
109 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
115 template<
class usings_
char_traits_t>
119 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
131 template<
class value_t,
class usings_
char_traits_t>
134 template<
class usings_
char_traits_t>
137 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
143 template<
class usings_
char_traits_t>
147 static constexpr
typename usings_char_traits_t::size_type small_string_size() noexcept
163 template<
class value_t,
class usings_
char_traits_t>
166 template<
class value_t>
169 static bool is_eng_alpha(value_t ch) noexcept
176 template<
class usings_
char_traits_t>
179 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
181 return std::isspace(
static_cast<int>(ch)) != 0;
184 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
186 return std::isdigit(ch) != 0;
190 template<
class usings_
char_traits_t>
193 static bool is_space(
typename usings_char_traits_t::value_type ch) noexcept
195 return std::iswspace(
static_cast<wint_t
>(ch)) != 0;
198 static bool is_digit(
typename usings_char_traits_t::value_type ch) noexcept
200 return std::iswdigit(ch) != 0;
208 template<
class value_t,
class usings_
char_traits_t>
211 template<
class usings_
char_traits_t>
214 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
216 return static_cast<char>(std::tolower(ch));
219 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
221 return static_cast<char>(std::toupper(ch));
225 template<
class usings_
char_traits_t>
228 static typename usings_char_traits_t::value_type to_lower(
typename usings_char_traits_t::value_type ch) noexcept
230 return std::towlower(ch);
233 static typename usings_char_traits_t::value_type to_upper(
typename usings_char_traits_t::value_type ch) noexcept
235 return std::towupper(ch);
243 template<
class value_t,
class usings_
char_traits_t>
246 template<
class usings_
char_traits_t>
249 static constexpr
typename usings_char_traits_t::size_type length(
250 typename usings_char_traits_t::const_pointer pszStr) noexcept
252 if (std::is_constant_evaluated())
253 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
255 return static_cast<typename usings_char_traits_t::size_type
>(std::strlen(pszStr));
259 template<
class usings_
char_traits_t>
262 static constexpr
typename usings_char_traits_t::size_type length(
263 typename usings_char_traits_t::const_pointer pszStr) noexcept
265 if (std::is_constant_evaluated())
266 return static_cast<typename usings_char_traits_t::size_type
>(
qx::strlen(pszStr));
268 return static_cast<typename usings_char_traits_t::size_type
>(std::wcslen(pszStr));
276 template<
class value_t,
class usings_
char_traits_t>
279 template<
class usings_
char_traits_t>
283 typename usings_char_traits_t::const_pointer pszFirst,
284 typename usings_char_traits_t::const_pointer pszSecond) noexcept
286 return std::strcmp(pszFirst, pszSecond);
289 static int compare_n(
290 typename usings_char_traits_t::const_pointer pszFirst,
291 typename usings_char_traits_t::const_pointer pszSecond,
292 typename usings_char_traits_t::size_type nCount) noexcept
294 return std::strncmp(pszFirst, pszSecond, nCount);
298 template<
class usings_
char_traits_t>
302 typename usings_char_traits_t::const_pointer pszFirst,
303 typename usings_char_traits_t::const_pointer pszSecond) noexcept
305 return std::wcscmp(pszFirst, pszSecond);
308 static int compare_n(
309 typename usings_char_traits_t::const_pointer pszFirst,
310 typename usings_char_traits_t::const_pointer pszSecond,
311 typename usings_char_traits_t::size_type nCount) noexcept
313 return std::wcsncmp(pszFirst, pszSecond, nCount);
321 template<
class value_t,
class usings_
char_traits_t>
324 template<
class... args_t>
325 using format_string = QX_FMT_NS::basic_format_string<value_t, args_t...>;
332 template<
class value_t,
class usings_
char_traits_t>
335 template<
class usings_
char_traits_t>
338 static constexpr
typename usings_char_traits_t::size_type nMemoryBufferSize = 1024;
340 template<
class... args_t>
341 static auto make_format_args(args_t&... args)
343 return QX_FMT_NS::make_format_args(args...);
346 template<
class... args_t>
348 typename usings_char_traits_t::const_pointer pszString,
349 typename usings_char_traits_t::const_pointer pszFormat,
350 args_t&&... args) noexcept
352 QX_PUSH_SUPPRESS_ALL_WARNINGS();
353 return std::sscanf(pszString, pszFormat, std::forward<args_t>(args)...);
354 QX_POP_SUPPRESS_WARNINGS();
358 template<
class usings_
char_traits_t>
361 static constexpr
typename usings_char_traits_t::size_type nMemoryBufferSize =
368 template<
class... args_t>
369 static auto make_format_args(args_t&... args)
371 return QX_FMT_NS::make_wformat_args(args...);
374 template<
class... args_t>
376 typename usings_char_traits_t::const_pointer pszString,
377 typename usings_char_traits_t::const_pointer pszFormat,
378 args_t&&... args) noexcept
380 QX_PUSH_SUPPRESS_ALL_WARNINGS();
381 return std::swscanf(pszString, pszFormat, std::forward<args_t>(args)...);
382 QX_POP_SUPPRESS_WARNINGS();
386 template<
class... args_t>
395 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