6#ifndef MIMICPP_STRING_HPP
7#define MIMICPP_STRING_HPP
15#ifndef MIMICPP_DETAIL_IS_MODULE
20 #include <string_view>
21 #include <type_traits>
105 template <
typename T>
107 :
public std::false_type
115 template <
typename T>
123 :
public std::true_type
132 :
public std::true_type
141 :
public std::true_type
150 :
public std::true_type
159 :
public std::true_type
168 :
public std::true_type
177 :
public std::true_type
199 template <util::satisfies<is_
character> Char>
255 template <
typename T>
262 template <
typename T>
269 template <
typename T>
270 requires std::is_pointer_v<T>
274 using char_t = std::remove_const_t<std::remove_pointer_t<T>>;
275 using view_t = std::basic_string_view<char_t>;
278 static constexpr view_t view(
const std::remove_pointer_t<T>* str)
noexcept
288 template <
typename T>
289 requires std::is_array_v<T>
290 struct string_traits<T>
291 :
public string_traits<std::remove_extent_t<T>*>
298 template <
typename Char,
typename Traits,
typename Allocator>
302 using string_t = std::basic_string<Char, Traits, Allocator>;
303 using view_t = std::basic_string_view<Char, Traits>;
315 template <
typename Char,
typename Traits>
319 using view_t = std::basic_string_view<Char, Traits>;
337 template <
typename T>
340 requires std::regular<string_char_t<T>>;
341 requires std::ranges::contiguous_range<string_view_t<T>>;
342 requires std::ranges::sized_range<string_view_t<T>>;
343 requires std::ranges::borrowed_range<string_view_t<T>>;
344 requires std::same_as<
346 std::ranges::range_value_t<string_view_t<T>>>;
370 template <util::satisfies<is_
character> Char>
378 template <
typename String>
382 { std::invoke(converter, std::move(view)) } -> std::ranges::forward_range;
383 } &&
requires(std::invoke_result_t<string_case_fold_converter<string_char_t<String>>,
string_view_t<String>> normalized) {
384 requires std::same_as<
386 std::ranges::range_value_t<
decltype(normalized)>>;
390namespace mimicpp::detail
392 template <
typename View,
typename Char>
394 && std::ranges::borrowed_range<View>
395 && std::ranges::contiguous_range<View>
396 && std::ranges::sized_range<View>
397 && std::same_as<Char, std::ranges::range_value_t<View>>;
400#ifndef MIMICPP_CONFIG_EXPERIMENTAL_UNICODE_STR_MATCHER
409 template <detail::compatible_
string_view_with<
char> String>
413 return std::views::all(std::forward<String>(str))
414 | std::views::transform(
415 [](
const char c)
noexcept {
418 return static_cast<char>(
419 static_cast<unsigned char>(std::toupper(c)));
426 #ifndef MIMICPP_DETAIL_IS_MODULE
427 #if __has_include(<uni_algo/case.h>) \
428 && __has_include(<uni_algo/conv.h>)
429 #include <uni_algo/case.h>
430 #include <uni_algo/conv.h>
432 #error "Unable to find uni_algo includes."
443 template <detail::compatible_
string_view_with<
char> String>
445 constexpr auto operator()(String&& str)
const
447 return una::cases::to_casefold_utf8(
449 std::ranges::data(str),
450 std::ranges::size(str)});
461 template <detail::compatible_
string_view_with<
wchar_t> String>
463 constexpr auto operator()(String&& str)
const
465 return una::cases::to_casefold_utf16(
467 std::ranges::data(str),
468 std::ranges::size(str)});
479 template <detail::compatible_
string_view_with<
char8_t> String>
481 constexpr auto operator()(String&& str)
const
483 return una::cases::to_casefold_utf8(
485 std::ranges::data(str),
486 std::ranges::size(str)});
497 template <detail::compatible_
string_view_with<
char16_t> String>
499 constexpr auto operator()(String&& str)
const
501 return una::cases::to_casefold_utf16(
503 std::ranges::data(str),
504 std::ranges::size(str)});
515 template <detail::compatible_
string_view_with<
char32_t> String>
517 constexpr auto operator()(String&& str)
const
519 return una::utf8to32<char8_t, char32_t>(
520 una::cases::to_casefold_utf8(
523 std::ranges::data(str),
524 std::ranges::size(str)})));
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Determines, whether the given type supports string normalization.
Definition String.hpp:379
Determines, whether the given type can be used as a string-type.
Definition String.hpp:338
constexpr bool is_character_v
Convenience boolean-constant to the result of is_character trait.
Definition String.hpp:116
constexpr StringViewT string_literal_prefix
Primary template, yielding an empty string.
Definition String.hpp:201
decltype(string_traits< std::remove_cvref_t< T > >::view(std::declval< T & >())) string_view_t
Computes the view type for the given string.
Definition String.hpp:256
typename string_traits< std::remove_cvref_t< T > >::char_t string_char_t
Computes the character type for the given string.
Definition String.hpp:263
std::basic_string_view< CharT, CharTraitsT > StringViewT
Definition Fwd.hpp:392
Primary template, which always yields false.
Definition String.hpp:108
constexpr auto operator()(String &&str) const
Definition String.hpp:411
Primary template, purposely undefined.
Definition String.hpp:371
std::remove_const_t< std::remove_pointer_t< T > > char_t
Definition String.hpp:274
std::basic_string_view< char_t > view_t
Definition String.hpp:275
static constexpr view_t view(const std::remove_pointer_t< T > *str) noexcept
Definition String.hpp:278
std::basic_string_view< Char, Traits > view_t
Definition String.hpp:303
std::basic_string< Char, Traits, Allocator > string_t
Definition String.hpp:302
static constexpr view_t view(const string_t &str) noexcept
Definition String.hpp:306
Char char_t
Definition String.hpp:301
static constexpr view_t view(view_t str) noexcept
Definition String.hpp:322
std::basic_string_view< Char, Traits > view_t
Definition String.hpp:319
Char char_t
Definition String.hpp:318