1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/libs/intrusive for documentation.
9 //////////////////////////////////////////////////////////////////////////////
11 #ifndef BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
12 #define BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
14 #ifndef BOOST_CONFIG_HPP
15 # include <boost/config.hpp>
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
22 #ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
23 #include <boost/intrusive/detail/workaround.hpp>
24 #endif //BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
30 //////////////////////
32 //////////////////////
34 template <typename T> struct first_param
35 { typedef void type; };
37 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
39 template <template <typename, typename...> class TemplateClass, typename T, typename... Args>
40 struct first_param< TemplateClass<T, Args...> >
45 #else //C++03 compilers
47 template < template //0arg
49 > class TemplateClass, class T
55 template < template //1arg
57 > class TemplateClass, class T
60 < TemplateClass<T, P0> >
63 template < template //2arg
65 > class TemplateClass, class T
68 < TemplateClass<T, P0, P1> >
71 template < template //3arg
72 <class,class,class,class
73 > class TemplateClass, class T
74 , class P0, class P1, class P2>
76 < TemplateClass<T, P0, P1, P2> >
79 template < template //4arg
80 <class,class,class,class,class
81 > class TemplateClass, class T
82 , class P0, class P1, class P2, class P3>
84 < TemplateClass<T, P0, P1, P2, P3> >
87 template < template //5arg
88 <class,class,class,class,class,class
89 > class TemplateClass, class T
90 , class P0, class P1, class P2, class P3, class P4>
92 < TemplateClass<T, P0, P1, P2, P3, P4> >
95 template < template //6arg
96 <class,class,class,class,class,class,class
97 > class TemplateClass, class T
98 , class P0, class P1, class P2, class P3, class P4, class P5>
100 < TemplateClass<T, P0, P1, P2, P3, P4, P5> >
103 template < template //7arg
104 <class,class,class,class,class,class,class,class
105 > class TemplateClass, class T
106 , class P0, class P1, class P2, class P3, class P4, class P5, class P6>
108 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6> >
111 template < template //8arg
112 <class,class,class,class,class,class,class,class,class
113 > class TemplateClass, class T
114 , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7>
116 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7> >
119 template < template //9arg
120 <class,class,class,class,class,class,class,class,class,class
121 > class TemplateClass, class T
122 , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
124 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7, P8> >
127 #endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
129 template <typename T>
130 struct has_internal_pointer_element
132 template <typename X>
133 static char test(int, typename X::element_type*);
135 template <typename X>
136 static int test(...);
138 static const bool value = (1 == sizeof(test<T>(0, 0)));
141 template<class Ptr, bool = has_internal_pointer_element<Ptr>::value>
142 struct pointer_element_impl
144 typedef typename Ptr::element_type type;
148 struct pointer_element_impl<Ptr, false>
150 typedef typename boost::intrusive::detail::first_param<Ptr>::type type;
153 } //namespace detail{
155 template <typename Ptr>
156 struct pointer_element
158 typedef typename ::boost::intrusive::detail::pointer_element_impl<Ptr>::type type;
161 template <typename T>
162 struct pointer_element<T*>
165 } //namespace container {
166 } //namespace boost {
168 #endif // defined(BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP)