You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
62 lines
1.7 KiB
62 lines
1.7 KiB
// 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
|
|
|