Blame boost/pointee.hpp

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

::type provides the pointee type of P.

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

Packit 58578d
      , detail::iterator_pointee

Packit 58578d
      , detail::smart_ptr_pointee

Packit 58578d
    >
Packit 58578d
{
Packit 58578d
};
Packit 58578d
Packit 58578d
} // namespace boost
Packit 58578d
Packit 58578d
#endif // POINTEE_DWA200415_HPP