| ////////////////////////////////////////////////////////////////////////////// |
| // |
| // (C) Copyright Ion Gaztanaga 2014-2017. 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) |
| // |
| // See http://www.boost.org/libs/move for documentation. |
| // |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef BOOST_MOVE_DETAIL_POINTER_ELEMENT_HPP |
| #define BOOST_MOVE_DETAIL_POINTER_ELEMENT_HPP |
| |
| #ifndef BOOST_CONFIG_HPP |
| # include <boost/config.hpp> |
| #endif |
| |
| #if defined(BOOST_HAS_PRAGMA_ONCE) |
| # pragma once |
| #endif |
| |
| #ifndef BOOST_MOVE_DETAIL_WORKAROUND_HPP |
| #include <boost/move/detail/workaround.hpp> |
| #endif //BOOST_MOVE_DETAIL_WORKAROUND_HPP |
| |
| namespace boost { |
| namespace movelib { |
| namespace detail{ |
| |
| ////////////////////// |
| //struct first_param |
| ////////////////////// |
| |
| template <typename T> struct first_param |
| { typedef void type; }; |
| |
| #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) |
| |
| template <template <typename, typename...> class TemplateClass, typename T, typename... Args> |
| struct first_param< TemplateClass<T, Args...> > |
| { |
| typedef T type; |
| }; |
| |
| #else //C++03 compilers |
| |
| template < template //0arg |
| <class |
| > class TemplateClass, class T |
| > |
| struct first_param |
| < TemplateClass<T> > |
| { typedef T type; }; |
| |
| template < template //1arg |
| <class,class |
| > class TemplateClass, class T |
| , class P0> |
| struct first_param |
| < TemplateClass<T, P0> > |
| { typedef T type; }; |
| |
| template < template //2arg |
| <class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1> |
| struct first_param |
| < TemplateClass<T, P0, P1> > |
| { typedef T type; }; |
| |
| template < template //3arg |
| <class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2> > |
| { typedef T type; }; |
| |
| template < template //4arg |
| <class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3> > |
| { typedef T type; }; |
| |
| template < template //5arg |
| <class,class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3, class P4> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3, P4> > |
| { typedef T type; }; |
| |
| template < template //6arg |
| <class,class,class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3, class P4, class P5> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3, P4, P5> > |
| { typedef T type; }; |
| |
| template < template //7arg |
| <class,class,class,class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3, class P4, class P5, class P6> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6> > |
| { typedef T type; }; |
| |
| template < template //8arg |
| <class,class,class,class,class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7> > |
| { typedef T type; }; |
| |
| template < template //9arg |
| <class,class,class,class,class,class,class,class,class,class |
| > class TemplateClass, class T |
| , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> |
| struct first_param |
| < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7, P8> > |
| { typedef T type; }; |
| |
| #endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) |
| |
| template <typename T> |
| struct has_internal_pointer_element |
| { |
| template <typename X> |
| static char test(int, typename X::element_type*); |
| |
| template <typename X> |
| static int test(...); |
| |
| static const bool value = (1 == sizeof(test<T>(0, 0))); |
| }; |
| |
| template<class Ptr, bool = has_internal_pointer_element<Ptr>::value> |
| struct pointer_element_impl |
| { |
| typedef typename Ptr::element_type type; |
| }; |
| |
| template<class Ptr> |
| struct pointer_element_impl<Ptr, false> |
| { |
| typedef typename boost::movelib::detail::first_param<Ptr>::type type; |
| }; |
| |
| } //namespace detail{ |
| |
| template <typename Ptr> |
| struct pointer_element |
| { |
| typedef typename ::boost::movelib::detail::pointer_element_impl<Ptr>::type type; |
| }; |
| |
| template <typename T> |
| struct pointer_element<T*> |
| { typedef T type; }; |
| |
| } //namespace movelib { |
| } //namespace boost { |
| |
| #endif // defined(BOOST_MOVE_DETAIL_POINTER_ELEMENT_HPP) |