1 // Boost.TypeErasure library
3 // Copyright 2011 Steven Watanabe
5 // Distributed under the Boost Software License Version 1.0. (See
6 // accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
11 #ifndef BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED
12 #define BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED
14 #include <boost/type_erasure/detail/storage.hpp>
15 #include <boost/type_erasure/detail/any_base.hpp>
18 namespace type_erasure {
20 template<class Concept, class T>
23 template<class Concept, class T>
30 template<class Derived>
31 static const typename Derived::table_type&
32 table(const ::boost::type_erasure::any_base<Derived>& arg)
34 return static_cast<const Derived&>(arg).table;
36 template<class Concept, class T>
37 static const typename any<Concept, T>::table_type&
38 table(const ::boost::type_erasure::param<Concept, T>& arg)
40 return arg._impl.table;
42 template<class Derived>
43 static ::boost::type_erasure::detail::storage&
44 data(::boost::type_erasure::any_base<Derived>& arg)
46 return static_cast<Derived&>(arg).data;
48 template<class Concept, class T>
49 static const ::boost::type_erasure::detail::storage&
50 data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, const T&> >& arg)
52 return static_cast< ::boost::type_erasure::any<Concept, const T&>&>(arg).data;
54 template<class Derived>
55 static const ::boost::type_erasure::detail::storage&
56 data(const ::boost::type_erasure::any_base<Derived>& arg)
58 return static_cast<const Derived&>(arg).data;
60 template<class Concept, class T>
61 static ::boost::type_erasure::detail::storage&
62 data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&> >& arg)
64 return const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any<Concept, T&>&>(arg).data);
66 template<class Concept, class T>
67 static const ::boost::type_erasure::detail::storage&
68 data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, const T&> >& arg)
70 return static_cast<const ::boost::type_erasure::any<Concept, const T&>&>(arg).data;
72 template<class Concept, class T>
73 static ::boost::type_erasure::detail::storage&
74 data(::boost::type_erasure::param<Concept, T>& arg)
76 return arg._impl.data;
78 template<class Concept, class T>
79 static const ::boost::type_erasure::detail::storage&
80 data(::boost::type_erasure::param<Concept, const T&>& arg)
82 return arg._impl.data;
84 template<class Concept, class T>
85 static const ::boost::type_erasure::detail::storage&
86 data(const ::boost::type_erasure::param<Concept, T>& arg)
88 return arg._impl.data;
91 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
93 template<class Derived>
94 static ::boost::type_erasure::detail::storage&&
95 data(::boost::type_erasure::any_base<Derived>&& arg)
97 return std::move(static_cast<Derived&>(arg).data);
99 template<class Concept, class T>
100 static ::boost::type_erasure::detail::storage&&
101 data(::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&&> >& arg)
103 return std::move(static_cast< ::boost::type_erasure::any<Concept, T&&>&>(arg).data);
105 template<class Concept, class T>
106 static ::boost::type_erasure::detail::storage&&
107 data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any<Concept, T&&> >& arg)
109 return std::move(const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any<Concept, T&&>&>(arg).data));
112 template<class Concept, class T>
113 static ::boost::type_erasure::detail::storage&&
114 data(::boost::type_erasure::param<Concept, T>&& arg)
116 return std::move(arg._impl.data);
118 template<class Concept, class T>
119 static ::boost::type_erasure::detail::storage&&
120 data(::boost::type_erasure::param<Concept, T&&>& arg)
122 return std::move(arg._impl.data);
124 template<class Concept, class T>
125 static ::boost::type_erasure::detail::storage&&
126 data(const ::boost::type_erasure::param<Concept, T&&>& arg)
128 return std::move(const_cast< ::boost::type_erasure::detail::storage&>(arg._impl.data));