[MPL] Permutations of a List of Types

I am trying to create a list containing the permutations of a given type list. The below code seems to function, though without the intended result, when I use a specified list instead of generating a new list by removing from the actual input. This is demonstrated by the difference between permutation_helper and broken_helper below. Am I using remove incorrectly, or am I running into a different problem? #include <boost/mpl/list.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/fold.hpp> #include <boost/mpl/push_front.hpp> #include <boost/mpl/joint_view.hpp> #include <boost/mpl/remove.hpp> #include <boost/mpl/assert.hpp> #include <boost/mpl/equal.hpp> namespace mpl = boost::mpl; struct test_type1 {}; struct test_type2 {}; struct test_type3 {}; template< typename T > struct permutations; template <typename value> struct permutations<mpl::list1< value > >: mpl::list1<mpl::list1< value > > {}; template< typename value, typename T> struct permutation_helper: mpl::transform< typename permutations< mpl::list1<test_type3> >::type, mpl::push_front< mpl::_1, value> > { }; template< typename value, typename T> struct broken_helper: mpl::transform< typename permutations< mpl::remove<T, value> >::type, mpl::push_front< mpl::_1, value> > { }; template< typename T > struct permutations: mpl::fold< T, mpl::list0<>, mpl::joint_view< mpl::_1, broken_helper<mpl::_2, T > > > { }; typedef mpl::list2<test_type1, test_type2> typelist; typedef permutations<typelist>::type perms; int main() { BOOST_MPL_ASSERT(( mpl::equal< perms, typelist > )); return 0; } I used the assert to determine what is being returned from the function, typelist is not the expected result. This is the message the assert returns for broken_helper: testcase.cpp: In function ‘int main()’: testcase.cpp:45: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::equal<boost::mpl::joint_view<boost::mpl::joint_view<boost::mpl::list0<mpl_::na>, boost::mpl::l_end>, boost::mpl::l_end>, boost::mpl::list2<test_type1, test_type2>, boost::is_same<mpl_::arg<-0x00000000000000001>, mpl_::arg<-0x00000000000000001> > >::************)’ The output using permutation_helper is an actual list: testcase.cpp: In function ‘int main()’: testcase.cpp:45: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::equal<boost::mpl::list2<test_type1, test_type2>, boost::mpl::joint_view<boost::mpl::joint_view<boost::mpl::list0<mpl_::na>, boost::mpl::l_item<mpl_::long_<1l>, boost::mpl::l_item<mpl_::long_<2l>, test_type1, boost::mpl::list1<test_type3> >, boost::mpl::l_end> >, boost::mpl::l_item<mpl_::long_<1l>, boost::mpl::l_item<mpl_::long_<2l>, test_type2, boost::mpl::list1<test_type3> >, boost::mpl::l_end> >, boost::is_same<mpl_::arg<-0x00000000000000001>, mpl_::arg<-0x00000000000000001> > >::************)’

AMDG On 12/22/2010 1:18 PM, Edward Terchunian wrote:
I am trying to create a list containing the permutations of a given type list.
The below code seems to function, though without the intended result, when I use a specified list instead of generating a new list by removing from the actual input. This is demonstrated by the difference between permutation_helper and broken_helper below.
Am I using remove incorrectly, or am I running into a different problem? <snip>
template< typename T> struct permutations;
template<typename value> struct permutations<mpl::list1< value> >: mpl::list1<mpl::list1< value> > {};
A list containing 1 element is not guaranteed to be a specialization of list1. In Christ, Steven Watanabe
participants (2)
-
Edward Terchunian
-
Steven Watanabe