Chris@102
|
1 //////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
2 //
|
Chris@102
|
3 // (C) Copyright Ion Gaztanaga 2014-2014. Distributed under the Boost
|
Chris@102
|
4 // Software License, Version 1.0. (See accompanying file
|
Chris@102
|
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
6 //
|
Chris@102
|
7 // See http://www.boost.org/libs/intrusive for documentation.
|
Chris@102
|
8 //
|
Chris@102
|
9 //////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
10
|
Chris@102
|
11 #ifndef BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
|
Chris@102
|
12 #define BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP
|
Chris@102
|
13
|
Chris@102
|
14 #ifndef BOOST_CONFIG_HPP
|
Chris@102
|
15 # include <boost/config.hpp>
|
Chris@102
|
16 #endif
|
Chris@102
|
17
|
Chris@102
|
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@102
|
19 # pragma once
|
Chris@102
|
20 #endif
|
Chris@102
|
21
|
Chris@102
|
22 #ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
|
Chris@102
|
23 #include <boost/intrusive/detail/workaround.hpp>
|
Chris@102
|
24 #endif //BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
|
Chris@102
|
25
|
Chris@102
|
26 namespace boost {
|
Chris@102
|
27 namespace intrusive {
|
Chris@102
|
28 namespace detail{
|
Chris@102
|
29
|
Chris@102
|
30 //////////////////////
|
Chris@102
|
31 //struct first_param
|
Chris@102
|
32 //////////////////////
|
Chris@102
|
33
|
Chris@102
|
34 template <typename T> struct first_param
|
Chris@102
|
35 { typedef void type; };
|
Chris@102
|
36
|
Chris@102
|
37 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@102
|
38
|
Chris@102
|
39 template <template <typename, typename...> class TemplateClass, typename T, typename... Args>
|
Chris@102
|
40 struct first_param< TemplateClass<T, Args...> >
|
Chris@102
|
41 {
|
Chris@102
|
42 typedef T type;
|
Chris@102
|
43 };
|
Chris@102
|
44
|
Chris@102
|
45 #else //C++03 compilers
|
Chris@102
|
46
|
Chris@102
|
47 template < template //0arg
|
Chris@102
|
48 <class
|
Chris@102
|
49 > class TemplateClass, class T
|
Chris@102
|
50 >
|
Chris@102
|
51 struct first_param
|
Chris@102
|
52 < TemplateClass<T> >
|
Chris@102
|
53 { typedef T type; };
|
Chris@102
|
54
|
Chris@102
|
55 template < template //1arg
|
Chris@102
|
56 <class,class
|
Chris@102
|
57 > class TemplateClass, class T
|
Chris@102
|
58 , class P0>
|
Chris@102
|
59 struct first_param
|
Chris@102
|
60 < TemplateClass<T, P0> >
|
Chris@102
|
61 { typedef T type; };
|
Chris@102
|
62
|
Chris@102
|
63 template < template //2arg
|
Chris@102
|
64 <class,class,class
|
Chris@102
|
65 > class TemplateClass, class T
|
Chris@102
|
66 , class P0, class P1>
|
Chris@102
|
67 struct first_param
|
Chris@102
|
68 < TemplateClass<T, P0, P1> >
|
Chris@102
|
69 { typedef T type; };
|
Chris@102
|
70
|
Chris@102
|
71 template < template //3arg
|
Chris@102
|
72 <class,class,class,class
|
Chris@102
|
73 > class TemplateClass, class T
|
Chris@102
|
74 , class P0, class P1, class P2>
|
Chris@102
|
75 struct first_param
|
Chris@102
|
76 < TemplateClass<T, P0, P1, P2> >
|
Chris@102
|
77 { typedef T type; };
|
Chris@102
|
78
|
Chris@102
|
79 template < template //4arg
|
Chris@102
|
80 <class,class,class,class,class
|
Chris@102
|
81 > class TemplateClass, class T
|
Chris@102
|
82 , class P0, class P1, class P2, class P3>
|
Chris@102
|
83 struct first_param
|
Chris@102
|
84 < TemplateClass<T, P0, P1, P2, P3> >
|
Chris@102
|
85 { typedef T type; };
|
Chris@102
|
86
|
Chris@102
|
87 template < template //5arg
|
Chris@102
|
88 <class,class,class,class,class,class
|
Chris@102
|
89 > class TemplateClass, class T
|
Chris@102
|
90 , class P0, class P1, class P2, class P3, class P4>
|
Chris@102
|
91 struct first_param
|
Chris@102
|
92 < TemplateClass<T, P0, P1, P2, P3, P4> >
|
Chris@102
|
93 { typedef T type; };
|
Chris@102
|
94
|
Chris@102
|
95 template < template //6arg
|
Chris@102
|
96 <class,class,class,class,class,class,class
|
Chris@102
|
97 > class TemplateClass, class T
|
Chris@102
|
98 , class P0, class P1, class P2, class P3, class P4, class P5>
|
Chris@102
|
99 struct first_param
|
Chris@102
|
100 < TemplateClass<T, P0, P1, P2, P3, P4, P5> >
|
Chris@102
|
101 { typedef T type; };
|
Chris@102
|
102
|
Chris@102
|
103 template < template //7arg
|
Chris@102
|
104 <class,class,class,class,class,class,class,class
|
Chris@102
|
105 > class TemplateClass, class T
|
Chris@102
|
106 , class P0, class P1, class P2, class P3, class P4, class P5, class P6>
|
Chris@102
|
107 struct first_param
|
Chris@102
|
108 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6> >
|
Chris@102
|
109 { typedef T type; };
|
Chris@102
|
110
|
Chris@102
|
111 template < template //8arg
|
Chris@102
|
112 <class,class,class,class,class,class,class,class,class
|
Chris@102
|
113 > class TemplateClass, class T
|
Chris@102
|
114 , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7>
|
Chris@102
|
115 struct first_param
|
Chris@102
|
116 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7> >
|
Chris@102
|
117 { typedef T type; };
|
Chris@102
|
118
|
Chris@102
|
119 template < template //9arg
|
Chris@102
|
120 <class,class,class,class,class,class,class,class,class,class
|
Chris@102
|
121 > class TemplateClass, class T
|
Chris@102
|
122 , class P0, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
|
Chris@102
|
123 struct first_param
|
Chris@102
|
124 < TemplateClass<T, P0, P1, P2, P3, P4, P5, P6, P7, P8> >
|
Chris@102
|
125 { typedef T type; };
|
Chris@102
|
126
|
Chris@102
|
127 #endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@102
|
128
|
Chris@102
|
129 template <typename T>
|
Chris@102
|
130 struct has_internal_pointer_element
|
Chris@102
|
131 {
|
Chris@102
|
132 template <typename X>
|
Chris@102
|
133 static char test(int, typename X::element_type*);
|
Chris@102
|
134
|
Chris@102
|
135 template <typename X>
|
Chris@102
|
136 static int test(...);
|
Chris@102
|
137
|
Chris@102
|
138 static const bool value = (1 == sizeof(test<T>(0, 0)));
|
Chris@102
|
139 };
|
Chris@102
|
140
|
Chris@102
|
141 template<class Ptr, bool = has_internal_pointer_element<Ptr>::value>
|
Chris@102
|
142 struct pointer_element_impl
|
Chris@102
|
143 {
|
Chris@102
|
144 typedef typename Ptr::element_type type;
|
Chris@102
|
145 };
|
Chris@102
|
146
|
Chris@102
|
147 template<class Ptr>
|
Chris@102
|
148 struct pointer_element_impl<Ptr, false>
|
Chris@102
|
149 {
|
Chris@102
|
150 typedef typename boost::intrusive::detail::first_param<Ptr>::type type;
|
Chris@102
|
151 };
|
Chris@102
|
152
|
Chris@102
|
153 } //namespace detail{
|
Chris@102
|
154
|
Chris@102
|
155 template <typename Ptr>
|
Chris@102
|
156 struct pointer_element
|
Chris@102
|
157 {
|
Chris@102
|
158 typedef typename ::boost::intrusive::detail::pointer_element_impl<Ptr>::type type;
|
Chris@102
|
159 };
|
Chris@102
|
160
|
Chris@102
|
161 template <typename T>
|
Chris@102
|
162 struct pointer_element<T*>
|
Chris@102
|
163 { typedef T type; };
|
Chris@102
|
164
|
Chris@102
|
165 } //namespace container {
|
Chris@102
|
166 } //namespace boost {
|
Chris@102
|
167
|
Chris@102
|
168 #endif // defined(BOOST_INTRUSIVE_DETAIL_POINTER_ELEMENT_HPP)
|