@@ -12,7 +12,9 @@ namespace stdx {
1212inline namespace v1 {
1313namespace _env {
1414template <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 {
1618 return Value;
1719 }
1820};
@@ -61,6 +63,9 @@ template <std::size_t N> struct autowrap<str_lit_t<N>> {
6163template <typename T> autowrap (T) -> autowrap<T>;
6264template <std::size_t N> autowrap (str_lit_t <N>) -> autowrap<str_lit_t<N>>;
6365
66+ template <typename T, typename U>
67+ using queries_equal = std::is_same<typename T::query_t , typename U::query_t >;
68+
6469template <typename > struct for_each_pair ;
6570template <std::size_t ... Is> struct for_each_pair <std::index_sequence<Is...>> {
6671 template <auto ... Args>
@@ -72,7 +77,8 @@ template <envlike Env = env<>>
7277constexpr auto make_env = []<autowrap... Args> {
7378 using new_env_t = typename for_each_pair<
7479 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>{};
7682};
7783} // namespace _env
7884
@@ -81,7 +87,9 @@ using extend_env_t =
8187 decltype (_env::make_env<Env>.template operator ()<Args...>());
8288
8389template <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>;
8593
8694template <_env::autowrap... Args>
8795using make_env_t = extend_env_t <env<>, Args...>;
0 commit comments