// Boost.TypeErasure library // // Copyright 2011 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: access.hpp 83321 2013-03-05 21:27:18Z steven_watanabe $ #ifndef BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED #define BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED #include #include namespace boost { namespace type_erasure { template class any; template class param; namespace detail { struct access { template static const typename Derived::table_type& table(const ::boost::type_erasure::any_base& arg) { return static_cast(arg).table; } template static const typename any::table_type& table(const ::boost::type_erasure::param& arg) { return arg._impl.table; } template static ::boost::type_erasure::detail::storage& data(::boost::type_erasure::any_base& arg) { return static_cast(arg).data; } template static const ::boost::type_erasure::detail::storage& data(::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return static_cast< ::boost::type_erasure::any&>(arg).data; } template static const ::boost::type_erasure::detail::storage& data(const ::boost::type_erasure::any_base& arg) { return static_cast(arg).data; } template static ::boost::type_erasure::detail::storage& data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any&>(arg).data); } template static const ::boost::type_erasure::detail::storage& data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return static_cast&>(arg).data; } template static ::boost::type_erasure::detail::storage& data(::boost::type_erasure::param& arg) { return arg._impl.data; } template static const ::boost::type_erasure::detail::storage& data(::boost::type_erasure::param& arg) { return arg._impl.data; } template static const ::boost::type_erasure::detail::storage& data(const ::boost::type_erasure::param& arg) { return arg._impl.data; } #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES template static ::boost::type_erasure::detail::storage&& data(::boost::type_erasure::any_base&& arg) { return std::move(static_cast(arg).data); } template static ::boost::type_erasure::detail::storage&& data(::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return std::move(static_cast< ::boost::type_erasure::any&>(arg).data); } template static ::boost::type_erasure::detail::storage&& data(const ::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return std::move(const_cast< ::boost::type_erasure::detail::storage&>(static_cast< const ::boost::type_erasure::any&>(arg).data)); } template static ::boost::type_erasure::detail::storage&& data(::boost::type_erasure::param&& arg) { return std::move(arg._impl.data); } template static ::boost::type_erasure::detail::storage&& data(::boost::type_erasure::param& arg) { return std::move(arg._impl.data); } template static ::boost::type_erasure::detail::storage&& data(const ::boost::type_erasure::param& arg) { return std::move(const_cast< ::boost::type_erasure::detail::storage&>(arg._impl.data)); } #endif }; } } } #endif