1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#include <boost/mpl/map.hpp>
#include <boost/mpl/int.hpp>
template<class T, int N, class out>
union TemplateToArray
{
T first,all[N];
struct {T drop;TemplateToArray<T,N-1,typename out::next> rem;} cut;
TemplateToArray() : first(out::ret), cut() {}
};
template<class T, class out>
union TemplateToArray<T,1,out>
{
T first,all[1];
struct {T drop;union{} rem;} cut;
TemplateToArray() : first(out::ret) {}
};
template<class IN,int AT>
struct ReadMap
{
enum {ret=boost::mpl::if_<
boost::mpl::has_key<IN,boost::mpl::int_<AT> >,
boost::mpl::at<IN,boost::mpl::int_<AT> >,
boost::mpl::int_<0> >::value};
typedef ReadMap<IN,AT-1> next;
};
typedef boost::mpl::map<
boost::mpl::pair< boost::mpl::int_<1>, boost::mpl::int_<8> >,
boost::mpl::pair< boost::mpl::int_<3>, boost::mpl::int_<9> >,
boost::mpl::pair< boost::mpl::int_<5>, boost::mpl::int_<2> >,
boost::mpl::pair< boost::mpl::int_<6>, boost::mpl::int_<-1> > > _Input;
typedef TemplateToArray<const int,8,ReadMap<_Input,5> > Reader;
|