diff --git a/include/iris/string.hpp b/include/iris/string.hpp index 694720e..3b10ab3 100644 --- a/include/iris/string.hpp +++ b/include/iris/string.hpp @@ -6,18 +6,20 @@ #include // IWYU pragma: keep #include -#include -#include +#include +#include +#include // IWYU pragma: export +#include // IWYU pragma: export namespace iris { template concept CharLike = - std::same_as || - std::same_as || - std::same_as || - std::same_as || - std::same_as; + std::same_as, char> || + std::same_as, char32_t> || + std::same_as, wchar_t> || + std::same_as, char8_t> || + std::same_as, char16_t>; template concept StringLike = @@ -30,6 +32,26 @@ concept StringLike = template concept NotStringLike = !StringLike; + +namespace detail { + +template +struct char_type_for_impl +{ + using type = decltype(std::basic_string_view{std::declval()})::value_type; +}; + +template +struct char_type_for_impl +{ + using type = std::remove_cv_t; +}; + +} // detail + +template +using char_type_for = detail::char_type_for_impl::type; + } // iris #endif diff --git a/test/string_algo.cpp b/test/string_algo.cpp index a54a016..3a64898 100644 --- a/test/string_algo.cpp +++ b/test/string_algo.cpp @@ -1,5 +1,6 @@ #include "iris_test.hpp" +#include #include #include @@ -14,6 +15,77 @@ using namespace std::string_view_literals; // NOLINTBEGIN(readability-container-size-empty) +TEST_CASE("string: type traits") +{ + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(iris::CharLike); + STATIC_CHECK(!iris::CharLike); + STATIC_CHECK(!iris::CharLike); + + STATIC_CHECK(std::same_as, char>); + STATIC_CHECK(std::same_as, char>); + STATIC_CHECK(std::same_as, char>); + STATIC_CHECK(std::same_as, char>); + + STATIC_CHECK(std::same_as, char>); + STATIC_CHECK(std::same_as, char>); + +#define IRIS_CHECK_STRING_LIKE(CharT, type) \ + STATIC_CHECK(iris::StringLike); \ + STATIC_CHECK(std::same_as, CharT>); + + IRIS_CHECK_STRING_LIKE(char, char const*); + IRIS_CHECK_STRING_LIKE(char, char const* const); + IRIS_CHECK_STRING_LIKE(char, char const*&); + IRIS_CHECK_STRING_LIKE(char, char const* const&); + IRIS_CHECK_STRING_LIKE(char, char const*&&); + IRIS_CHECK_STRING_LIKE(char, char const* const&&); + + IRIS_CHECK_STRING_LIKE(char, std::string_view); + IRIS_CHECK_STRING_LIKE(char, std::string_view const); + IRIS_CHECK_STRING_LIKE(char, std::string_view&); + IRIS_CHECK_STRING_LIKE(char, std::string_view const&); + IRIS_CHECK_STRING_LIKE(char, std::string_view&&); + IRIS_CHECK_STRING_LIKE(char, std::string_view const&&); + + IRIS_CHECK_STRING_LIKE(char, std::string); + IRIS_CHECK_STRING_LIKE(char, std::string const); + IRIS_CHECK_STRING_LIKE(char, std::string&); + IRIS_CHECK_STRING_LIKE(char, std::string const&); + IRIS_CHECK_STRING_LIKE(char, std::string&&); + IRIS_CHECK_STRING_LIKE(char, std::string const&&); + + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const*); + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const* const); + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const*&); + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const* const&); + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const*&&); + IRIS_CHECK_STRING_LIKE(char32_t, char32_t const* const&&); + + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view const); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view const&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view&&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string_view const&&); + + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string const); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string const&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string&&); + IRIS_CHECK_STRING_LIKE(char32_t, std::u32string const&&); + +#undef IRIS_CHECK_STRING_LIKE +} + TEST_CASE("string_algo: trim") { #ifdef _MSC_VER