1616
1717#include < iris/alloy/traits.hpp>
1818
19- #include < boost/mpl/placeholders.hpp>
20- #include < boost/mpl/equal.hpp>
21- #include < boost/mpl/filter_view.hpp>
22-
2319#include < optional>
2420#include < type_traits>
2521
@@ -38,10 +34,22 @@ constexpr bool is_substitute_v = is_substitute<T, Attr>::value;
3834template <class Variant , X4Attribute Attr>
3935struct variant_has_substitute ;
4036
41- // TODO: reduce MPL usage
42-
4337namespace detail {
4438
39+ template <class TTuple , class UTuple , class IndexSeq = std::make_index_sequence<alloy::tuple_size_v<TTuple>>>
40+ struct is_all_substitute_for_tuple_impl {};
41+
42+ template <class TTuple , class UTuple , std::size_t ... Is>
43+ struct is_all_substitute_for_tuple_impl <TTuple, UTuple, std::index_sequence<Is...>>
44+ : std::conjunction<is_substitute<alloy::tuple_element_t <Is, TTuple>, alloy::tuple_element_t <Is, UTuple>>...> {};
45+
46+ template <class TTuple , class UTuple >
47+ struct is_all_substitute_for_tuple : std::false_type {};
48+
49+ template <class TTuple , class UTuple >
50+ requires is_same_size_sequence_v<TTuple, UTuple>
51+ struct is_all_substitute_for_tuple <TTuple, UTuple> : is_all_substitute_for_tuple_impl<TTuple, UTuple> {};
52+
4553template <class T , X4Attribute Attr>
4654struct value_type_is_substitute
4755 : is_substitute<container_value_t <T>, container_value_t <Attr>>
@@ -56,7 +64,7 @@ template<class T, X4Attribute Attr>
5664 alloy::is_tuple_like<Attr>
5765 >
5866struct is_substitute_impl <T, Attr>
59- : boost::mpl::equal <T, Attr, is_substitute<boost::mpl::_1, boost::mpl::_2> >
67+ : is_all_substitute_for_tuple <T, Attr>
6068{};
6169
6270template <class T , X4Attribute Attr>
0 commit comments