williamr@2: #ifndef POINTEE_DWA200415_HPP williamr@2: # define POINTEE_DWA200415_HPP williamr@2: williamr@2: // williamr@2: // Copyright David Abrahams 2004. Use, modification and distribution is williamr@2: // subject to the Boost Software License, Version 1.0. (See accompanying williamr@2: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // typename pointee

::type provides the pointee type of P. williamr@2: // williamr@2: // For example, it is T for T* and X for shared_ptr. williamr@2: // williamr@2: // http://www.boost.org/libs/iterator/doc/pointee.html williamr@2: // williamr@2: williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: namespace detail williamr@2: { williamr@2: template williamr@2: struct smart_ptr_pointee williamr@2: { williamr@2: typedef typename P::element_type type; williamr@2: }; williamr@2: williamr@2: template williamr@2: struct iterator_pointee williamr@2: { williamr@2: typedef typename iterator_traits::value_type value_type; williamr@2: williamr@2: struct impl williamr@2: { williamr@2: template williamr@2: static char test(T const&); williamr@2: williamr@2: static char (& test(value_type&) )[2]; williamr@2: williamr@2: static Iterator& x; williamr@2: }; williamr@2: williamr@2: BOOST_STATIC_CONSTANT(bool, is_constant = sizeof(impl::test(*impl::x)) == 1); williamr@2: williamr@2: typedef typename mpl::if_c< williamr@2: # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) williamr@2: ::boost::detail::iterator_pointee::is_constant williamr@2: # else williamr@2: is_constant williamr@2: # endif williamr@2: , typename add_const::type williamr@2: , value_type williamr@2: >::type type; williamr@2: }; williamr@2: } williamr@2: williamr@2: template williamr@2: struct pointee williamr@2: : mpl::eval_if< williamr@2: detail::is_incrementable

williamr@2: , detail::iterator_pointee

williamr@2: , detail::smart_ptr_pointee

williamr@2: > williamr@2: { williamr@2: }; williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // POINTEE_DWA200415_HPP