Boost logo

Boost Users :

From: Bruce Trask (Bruce.Trask_at_[hidden])
Date: 2005-03-10 18:07:07


Hi,

I have a mpl::vector of types. Each of the types in the vector have
themselves another nested mpl::vector that is a sequence of enums. I have
include the code below.

What I am trying to do is take the original sequence and make a new sequence
based on the predicate that only elements with certains enums in their
nested vector be included in the new sequence. I have included more notes
in the embedded comments.

I was thinking of using mpl::copy_if but am having trouble getting the
predicate right.

Wanted to know if anyone could steer me in the right direction. I am trying
to fill in the ??? below. I am having trouble writing a custom predicate.

Thanks in advance.

Regards,

Bruce

#include <string>

#include <iostream>

#include <boost/mpl/vector.hpp>

#include <boost/mpl/begin_end.hpp>

#include <boost/mpl/deref.hpp>

#include <boost/mpl/count_if.hpp>

#include <boost/mpl/size.hpp>

#include <boost/mpl/for_each.hpp>

#include <boost/type_traits/is_member_pointer.hpp>

#include <boost/mpl/vector_c.hpp>

#include <boost/mpl/copy_if.hpp>

#include <boost/mpl/less.hpp>

#include <boost/mpl/placeholders.hpp>

#include <boost/mpl/find.hpp>

namespace mpl = boost::mpl;

using namespace mpl::placeholders;

enum colors

{

red,

blue,

green,

yellow

};

template<typename COLORTYPES>

struct TestClass

{

typedef COLORTYPES colortypes;

};

void func()

{

// come up with a interface to simplify this like vector_c - only it must be
able to handle enums - I would think one would already exist

typedef mpl::vector<

mpl::integral_c<colors,red>

, mpl::integral_c<colors,green>

, mpl::integral_c<colors,blue>

> colorcoll1;

typedef mpl::vector<

mpl::integral_c<colors,red>

, mpl::integral_c<colors,blue>

> colorcoll2;

typedef mpl::vector<

mpl::integral_c<colors,green>

> colorcoll3;

typedef mpl::vector<TestClass<colorcoll1>, TestClass<colorcoll2>,
TestClass<colorcoll3> > testvector;

std::cout << " SIZE IS " << mpl::size<testvector>::value << std::endl;

// would like to make a new vector from testvector that contains only those
types that have green in their nested vector colortypes.

//In other words, go from testvector which has three types to a vector that
only has TestClass<colorcoll1> and TestClass<colorcoll3>

// typedef mpl::copy_if<testvector, ???? >::type testvectorwithgreen;

// I can do it successfully when operating directly on the container as
below, but am having trouble deterimining the predicate for the above case

typedef mpl::vector_c<int, 1,2,3,4,5,6,7,8> intColl;

std::cout << mpl::size<intColl>::value << std::endl;

typedef mpl::copy_if<intColl, mpl::less<mpl::_1, mpl::int_<5> > >::type
newIntColl;

std::cout << mpl::size<newIntColl>::value << std::endl;

}

int main()

{

func();

return 0;

}

 



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net