summaryrefslogtreecommitdiff
path: root/boost/type_erasure/detail/access.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/type_erasure/detail/access.hpp')
-rw-r--r--boost/type_erasure/detail/access.hpp105
1 files changed, 104 insertions, 1 deletions
diff --git a/boost/type_erasure/detail/access.hpp b/boost/type_erasure/detail/access.hpp
index 4116bf1ceb..84c61931bb 100644
--- a/boost/type_erasure/detail/access.hpp
+++ b/boost/type_erasure/detail/access.hpp
@@ -14,6 +14,18 @@
#include <boost/type_erasure/detail/storage.hpp>
#include <boost/type_erasure/detail/any_base.hpp>
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
+ !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
+ !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && \
+ !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && \
+ !BOOST_WORKAROUND(BOOST_MSVC, == 1800) && \
+ !BOOST_WORKAROUND(BOOST_GCC, < 40800) && /* Inherited constructors */ \
+ !(defined(__clang_major__) && __clang_major__ == 3 && __clang__minor__ <= 2) /* Inherited constructors */
+#define BOOST_TYPE_ERASURE_SFINAE_FRIENDLY_CONSTRUCTORS
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+#endif
+
namespace boost {
namespace type_erasure {
@@ -23,6 +35,9 @@ class any;
template<class Concept, class T>
class param;
+template<class Concept>
+class binding;
+
namespace detail {
struct access
@@ -34,11 +49,51 @@ struct access
return static_cast<const Derived&>(arg).table;
}
template<class Concept, class T>
- static const typename any<Concept, T>::table_type&
+ static const ::boost::type_erasure::binding<Concept>&
table(const ::boost::type_erasure::param<Concept, T>& arg)
{
+ return table(arg._impl);
+ }
+ template<class Concept, class T>
+ static const ::boost::type_erasure::binding<Concept>&
+ table(const ::boost::type_erasure::param<Concept, T&>& arg)
+ {
+ return arg._impl.table;
+ }
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ template<class Concept, class T>
+ static const ::boost::type_erasure::binding<Concept>&
+ table(const ::boost::type_erasure::param<Concept, T&&>& arg)
+ {
return arg._impl.table;
}
+#endif
+#ifdef BOOST_TYPE_ERASURE_SFINAE_FRIENDLY_CONSTRUCTORS
+ template<class Concept, class T, class = typename ::boost::enable_if_c<!::boost::is_reference<T>::value>::type>
+ static const typename any<Concept, T>::table_type&
+ table(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T> >& arg)
+ {
+ return static_cast<const ::boost::type_erasure::any<Concept, T>&>(arg)._boost_type_erasure_table;
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T> >& arg)
+ {
+ return static_cast< ::boost::type_erasure::any<Concept, T>&>(arg)._boost_type_erasure_data;
+ }
+ template<class Concept, class T>
+ static const ::boost::type_erasure::detail::storage&
+ data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T> >& arg)
+ {
+ return static_cast<const ::boost::type_erasure::any<Concept, T>&>(arg)._boost_type_erasure_data;
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&&
+ data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T> >&& arg)
+ {
+ return std::move(static_cast< ::boost::type_erasure::any<Concept, T>&&>(arg)._boost_type_erasure_data);
+ }
+#endif
template<class Derived>
static ::boost::type_erasure::detail::storage&
data(::boost::type_erasure::any_base<Derived>& arg)
@@ -59,6 +114,12 @@ struct access
}
template<class Concept, class T>
static ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&> >& arg)
+ {
+ return const_cast< ::boost::type_erasure::detail::storage&>(static_cast< ::boost::type_erasure::any<Concept, T&>&>(arg).data);
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&
data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&> >& arg)
{
return const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any<Concept, T&>&>(arg).data);
@@ -73,6 +134,12 @@ struct access
static ::boost::type_erasure::detail::storage&
data(::boost::type_erasure::param<Concept, T>& arg)
{
+ return data(arg._impl);
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::param<Concept, T&>& arg)
+ {
return arg._impl.data;
}
template<class Concept, class T>
@@ -85,6 +152,12 @@ struct access
static const ::boost::type_erasure::detail::storage&
data(const ::boost::type_erasure::param<Concept, T>& arg)
{
+ return data(arg._impl);
+ }
+ template<class Concept, class T>
+ static const ::boost::type_erasure::detail::storage&
+ data(const ::boost::type_erasure::param<Concept, T&>& arg)
+ {
return arg._impl.data;
}
@@ -104,18 +177,48 @@ struct access
}
template<class Concept, class T>
static ::boost::type_erasure::detail::storage&&
+ data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&&> >&& arg)
+ {
+ return std::move(static_cast< ::boost::type_erasure::any<Concept, T&&>&>(arg).data);
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&&
data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&&> >& arg)
{
return std::move(const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any<Concept, T&&>&>(arg).data));
}
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&> >&& arg)
+ {
+ return std::move(static_cast< ::boost::type_erasure::any<Concept, T&>&>(arg).data);
+ }
template<class Concept, class T>
static ::boost::type_erasure::detail::storage&&
data(::boost::type_erasure::param<Concept, T>&& arg)
{
+ return std::move(data(arg._impl));
+ }
+ template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&&
+ data(::boost::type_erasure::param<Concept, T&&>&& arg)
+ {
return std::move(arg._impl.data);
}
template<class Concept, class T>
+ static ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::param<Concept, T&>&& arg)
+ {
+ return arg._impl.data;
+ }
+ template<class Concept, class T>
+ static const ::boost::type_erasure::detail::storage&
+ data(::boost::type_erasure::param<Concept, const T&>&& arg)
+ {
+ return arg._impl.data;
+ }
+ template<class Concept, class T>
static ::boost::type_erasure::detail::storage&&
data(::boost::type_erasure::param<Concept, T&&>& arg)
{