annotate DEPENDENCIES/generic/include/boost/intrusive/detail/pointer_element.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents f46d142149f5
children
rev   line source
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)