diff --git a/brigand/adapted/integral_list.hpp b/brigand/adapted/integral_list.hpp index da88255..05f18fe 100644 --- a/brigand/adapted/integral_list.hpp +++ b/brigand/adapted/integral_list.hpp @@ -15,6 +15,6 @@ namespace brigand struct make_integral : std::integral_constant < typename T::value_type, T::value > {}; template - using as_integral_list = transform < make_integral, L > ; + using as_integral_list = transform > ; } \ No newline at end of file diff --git a/brigand/algorithms/fold.hpp b/brigand/algorithms/fold.hpp index d126e57..e83c857 100644 --- a/brigand/algorithms/fold.hpp +++ b/brigand/algorithms/fold.hpp @@ -12,6 +12,6 @@ namespace brigand { // Main fold entry point - template class Functor, class State, class Sequence> + template class Functor> using fold = typename detail::fold_impl::type; } diff --git a/brigand/algorithms/transform.hpp b/brigand/algorithms/transform.hpp index a4a1817..8411cf8 100644 --- a/brigand/algorithms/transform.hpp +++ b/brigand/algorithms/transform.hpp @@ -12,34 +12,55 @@ namespace brigand { namespace detail { - template - struct transform_impl; + + template + struct unary_transform_impl; // Unary transform implementation template< typename Functor , template class Sequence, typename... T > - struct transform_impl> + struct unary_transform_impl> { using type = Sequence< brigand::apply... >; }; + template + struct binary_transform_impl; + // Binary transform implementation template< typename Functor , template class Sequence1, typename... T1 , template class Sequence2, typename... T2 > - struct transform_impl, Sequence2> + struct binary_transform_impl, Sequence2> { static_assert ( sizeof...(T1) == sizeof...(T2) , "The arguments of transform should be of the same size" ); using type = Sequence1< brigand::apply... >; - }; + }; + + template + struct transform_selector; + + template + struct transform_selector <0, Sequence1, Functor, void> + { + using type = typename unary_transform_impl::type; + }; + + template + struct transform_selector<1, Sequence1, Sequence2, Functor> + { + using type = typename binary_transform_impl::type; + }; + } // Main transform entry point - template - using transform = typename detail::transform_impl::type; + template + using transform = typename detail::transform_selector::type; + } diff --git a/test/fold.cpp b/test/fold.cpp index 6b3d85b..6256080 100644 --- a/test/fold.cpp +++ b/test/fold.cpp @@ -23,8 +23,8 @@ using f_ = typename std::conditional < std::is_floating_point::value , State >::type; -static_assert(brigand::fold::type::value == 1337 , "invalid fold on empty list" ); -static_assert(brigand::fold::type::value == 1 , "invalid fold on 1 element list"); -static_assert(brigand::fold::type::value == 0 , "invalid fold on 1 element list"); -static_assert(brigand::fold::type::value == 3 , "invalid fold on list" ); -static_assert(brigand::fold::type::value == 100 , "invalid fold with state" ); +static_assert(brigand::fold::type::value == 1337, "invalid fold on empty list"); +static_assert(brigand::fold::type::value == 1, "invalid fold on 1 element list"); +static_assert(brigand::fold::type::value == 0, "invalid fold on 1 element list"); +static_assert(brigand::fold::type::value == 3, "invalid fold on list"); +static_assert(brigand::fold::type::value == 100, "invalid fold with state"); diff --git a/test/transform.cpp b/test/transform.cpp index cac85d9..59a48be 100644 --- a/test/transform.cpp +++ b/test/transform.cpp @@ -27,75 +27,77 @@ using expect2c = brigand::list; using ptr_t = std::add_pointer; using pair_t = std::pair; -static_assert ( std::is_same< brigand::transform,list0> +static_assert ( std::is_same< brigand::transform> , list0 >::value , "invalid unary transform on empty list" ); -static_assert ( std::is_same< brigand::transform +static_assert ( std::is_same< brigand::transform , list0 >::value , "invalid unary transform on empty list" ); -static_assert ( std::is_same< brigand::transform +static_assert ( std::is_same< brigand::transform , list0 >::value , "invalid binary transform on empty list" ); -static_assert ( std::is_same< brigand::transform +static_assert ( std::is_same< brigand::transform , expect1 >::value , "invalid unary transform on list" ); -static_assert ( std::is_same< brigand::transform,list1> +static_assert (std::is_same< brigand::transform> , expect1 >::value , "invalid unary transform on list" ); -static_assert ( std::is_same< brigand::transform +static_assert ( std::is_same< brigand::transform , expect1b >::value , "invalid binary transform on list" ); -static_assert ( std::is_same< brigand::transform +static_assert (std::is_same< brigand::transform , expect2 >::value , "invalid unary transform on list" ); -static_assert ( std::is_same< brigand::transform +static_assert (std::is_same< brigand::transform , expect2b >::value , "invalid binary transform on list" ); -static_assert ( std::is_same< brigand::transform +static_assert (std::is_same< brigand::transform , expect2b >::value , "invalid binary transform on list" ); -static_assert (std::is_same < brigand::transform < std::add_pointer>>, - brigand::list>, +static_assert (std::is_same < + brigand::transform , + std::add_pointer>> + >, brigand::list>::value , "invalid transform on list" ); -static_assert ( std::is_same< brigand::transform< brigand::if_< std::is_pointer +static_assert ( std::is_same< brigand::transform , brigand::identity , std::add_pointer < brigand::_1 > > - , list2 > , expect2c >::value , "invalid binary transform on list" ); +