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