169 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // (C) Copyright Ion Gaztanaga 2014-2014. 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/intrusive for documentation.
 | |
| //
 | |
| //////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
 | |
| #define BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
 | |
| 
 | |
| #ifndef BOOST_CONFIG_HPP
 | |
| #  include <boost/config.hpp>
 | |
| #endif
 | |
| 
 | |
| #if defined(BOOST_HAS_PRAGMA_ONCE)
 | |
| #  pragma once
 | |
| #endif
 | |
| 
 | |
| #ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
 | |
| #include <boost/intrusive/detail/workaround.hpp>
 | |
| #endif   //BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
 | |
| 
 | |
| namespace boost {
 | |
| namespace intrusive {
 | |
| 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::intrusive::detail::first_param<Ptr>::type type;
 | |
| };
 | |
| 
 | |
| }  //namespace detail{
 | |
| 
 | |
| template <typename Ptr>
 | |
| struct pointer_element
 | |
| {
 | |
|    typedef typename ::boost::intrusive::detail::pointer_element_impl<Ptr>::type type;
 | |
| };
 | |
| 
 | |
| template <typename T>
 | |
| struct pointer_element<T*>
 | |
| {  typedef T type; };
 | |
| 
 | |
| }  //namespace container {
 | |
| }  //namespace boost {
 | |
| 
 | |
| #endif // defined(BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP)
 | 
