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