diff --git a/include/iris/string.hpp b/include/iris/string.hpp index e39e58b..974edad 100644 --- a/include/iris/string.hpp +++ b/include/iris/string.hpp @@ -3,15 +3,27 @@ // SPDX-License-Identifier: MIT +#include #include #include namespace iris { template -concept StringLike = requires(T t) { - std::basic_string_view{t}; -}; +concept CharLike = + std::same_as || + std::same_as || + std::same_as || + std::same_as || + std::same_as; + +template +concept StringLike = + std::convertible_to> || + std::convertible_to> || + std::convertible_to> || + std::convertible_to> || + std::convertible_to>; template concept NotStringLike = !StringLike; diff --git a/test/core.cpp b/test/core.cpp index a9bb376..d66fe74 100644 --- a/test/core.cpp +++ b/test/core.cpp @@ -5,11 +5,14 @@ #include #include #include +#include #include #include #include #include +#include +#include #include #include #include @@ -448,6 +451,45 @@ TEST_CASE("synth_three_way") STATIC_CHECK(iris::cmp::synth_three_way{}(NoThreeWay{0}, NoThreeWay{1}) == std::weak_ordering::less); } +TEST_CASE("StringLike") +{ + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + STATIC_CHECK(iris::StringLike); + + struct InvalidValueRange + { + struct Invalid { Invalid(Invalid const&) = delete; }; + + using value_type = Invalid; + value_type const* begin() const { return nullptr; } + value_type const* end() const { return nullptr; } + std::size_t size() const { return 0; } + }; + static_assert(std::ranges::sized_range); + static_assert(std::ranges::contiguous_range); + + // hard error as per [strings.general]/1 + //std::basic_string_view sv{InvalidValueRange{}}; + + // should NOT yield hard error + STATIC_CHECK(!iris::StringLike); +} + TEST_CASE("fixed_string") { using namespace std::string_view_literals;