Skip to content

Commit ada59db

Browse files
authored
Merge pull request #421 from elbeno/name-of
✨ Add functionality for named types
2 parents 0934abd + 20f8a49 commit ada59db

3 files changed

Lines changed: 39 additions & 15 deletions

File tree

‎include/stdx/ct_string.hpp‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,5 +182,25 @@ template <ct_string S> consteval auto operator""_cts() { return S; }
182182
template <ct_string S> consteval auto operator""_ctst() { return cts_t<S>{}; }
183183
} // namespace ct_string_literals
184184
} // namespace literals
185+
186+
template <ct_string Name> struct with_name {
187+
constexpr static auto name = Name;
188+
friend constexpr auto operator==(with_name, with_name) -> bool = default;
189+
};
190+
191+
namespace detail {
192+
template <typename T>
193+
concept is_ct_string =
194+
stdx::is_value_specialization_of_v<std::remove_cvref_t<T>, ct_string>;
195+
}
196+
197+
template <typename T>
198+
concept named = requires {
199+
{ T::name } -> detail::is_ct_string;
200+
};
201+
202+
template <named T> constexpr auto name_of_v = T::name;
203+
template <named T> using constant_name_of_t = cts_t<T::name>;
204+
template <named T> constexpr auto constant_name_of_v = constant_name_of_t<T>{};
185205
} // namespace v1
186206
} // namespace stdx

‎test/ct_string.cpp‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,11 @@ TEST_CASE("CT_WRAP", "[ct_string]") {
192192
STATIC_REQUIRE(CT_WRAP(X) == "hello"_ctst);
193193
}.template operator()<"hello">();
194194
}
195+
196+
TEST_CASE("named object", "[ct_string]") {
197+
using namespace stdx::ct_string_literals;
198+
using T = stdx::with_name<"test">;
199+
STATIC_CHECK(stdx::named<T>);
200+
STATIC_CHECK(stdx::name_of_v<T> == "test"_cts);
201+
STATIC_CHECK(stdx::constant_name_of_v<T> == "test"_ctst);
202+
}

‎test/tuple_algorithms.cpp‎

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "detail/tuple_types.hpp"
22

3+
#include <stdx/ct_string.hpp>
34
#include <stdx/span.hpp>
45
#include <stdx/tuple_algorithms.hpp>
56
#include <stdx/utility.hpp>
@@ -979,31 +980,26 @@ TEST_CASE("gather with move only types", "[tuple_algorithms]") {
979980
}
980981

981982
namespace {
982-
template <typename T> struct named_int {
983-
using name_t = T;
983+
template <stdx::ct_string Name> struct named_int : stdx::with_name<Name> {
984+
constexpr named_int(int v) : value{v} {}
984985
int value;
985986
friend constexpr auto operator==(named_int, named_int) -> bool = default;
986987
};
987-
988-
template <typename T> using name_of_t = typename T::name_t;
989988
} // namespace
990989

991990
TEST_CASE("gather_by with projection", "[tuple_algorithms]") {
992-
struct A;
993-
struct B;
994-
struct C;
995-
constexpr auto t = stdx::tuple{named_int<C>{3}, named_int<B>{11},
996-
named_int<A>{0}, named_int<B>{12}};
997-
constexpr auto gathered = stdx::gather_by<name_of_t>(t);
991+
constexpr auto t = stdx::tuple{named_int<"C">{3}, named_int<"B">{11},
992+
named_int<"A">{0}, named_int<"B">{12}};
993+
constexpr auto gathered = stdx::gather_by<stdx::constant_name_of_t>(t);
998994
STATIC_REQUIRE(
999995
std::is_same_v<decltype(gathered),
1000-
stdx::tuple<stdx::tuple<named_int<A>>,
1001-
stdx::tuple<named_int<B>, named_int<B>>,
1002-
stdx::tuple<named_int<C>>> const>);
1003-
CHECK(get<0>(gathered) == stdx::tuple{named_int<A>{0}});
996+
stdx::tuple<stdx::tuple<named_int<"A">>,
997+
stdx::tuple<named_int<"B">, named_int<"B">>,
998+
stdx::tuple<named_int<"C">>> const>);
999+
CHECK(get<0>(gathered) == stdx::tuple{named_int<"A">{0}});
10041000
CHECK(stdx::get<1>(gathered).fold_left(
10051001
0, [](auto x, auto y) { return x + y.value; }) == 23);
1006-
CHECK(get<2>(gathered) == stdx::tuple{named_int<C>{3}});
1002+
CHECK(get<2>(gathered) == stdx::tuple{named_int<"C">{3}});
10071003
}
10081004

10091005
TEST_CASE("tuple_cons", "[tuple_algorithms]") {

0 commit comments

Comments
 (0)