@@ -1931,52 +1931,34 @@ using observer_upward_conversion_conv = recursive_reduction_t<
19311931 reduction_traits<observer_upward_conversion_conv_reduction>::template type,
19321932 conv_impl<true , upward_conversion_dispatch>, Os...>;
19331933
1934- template <class D , class F , class ... Os>
1935- using observer_indirect_conv =
1936- conv_impl<false , D, substituted_overload_t <Os, F>...>;
1934+ template <class D , class ... Os>
1935+ using observer_indirect_conv = conv_impl<false , D, Os...>;
19371936
1938- template <class C , class F >
1939- struct observer_conv_traits : inapplicable_traits {};
1940- template <class C , class F >
1941- requires (C::is_direct && std::is_same_v< typename C::dispatch_type,
1942- upward_conversion_dispatch>)
1943- struct observer_conv_traits<C, F>
1944- : applicable_traits,
1945- std::type_identity<instantiated_t<observer_upward_conversion_conv,
1937+ template <class C >
1938+ struct observer_conv_traits : std::type_identity< void > {};
1939+ template <class C >
1940+ requires (
1941+ C::is_direct &&
1942+ std::is_same_v< typename C::dispatch_type, upward_conversion_dispatch>)
1943+ struct observer_conv_traits<C>
1944+ : std::type_identity<instantiated_t<observer_upward_conversion_conv,
19461945 typename C::overload_types>> {};
1947- template <class C , class F >
1946+ template <class C >
19481947 requires (!C::is_direct)
1949- struct observer_conv_traits<C, F>
1950- : applicable_traits,
1951- std::type_identity<
1952- instantiated_t<observer_indirect_conv, typename C::overload_types,
1953- typename C::dispatch_type, F>> {};
1954-
1955- template <class F , class O , class I >
1956- struct observer_conv_reduction : std::type_identity<O> {};
1957- template <class F , class ... Cs, class I >
1958- requires (observer_conv_traits<I, F>::applicable)
1959- struct observer_conv_reduction<F, std::tuple<Cs...>, I>
1948+ struct observer_conv_traits<C>
19601949 : std::type_identity<
1961- std::tuple<Cs..., typename observer_conv_traits<I, F>::type>> {};
1962- template <class F , class ... Cs>
1950+ instantiated_t<observer_indirect_conv, typename C::overload_types,
1951+ typename C::dispatch_type>> {};
1952+ template <class ... Cs>
19631953struct observer_facade_conv_impl {
1964- using convention_types = recursive_reduction_t <
1965- reduction_traits<observer_conv_reduction, F>::template type, std::tuple<>,
1966- Cs...>;
1954+ using convention_types =
1955+ composite_t <std::tuple<>, typename observer_conv_traits<Cs>::type...>;
19671956};
19681957
1969- template <class O , class I >
1970- struct observer_refl_reduction : std::type_identity<O> {};
1971- template <class ... Rs, class R >
1972- requires (!R::is_direct)
1973- struct observer_refl_reduction<std::tuple<Rs...>, R>
1974- : std::type_identity<std::tuple<Rs..., R>> {};
19751958template <class ... Rs>
19761959struct observer_facade_refl_impl {
1977- using reflection_types = recursive_reduction_t <
1978- reduction_traits<observer_refl_reduction>::template type, std::tuple<>,
1979- Rs...>;
1960+ using reflection_types =
1961+ composite_t <std::tuple<>, std::conditional_t <Rs::is_direct, void , Rs>...>;
19801962};
19811963
19821964template <class P >
@@ -2040,7 +2022,7 @@ struct weak_facade_impl {
20402022template <facade F>
20412023struct observer_facade
20422024 : details::instantiated_t <details::observer_facade_conv_impl,
2043- typename F::convention_types, F >,
2025+ typename F::convention_types>,
20442026 details::instantiated_t <details::observer_facade_refl_impl,
20452027 typename F::reflection_types> {
20462028 static constexpr std::size_t max_size = sizeof (void *);
0 commit comments