37#ifndef BERTINI_ENABLE_PERMUTED_ARGUMENTS
38#define BERTINI_ENABLE_PERMUTED_ARGUMENTS
50 template<
typename T,
typename... Remaining >
51 struct IndexByType : std::integral_constant< std::size_t, 0 >
56 template<
typename T,
typename... RemainingT >
57 struct IndexByType< T, T, RemainingT... > : std::integral_constant< std::size_t, 0 >
59 static_assert( IndexByType< T, RemainingT... >::value ==
sizeof...( RemainingT ),
"No duplicates are allowed when enabling permuted arguments" );
63 template<
typename T1,
typename T2,
typename... RemainingT >
64 struct IndexByType< T1, T2, RemainingT... > : std::integral_constant< std::size_t, IndexByType< T1, RemainingT... >::value + 1 >
68 template< std::size_t
I, std::size_t J,
69 typename T,
typename... PresentT,
typename... GivenT >
70 auto GetByIndex(
const std::tuple< PresentT... >&,
71 const std::tuple< GivenT... >& absent_args )
72 ->
typename std::enable_if<
I ==
sizeof...( PresentT ),
const T& >::type
74 return std::get< J >( absent_args );
78 template< std::size_t
I, std::size_t J,
79 typename T,
typename... PresentT,
typename... GivenT >
80 auto GetByIndex(
const std::tuple< PresentT... >& present_args,
81 const std::tuple< GivenT... >& )
82 ->
typename std::enable_if<
I !=
sizeof...( PresentT ),
const T& >::type
84 return std::get< I >( present_args );
91 template<
bool >
struct AreValidArguments;
94 template<>
struct AreValidArguments< true > : std::true_type
98 template< std::size_t... >
105 template<
typename T >
106 struct DefaultConstruct
107 {
static const T value; };
109 template<
typename T >
110 const T DefaultConstruct< T >::value
118 template<
typename... UnpermutedT,
119 typename... PermutedPresentT >
120 std::tuple<
const UnpermutedT&... > Unpermute(
const PermutedPresentT&... present_permuted_args )
122 using namespace detail;
123 auto present_args = std::tie( present_permuted_args... );
124 auto absent_args = std::tie( DefaultConstruct< UnpermutedT >::value... );
127 ValidateTypes< AreValidArguments< IndexByType<
const PermutedPresentT&,
128 const UnpermutedT&... >::value !=
sizeof...( UnpermutedT )
133 return std::tie( GetByIndex< IndexByType< const UnpermutedT&, const PermutedPresentT&... >::value,
134 IndexByType< const UnpermutedT&, const UnpermutedT&... >::value, UnpermutedT >
135 ( present_args, absent_args )... );
std::shared_ptr< Node > I()
Definition special_number.cpp:42