// Copyright 2008-2010 Gordon Woodhull | |
// Distributed under the Boost Software License, Version 1.0. | |
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
#ifndef BOOST_MSM_MPL_GRAPH_MPL_UTILS_HPP_INCLUDED | |
#define BOOST_MSM_MPL_GRAPH_MPL_UTILS_HPP_INCLUDED | |
#include <boost/mpl/fold.hpp> | |
#include <boost/mpl/map.hpp> | |
#include <boost/mpl/set.hpp> | |
#include <boost/mpl/insert.hpp> | |
#include <boost/mpl/if.hpp> | |
#include <boost/mpl/has_key.hpp> | |
#include <boost/mpl/at.hpp> | |
#include <boost/mpl/and.hpp> | |
namespace boost { | |
namespace msm { | |
namespace mpl_graph { | |
namespace mpl_utils { | |
// This is a grab bag of little metafunctions I expect already | |
// exist under some name I haven't looked for | |
// I figure there are probably better ways to do all of these things, | |
// but for now I'll just write some utilities to isolate my ignorance | |
template<typename Seq> | |
struct as_map : | |
mpl::fold<Seq, | |
mpl::map<>, | |
mpl::insert<mpl::_1, mpl::_2> > | |
{}; | |
template<typename Seq> | |
struct as_set : | |
mpl::fold<Seq, | |
mpl::set<>, | |
mpl::insert<mpl::_1, mpl::_2> > | |
{}; | |
template<typename AssocSeq, typename Key, typename Default> | |
struct at_or_default : | |
mpl::if_<typename mpl::has_key<AssocSeq, Key>::type, | |
typename mpl::at<AssocSeq, Key>::type, | |
Default> | |
{}; | |
template<typename Seq1, typename Seq2> | |
struct set_equal : | |
mpl::fold<Seq2, | |
mpl::true_, | |
mpl::and_<mpl::_1, | |
mpl::has_key<typename as_set<Seq1>::type, | |
mpl::_2 > > > | |
{}; | |
} | |
} | |
} | |
} | |
#endif // BOOST_MSM_MPL_GRAPH_MPL_UTILS_HPP_INCLUDED |