Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions include/stdx/ct_string.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,5 +202,25 @@ concept named = requires {
template <named T> constexpr auto name_of_v = T::name;
template <named T> using constant_name_of_t = cts_t<T::name>;
template <named T> constexpr auto constant_name_of_v = constant_name_of_t<T>{};

template <typename T, stdx::ct_string Name>
concept matching_name = T::name == Name;

template <typename T, stdx::ct_string Name>
using matching_name_t = std::bool_constant<matching_name<T, Name>>;

template <stdx::ct_string N> struct matching_name_q {
template <typename T> using fn = matching_name_t<T, N>;
};

template <typename T, typename U>
concept same_name = named<T> and named<U> and matching_name<T, name_of_v<U>>;

template <typename T, typename U>
using same_name_t = std::bool_constant<same_name<T, U>>;

template <named T> struct same_name_q {
template <named U> using fn = same_name_t<T, U>;
};
} // namespace v1
} // namespace stdx
12 changes: 12 additions & 0 deletions test/ct_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,4 +199,16 @@ TEST_CASE("named object", "[ct_string]") {
STATIC_CHECK(stdx::named<T>);
STATIC_CHECK(stdx::name_of_v<T> == "test"_cts);
STATIC_CHECK(stdx::constant_name_of_v<T> == "test"_ctst);

STATIC_CHECK(stdx::matching_name<T, "test">);
STATIC_CHECK(stdx::matching_name_t<T, "test">::value);
STATIC_CHECK(stdx::matching_name_q<"test">::template fn<T>::value);

using U = stdx::with_name<"not test">;
STATIC_CHECK(stdx::same_name<T, T>);
STATIC_CHECK(stdx::same_name_t<T, T>::value);
STATIC_CHECK(stdx::same_name_q<T>::template fn<T>::value);
STATIC_CHECK(not stdx::same_name<T, U>);
STATIC_CHECK(not stdx::same_name_t<T, U>::value);
STATIC_CHECK(not stdx::same_name_q<T>::template fn<U>::value);
}