@@ -12,7 +12,9 @@ namespace stdx {
12
12
inline namespace v1 {
13
13
namespace _env {
14
14
template <auto Query, auto Value> struct ct_prop {
15
- [[nodiscard]] CONSTEVAL static auto query (decltype (Query)) noexcept {
15
+ using query_t = std::remove_cvref_t <decltype (Query)>;
16
+
17
+ [[nodiscard]] CONSTEVAL static auto query (query_t ) noexcept {
16
18
return Value;
17
19
}
18
20
};
@@ -61,6 +63,9 @@ template <std::size_t N> struct autowrap<str_lit_t<N>> {
61
63
template <typename T> autowrap (T) -> autowrap<T>;
62
64
template <std::size_t N> autowrap (str_lit_t <N>) -> autowrap<str_lit_t<N>>;
63
65
66
+ template <typename T, typename U>
67
+ using queries_equal = std::is_same<typename T::query_t , typename U::query_t >;
68
+
64
69
template <typename > struct for_each_pair ;
65
70
template <std::size_t ... Is> struct for_each_pair <std::index_sequence<Is...>> {
66
71
template <auto ... Args>
@@ -72,7 +77,8 @@ template <envlike Env = env<>>
72
77
constexpr auto make_env = []<autowrap... Args> {
73
78
using new_env_t = typename for_each_pair<
74
79
std::make_index_sequence<sizeof ...(Args) / 2 >>::template type<Args...>;
75
- return boost::mp11::mp_append<new_env_t , Env>{};
80
+ return boost::mp11::mp_unique_if<boost::mp11::mp_append<new_env_t , Env>,
81
+ queries_equal>{};
76
82
};
77
83
} // namespace _env
78
84
@@ -81,7 +87,9 @@ using extend_env_t =
81
87
decltype (_env::make_env<Env>.template operator ()<Args...>());
82
88
83
89
template <envlike... Envs>
84
- using append_env_t = boost::mp11::mp_reverse<boost::mp11::mp_append<Envs...>>;
90
+ using append_env_t = boost::mp11::mp_unique_if<
91
+ boost::mp11::mp_reverse<boost::mp11::mp_append<Envs...>>,
92
+ _env::queries_equal>;
85
93
86
94
template <_env::autowrap... Args>
87
95
using make_env_t = extend_env_t <env<>, Args...>;
0 commit comments