summaryrefslogtreecommitdiff
path: root/boost/type_erasure/is_subconcept.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/type_erasure/is_subconcept.hpp')
-rw-r--r--boost/type_erasure/is_subconcept.hpp66
1 files changed, 63 insertions, 3 deletions
diff --git a/boost/type_erasure/is_subconcept.hpp b/boost/type_erasure/is_subconcept.hpp
index aa8ee6585a..c327731094 100644
--- a/boost/type_erasure/is_subconcept.hpp
+++ b/boost/type_erasure/is_subconcept.hpp
@@ -11,6 +11,7 @@
#ifndef BOOST_TYPE_ERASURE_IS_SUBCONCEPT_HPP_INCLUDED
#define BOOST_TYPE_ERASURE_IS_SUBCONCEPT_HPP_INCLUDED
+#include <boost/mpl/and.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/not.hpp>
#include <boost/mpl/if.hpp>
@@ -19,6 +20,7 @@
#include <boost/mpl/has_key.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_erasure/detail/normalize.hpp>
+#include <boost/type_erasure/detail/check_map.hpp>
#include <boost/type_erasure/detail/rebind_placeholders.hpp>
#include <boost/type_erasure/static_binding.hpp>
@@ -26,10 +28,33 @@ namespace boost {
namespace type_erasure {
namespace detail {
+#ifdef BOOST_TYPE_ERASURE_USE_MP11
+
+template<class S, class K>
+struct mp_set_has_key : ::boost::mp11::mp_set_contains<S, K> {};
+
+template<class Super, class Bindings>
+struct is_subconcept_f
+{
+ template<class T>
+ using apply = ::boost::mp11::mp_set_contains<Super, ::boost::type_erasure::detail::rebind_placeholders_t<T, Bindings> >;
+};
+
+template<class Super>
+struct is_subconcept_f<Super, void>
+{
+ template<class T>
+ using apply = ::boost::mp11::mp_set_contains<Super, T>;
+};
+
+#endif
+
template<class Sub, class Super, class PlaceholderMap>
struct is_subconcept_impl {
+#ifndef BOOST_TYPE_ERASURE_USE_MP11
typedef typename ::boost::type_erasure::detail::normalize_concept<
Super>::concept_set super_set;
+
typedef typename ::boost::type_erasure::detail::get_placeholder_normalization_map<
Super
>::type placeholder_subs_super;
@@ -68,6 +93,30 @@ struct is_subconcept_impl {
>::type,
typename ::boost::mpl::end<normalized_sub>::type
>::type type;
+#else
+ typedef ::boost::type_erasure::detail::normalize_concept_t<Super> super_set;
+
+ typedef ::boost::type_erasure::detail::get_placeholder_normalization_map_t<
+ Super
+ > placeholder_subs_super;
+
+ typedef ::boost::type_erasure::detail::normalize_concept_t<Sub> normalized_sub;
+ typedef ::boost::type_erasure::detail::get_placeholder_normalization_map_t<
+ Sub
+ > placeholder_subs_sub;
+ typedef ::boost::mp11::mp_eval_if_c< ::boost::is_same<PlaceholderMap, void>::value,
+ void,
+ ::boost::type_erasure::detail::convert_deductions_t,
+ PlaceholderMap,
+ placeholder_subs_sub,
+ placeholder_subs_super
+ > bindings;
+
+ typedef typename ::boost::mp11::mp_all_of<
+ normalized_sub,
+ ::boost::type_erasure::detail::is_subconcept_f<super_set, bindings>::template apply
+ > type;
+#endif
};
}
@@ -92,13 +141,24 @@ struct is_subconcept_impl {
* are presumed to use the same set of placeholders.
*/
template<class Sub, class Super, class PlaceholderMap = void>
-struct is_subconcept : ::boost::type_erasure::detail::is_subconcept_impl<Sub, Super, PlaceholderMap>::type {
-};
+struct is_subconcept :
+ ::boost::mpl::and_<
+ ::boost::type_erasure::detail::check_map<Sub, PlaceholderMap>,
+ ::boost::type_erasure::detail::is_subconcept_impl<Sub, Super, PlaceholderMap>
+ >::type
+{};
#ifndef BOOST_TYPE_ERASURE_DOXYGEN
+template<class Sub, class Super>
+struct is_subconcept<Sub, Super, void> :
+ ::boost::type_erasure::detail::is_subconcept_impl<Sub, Super, void>::type
+{};
template<class Sub, class Super, class PlaceholderMap>
struct is_subconcept<Sub, Super, static_binding<PlaceholderMap> > :
- ::boost::type_erasure::detail::is_subconcept_impl<Sub, Super, PlaceholderMap>::type
+ ::boost::mpl::and_<
+ ::boost::type_erasure::detail::check_map<Sub, PlaceholderMap>,
+ ::boost::type_erasure::detail::is_subconcept_impl<Sub, Super, PlaceholderMap>
+ >::type
{};
#endif