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) |