// 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$ #ifndef BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED #define BOOST_TYPE_ERASURE_DETAIL_ACCESS_HPP_INCLUDED #include #include #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 #include #endif namespace boost { namespace type_erasure { template class any; template class param; template class binding; 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 ::boost::type_erasure::binding& table(const ::boost::type_erasure::param& arg) { return table(arg._impl); } template static const ::boost::type_erasure::binding& table(const ::boost::type_erasure::param& arg) { return arg._impl.table; } #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES template static const ::boost::type_erasure::binding& table(const ::boost::type_erasure::param& arg) { return arg._impl.table; } #endif #ifdef BOOST_TYPE_ERASURE_SFINAE_FRIENDLY_CONSTRUCTORS template::value>::type> static const typename any::table_type& table(const ::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return static_cast&>(arg)._boost_type_erasure_table; } template static ::boost::type_erasure::detail::storage& data(::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return static_cast< ::boost::type_erasure::any&>(arg)._boost_type_erasure_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)._boost_type_erasure_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)._boost_type_erasure_data); } #endif 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(::boost::type_erasure::any_base< ::boost::type_erasure::any >& arg) { return const_cast< ::boost::type_erasure::detail::storage&>(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 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 data(arg._impl); } 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 data(arg._impl); } 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(::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::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(::boost::type_erasure::param&& arg) { return std::move(data(arg._impl)); } 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 arg._impl.data; } template static const ::boost::type_erasure::detail::storage& data(::boost::type_erasure::param&& arg) { return 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