summaryrefslogtreecommitdiff
path: root/boost/type_erasure/detail/check_map.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/type_erasure/detail/check_map.hpp')
-rw-r--r--boost/type_erasure/detail/check_map.hpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/boost/type_erasure/detail/check_map.hpp b/boost/type_erasure/detail/check_map.hpp
new file mode 100644
index 0000000000..83435b6479
--- /dev/null
+++ b/boost/type_erasure/detail/check_map.hpp
@@ -0,0 +1,85 @@
+// Boost.TypeErasure library
+//
+// Copyright 2012 Steven Watanabe
+//
+// 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)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_DETAIL_CHECK_MAP_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_DETAIL_CHECK_MAP_HPP_INCLUDED
+
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_erasure/detail/get_placeholders.hpp>
+#include <boost/type_erasure/deduced.hpp>
+#include <boost/type_erasure/static_binding.hpp>
+
+namespace boost {
+namespace type_erasure {
+namespace detail {
+
+template<class T>
+struct is_deduced : boost::mpl::false_ {};
+template<class T>
+struct is_deduced< ::boost::type_erasure::deduced<T> > : boost::mpl::true_ {};
+
+// returns true if Map has a key for every non-deduced placeholder in Concept
+template<class Concept, class Map>
+struct check_map {
+ typedef typename normalize_concept<Concept>::basic basic_components;
+
+ // Every non-deduced placeholder referenced in this
+ // map is indirectly deduced.
+ typedef typename ::boost::type_erasure::detail::get_placeholder_normalization_map<
+ Concept>::type placeholder_subs;
+ typedef typename ::boost::mpl::fold<
+ placeholder_subs,
+ ::boost::mpl::set0<>,
+ ::boost::mpl::insert<
+ ::boost::mpl::_1,
+ ::boost::mpl::second< ::boost::mpl::_2>
+ >
+ >::type indirect_deduced_placeholders;
+
+ typedef typename ::boost::mpl::fold<
+ basic_components,
+ ::boost::mpl::set0<>,
+ ::boost::type_erasure::detail::get_placeholders<
+ ::boost::mpl::_2,
+ ::boost::mpl::_1
+ >
+ >::type placeholders;
+ typedef typename ::boost::is_same<
+ typename ::boost::mpl::find_if<
+ placeholders,
+ ::boost::mpl::not_<
+ ::boost::mpl::or_<
+ ::boost::type_erasure::detail::is_deduced< ::boost::mpl::_1>,
+ ::boost::mpl::has_key<Map, ::boost::mpl::_1>,
+ ::boost::mpl::has_key<indirect_deduced_placeholders, ::boost::mpl::_1>
+ >
+ >
+ >::type,
+ typename ::boost::mpl::end<placeholders>::type
+ >::type type;
+};
+
+template<class Concept, class Map>
+struct check_map<Concept, ::boost::type_erasure::static_binding<Map> > :
+ check_map<Concept, Map>
+{};
+
+}
+}
+}
+
+#endif