| 1 | // TR1 functional header -*- C++ -*- | 
 
 
 
 
 | 2 |  | 
 
 
 
 
 | 3 | // Copyright (C) 2004-2021 Free Software Foundation, Inc. | 
 
 
 
 
 | 4 | // | 
 
 
 
 
 | 5 | // This file is part of the GNU ISO C++ Library.  This library is free | 
 
 
 
 
 | 6 | // software; you can redistribute it and/or modify it under the | 
 
 
 
 
 | 7 | // terms of the GNU General Public License as published by the | 
 
 
 
 
 | 8 | // Free Software Foundation; either version 3, or (at your option) | 
 
 
 
 
 | 9 | // any later version. | 
 
 
 
 
 | 10 |  | 
 
 
 
 
 | 11 | // This library is distributed in the hope that it will be useful, | 
 
 
 
 
 | 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 
 
 
 
 | 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 
 
 
 
 | 14 | // GNU General Public License for more details. | 
 
 
 
 
 | 15 |  | 
 
 
 
 
 | 16 | // Under Section 7 of GPL version 3, you are granted additional | 
 
 
 
 
 | 17 | // permissions described in the GCC Runtime Library Exception, version | 
 
 
 
 
 | 18 | // 3.1, as published by the Free Software Foundation. | 
 
 
 
 
 | 19 |  | 
 
 
 
 
 | 20 | // You should have received a copy of the GNU General Public License and | 
 
 
 
 
 | 21 | // a copy of the GCC Runtime Library Exception along with this program; | 
 
 
 
 
 | 22 | // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see | 
 
 
 
 
 | 23 | // <http://www.gnu.org/licenses/>. | 
 
 
 
 
 | 24 |  | 
 
 
 
 
 | 25 | /** @file tr1/functional | 
 
 
 
 
 | 26 | *  This is a TR1 C++ Library header. | 
 
 
 
 
 | 27 | */ | 
 
 
 
 
 | 28 |  | 
 
 
 
 
 | 29 | #ifndef _GLIBCXX_TR1_FUNCTIONAL | 
 
 
 
 
 | 30 | #define _GLIBCXX_TR1_FUNCTIONAL 1 | 
 
 
 
 
 | 31 |  | 
 
 
 
 
 | 32 | #pragma GCC system_header | 
 
 
 
 
 | 33 |  | 
 
 
 
 
 | 34 | #include <functional> // for std::_Placeholder, std::_Bind, std::_Bind_result | 
 
 
 
 
 | 35 |  | 
 
 
 
 
 | 36 | #include <typeinfo> | 
 
 
 
 
 | 37 | #include <new> | 
 
 
 
 
 | 38 | #include <tr1/tuple> | 
 
 
 
 
 | 39 | #include <tr1/type_traits> | 
 
 
 
 
 | 40 | #include <bits/stringfwd.h> | 
 
 
 
 
 | 41 | #include <tr1/functional_hash.h> | 
 
 
 
 
 | 42 | #include <ext/type_traits.h> | 
 
 
 
 
 | 43 | #include <bits/move.h> // for std::__addressof | 
 
 
 
 
 | 44 |  | 
 
 
 
 
 | 45 | namespace std _GLIBCXX_VISIBILITY(default) | 
 
 
 
 
 | 46 | { | 
 
 
 
 
 | 47 | _GLIBCXX_BEGIN_NAMESPACE_VERSION | 
 
 
 
 
 | 48 |  | 
 
 
 
 
 | 49 | #if __cplusplus < 201103L | 
 
 
 
 
 | 50 | // In C++98 mode, <functional> doesn't declare std::placeholders::_1 etc. | 
 
 
 
 
 | 51 | // because they are not reserved names in C++98. However, they are reserved | 
 
 
 
 
 | 52 | // by <tr1/functional> so we can declare them here, in order to redeclare | 
 
 
 
 
 | 53 | // them in the std::tr1::placeholders namespace below. | 
 
 
 
 
 | 54 | namespace placeholders | 
 
 
 
 
 | 55 | { | 
 
 
 
 
 | 56 | extern const _Placeholder<1> _1; | 
 
 
 
 
 | 57 | extern const _Placeholder<2> _2; | 
 
 
 
 
 | 58 | extern const _Placeholder<3> _3; | 
 
 
 
 
 | 59 | extern const _Placeholder<4> _4; | 
 
 
 
 
 | 60 | extern const _Placeholder<5> _5; | 
 
 
 
 
 | 61 | extern const _Placeholder<6> _6; | 
 
 
 
 
 | 62 | extern const _Placeholder<7> _7; | 
 
 
 
 
 | 63 | extern const _Placeholder<8> _8; | 
 
 
 
 
 | 64 | extern const _Placeholder<9> _9; | 
 
 
 
 
 | 65 | extern const _Placeholder<10> _10; | 
 
 
 
 
 | 66 | extern const _Placeholder<11> _11; | 
 
 
 
 
 | 67 | extern const _Placeholder<12> _12; | 
 
 
 
 
 | 68 | extern const _Placeholder<13> _13; | 
 
 
 
 
 | 69 | extern const _Placeholder<14> _14; | 
 
 
 
 
 | 70 | extern const _Placeholder<15> _15; | 
 
 
 
 
 | 71 | extern const _Placeholder<16> _16; | 
 
 
 
 
 | 72 | extern const _Placeholder<17> _17; | 
 
 
 
 
 | 73 | extern const _Placeholder<18> _18; | 
 
 
 
 
 | 74 | extern const _Placeholder<19> _19; | 
 
 
 
 
 | 75 | extern const _Placeholder<20> _20; | 
 
 
 
 
 | 76 | extern const _Placeholder<21> _21; | 
 
 
 
 
 | 77 | extern const _Placeholder<22> _22; | 
 
 
 
 
 | 78 | extern const _Placeholder<23> _23; | 
 
 
 
 
 | 79 | extern const _Placeholder<24> _24; | 
 
 
 
 
 | 80 | extern const _Placeholder<25> _25; | 
 
 
 
 
 | 81 | extern const _Placeholder<26> _26; | 
 
 
 
 
 | 82 | extern const _Placeholder<27> _27; | 
 
 
 
 
 | 83 | extern const _Placeholder<28> _28; | 
 
 
 
 
 | 84 | extern const _Placeholder<29> _29; | 
 
 
 
 
 | 85 | } | 
 
 
 
 
 | 86 | #endif // C++98 | 
 
 
 
 
 | 87 |  | 
 
 
 
 
 | 88 | namespace tr1 | 
 
 
 
 
 | 89 | { | 
 
 
 
 
 | 90 | template<typename _MemberPointer> | 
 
 
 
 
 | 91 | class _Mem_fn; | 
 
 
 
 
 | 92 | template<typename _Tp, typename _Class> | 
 
 
 
 
 | 93 | _Mem_fn<_Tp _Class::*> | 
 
 
 
 
 | 94 | mem_fn(_Tp _Class::*); | 
 
 
 
 
 | 95 |  | 
 
 
 
 
 | 96 | /** | 
 
 
 
 
 | 97 | *  Actual implementation of _Has_result_type, which uses SFINAE to | 
 
 
 
 
 | 98 | *  determine if the type _Tp has a publicly-accessible member type | 
 
 
 
 
 | 99 | *  result_type. | 
 
 
 
 
 | 100 | */ | 
 
 
 
 
 | 101 | template<typename _Tp> | 
 
 
 
 
 | 102 | class _Has_result_type_helper : __sfinae_types | 
 
 
 
 
 | 103 | { | 
 
 
 
 
 | 104 | template<typename _Up> | 
 
 
 
 
 | 105 | struct _Wrap_type | 
 
 
 
 
 | 106 | { }; | 
 
 
 
 
 | 107 |  | 
 
 
 
 
 | 108 | template<typename _Up> | 
 
 
 
 
 | 109 | static __one __test(_Wrap_type<typename _Up::result_type>*); | 
 
 
 
 
 | 110 |  | 
 
 
 
 
 | 111 | template<typename _Up> | 
 
 
 
 
 | 112 | static __two __test(...); | 
 
 
 
 
 | 113 |  | 
 
 
 
 
 | 114 | public: | 
 
 
 
 
 | 115 | static const bool value = sizeof(__test<_Tp>(0)) == 1; | 
 
 
 
 
 | 116 | }; | 
 
 
 
 
 | 117 |  | 
 
 
 
 
 | 118 | template<typename _Tp> | 
 
 
 
 
 | 119 | struct _Has_result_type | 
 
 
 
 
 | 120 | : integral_constant<bool, | 
 
 
 
 
 | 121 | _Has_result_type_helper<typename remove_cv<_Tp>::type>::value> | 
 
 
 
 
 | 122 | { }; | 
 
 
 
 
 | 123 |  | 
 
 
 
 
 | 124 | /** | 
 
 
 
 
 | 125 | * | 
 
 
 
 
 | 126 | */ | 
 
 
 
 
 | 127 | /// If we have found a result_type, extract it. | 
 
 
 
 
 | 128 | template<bool _Has_result_type, typename _Functor> | 
 
 
 
 
 | 129 | struct _Maybe_get_result_type | 
 
 
 
 
 | 130 | { }; | 
 
 
 
 
 | 131 |  | 
 
 
 
 
 | 132 | template<typename _Functor> | 
 
 
 
 
 | 133 | struct _Maybe_get_result_type<true, _Functor> | 
 
 
 
 
 | 134 | { | 
 
 
 
 
 | 135 | typedef typename _Functor::result_type result_type; | 
 
 
 
 
 | 136 | }; | 
 
 
 
 
 | 137 |  | 
 
 
 
 
 | 138 | /** | 
 
 
 
 
 | 139 | *  Base class for any function object that has a weak result type, as | 
 
 
 
 
 | 140 | *  defined in 3.3/3 of TR1. | 
 
 
 
 
 | 141 | */ | 
 
 
 
 
 | 142 | template<typename _Functor> | 
 
 
 
 
 | 143 | struct _Weak_result_type_impl | 
 
 
 
 
 | 144 | : _Maybe_get_result_type<_Has_result_type<_Functor>::value, _Functor> | 
 
 
 
 
 | 145 | { | 
 
 
 
 
 | 146 | }; | 
 
 
 
 
 | 147 |  | 
 
 
 
 
 | 148 | /// Retrieve the result type for a function type. | 
 
 
 
 
 | 149 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 150 | struct _Weak_result_type_impl<_Res(_ArgTypes...)> | 
 
 
 
 
 | 151 | { | 
 
 
 
 
 | 152 | typedef _Res result_type; | 
 
 
 
 
 | 153 | }; | 
 
 
 
 
 | 154 |  | 
 
 
 
 
 | 155 | /// Retrieve the result type for a function reference. | 
 
 
 
 
 | 156 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 157 | struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> | 
 
 
 
 
 | 158 | { | 
 
 
 
 
 | 159 | typedef _Res result_type; | 
 
 
 
 
 | 160 | }; | 
 
 
 
 
 | 161 |  | 
 
 
 
 
 | 162 | /// Retrieve the result type for a function pointer. | 
 
 
 
 
 | 163 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 164 | struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> | 
 
 
 
 
 | 165 | { | 
 
 
 
 
 | 166 | typedef _Res result_type; | 
 
 
 
 
 | 167 | }; | 
 
 
 
 
 | 168 |  | 
 
 
 
 
 | 169 | /// Retrieve result type for a member function pointer. | 
 
 
 
 
 | 170 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 171 | struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> | 
 
 
 
 
 | 172 | { | 
 
 
 
 
 | 173 | typedef _Res result_type; | 
 
 
 
 
 | 174 | }; | 
 
 
 
 
 | 175 |  | 
 
 
 
 
 | 176 | /// Retrieve result type for a const member function pointer. | 
 
 
 
 
 | 177 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 178 | struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> | 
 
 
 
 
 | 179 | { | 
 
 
 
 
 | 180 | typedef _Res result_type; | 
 
 
 
 
 | 181 | }; | 
 
 
 
 
 | 182 |  | 
 
 
 
 
 | 183 | /// Retrieve result type for a volatile member function pointer. | 
 
 
 
 
 | 184 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 185 | struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> | 
 
 
 
 
 | 186 | { | 
 
 
 
 
 | 187 | typedef _Res result_type; | 
 
 
 
 
 | 188 | }; | 
 
 
 
 
 | 189 |  | 
 
 
 
 
 | 190 | /// Retrieve result type for a const volatile member function pointer. | 
 
 
 
 
 | 191 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 192 | struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile> | 
 
 
 
 
 | 193 | { | 
 
 
 
 
 | 194 | typedef _Res result_type; | 
 
 
 
 
 | 195 | }; | 
 
 
 
 
 | 196 |  | 
 
 
 
 
 | 197 | /** | 
 
 
 
 
 | 198 | *  Strip top-level cv-qualifiers from the function object and let | 
 
 
 
 
 | 199 | *  _Weak_result_type_impl perform the real work. | 
 
 
 
 
 | 200 | */ | 
 
 
 
 
 | 201 | template<typename _Functor> | 
 
 
 
 
 | 202 | struct _Weak_result_type | 
 
 
 
 
 | 203 | : _Weak_result_type_impl<typename remove_cv<_Functor>::type> | 
 
 
 
 
 | 204 | { | 
 
 
 
 
 | 205 | }; | 
 
 
 
 
 | 206 |  | 
 
 
 
 
 | 207 | template<typename _Signature> | 
 
 
 
 
 | 208 | class result_of; | 
 
 
 
 
 | 209 |  | 
 
 
 
 
 | 210 | /** | 
 
 
 
 
 | 211 | *  Actual implementation of result_of. When _Has_result_type is | 
 
 
 
 
 | 212 | *  true, gets its result from _Weak_result_type. Otherwise, uses | 
 
 
 
 
 | 213 | *  the function object's member template result to extract the | 
 
 
 
 
 | 214 | *  result type. | 
 
 
 
 
 | 215 | */ | 
 
 
 
 
 | 216 | template<bool _Has_result_type, typename _Signature> | 
 
 
 
 
 | 217 | struct _Result_of_impl; | 
 
 
 
 
 | 218 |  | 
 
 
 
 
 | 219 | // Handle member data pointers using _Mem_fn's logic | 
 
 
 
 
 | 220 | template<typename _Res, typename _Class, typename _T1> | 
 
 
 
 
 | 221 | struct _Result_of_impl<false, _Res _Class::*(_T1)> | 
 
 
 
 
 | 222 | { | 
 
 
 
 
 | 223 | typedef typename _Mem_fn<_Res _Class::*> | 
 
 
 
 
 | 224 | ::template _Result_type<_T1>::type type; | 
 
 
 
 
 | 225 | }; | 
 
 
 
 
 | 226 |  | 
 
 
 
 
 | 227 | /** | 
 
 
 
 
 | 228 | * Determine whether we can determine a result type from @c Functor | 
 
 
 
 
 | 229 | * alone. | 
 
 
 
 
 | 230 | */ | 
 
 
 
 
 | 231 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 232 | class result_of<_Functor(_ArgTypes...)> | 
 
 
 
 
 | 233 | : public _Result_of_impl< | 
 
 
 
 
 | 234 | _Has_result_type<_Weak_result_type<_Functor> >::value, | 
 
 
 
 
 | 235 | _Functor(_ArgTypes...)> | 
 
 
 
 
 | 236 | { | 
 
 
 
 
 | 237 | }; | 
 
 
 
 
 | 238 |  | 
 
 
 
 
 | 239 | /// We already know the result type for @c Functor; use it. | 
 
 
 
 
 | 240 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 241 | struct _Result_of_impl<true, _Functor(_ArgTypes...)> | 
 
 
 
 
 | 242 | { | 
 
 
 
 
 | 243 | typedef typename _Weak_result_type<_Functor>::result_type type; | 
 
 
 
 
 | 244 | }; | 
 
 
 
 
 | 245 |  | 
 
 
 
 
 | 246 | /** | 
 
 
 
 
 | 247 | * We need to compute the result type for this invocation the hard | 
 
 
 
 
 | 248 | * way. | 
 
 
 
 
 | 249 | */ | 
 
 
 
 
 | 250 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 251 | struct _Result_of_impl<false, _Functor(_ArgTypes...)> | 
 
 
 
 
 | 252 | { | 
 
 
 
 
 | 253 | typedef typename _Functor | 
 
 
 
 
 | 254 | ::template result<_Functor(_ArgTypes...)>::type type; | 
 
 
 
 
 | 255 | }; | 
 
 
 
 
 | 256 |  | 
 
 
 
 
 | 257 | /** | 
 
 
 
 
 | 258 | * It is unsafe to access ::result when there are zero arguments, so we | 
 
 
 
 
 | 259 | * return @c void instead. | 
 
 
 
 
 | 260 | */ | 
 
 
 
 
 | 261 | template<typename _Functor> | 
 
 
 
 
 | 262 | struct _Result_of_impl<false, _Functor()> | 
 
 
 
 
 | 263 | { | 
 
 
 
 
 | 264 | typedef void type; | 
 
 
 
 
 | 265 | }; | 
 
 
 
 
 | 266 |  | 
 
 
 
 
 | 267 | /// Determines if the type _Tp derives from unary_function. | 
 
 
 
 
 | 268 | template<typename _Tp> | 
 
 
 
 
 | 269 | struct _Derives_from_unary_function : __sfinae_types | 
 
 
 
 
 | 270 | { | 
 
 
 
 
 | 271 | private: | 
 
 
 
 
 | 272 | template<typename _T1, typename _Res> | 
 
 
 
 
 | 273 | static __one __test(const volatile unary_function<_T1, _Res>*); | 
 
 
 
 
 | 274 |  | 
 
 
 
 
 | 275 | // It's tempting to change "..." to const volatile void*, but | 
 
 
 
 
 | 276 | // that fails when _Tp is a function type. | 
 
 
 
 
 | 277 | static __two __test(...); | 
 
 
 
 
 | 278 |  | 
 
 
 
 
 | 279 | public: | 
 
 
 
 
 | 280 | static const bool value = sizeof(__test((_Tp*)0)) == 1; | 
 
 
 
 
 | 281 | }; | 
 
 
 
 
 | 282 |  | 
 
 
 
 
 | 283 | /// Determines if the type _Tp derives from binary_function. | 
 
 
 
 
 | 284 | template<typename _Tp> | 
 
 
 
 
 | 285 | struct _Derives_from_binary_function : __sfinae_types | 
 
 
 
 
 | 286 | { | 
 
 
 
 
 | 287 | private: | 
 
 
 
 
 | 288 | template<typename _T1, typename _T2, typename _Res> | 
 
 
 
 
 | 289 | static __one __test(const volatile binary_function<_T1, _T2, _Res>*); | 
 
 
 
 
 | 290 |  | 
 
 
 
 
 | 291 | // It's tempting to change "..." to const volatile void*, but | 
 
 
 
 
 | 292 | // that fails when _Tp is a function type. | 
 
 
 
 
 | 293 | static __two __test(...); | 
 
 
 
 
 | 294 |  | 
 
 
 
 
 | 295 | public: | 
 
 
 
 
 | 296 | static const bool value = sizeof(__test((_Tp*)0)) == 1; | 
 
 
 
 
 | 297 | }; | 
 
 
 
 
 | 298 |  | 
 
 
 
 
 | 299 | /// Turns a function type into a function pointer type | 
 
 
 
 
 | 300 | template<typename _Tp, bool _IsFunctionType = is_function<_Tp>::value> | 
 
 
 
 
 | 301 | struct _Function_to_function_pointer | 
 
 
 
 
 | 302 | { | 
 
 
 
 
 | 303 | typedef _Tp type; | 
 
 
 
 
 | 304 | }; | 
 
 
 
 
 | 305 |  | 
 
 
 
 
 | 306 | template<typename _Tp> | 
 
 
 
 
 | 307 | struct _Function_to_function_pointer<_Tp, true> | 
 
 
 
 
 | 308 | { | 
 
 
 
 
 | 309 | typedef _Tp* type; | 
 
 
 
 
 | 310 | }; | 
 
 
 
 
 | 311 |  | 
 
 
 
 
 | 312 | /** | 
 
 
 
 
 | 313 | * Invoke a function object, which may be either a member pointer or a | 
 
 
 
 
 | 314 | * function object. The first parameter will tell which. | 
 
 
 
 
 | 315 | */ | 
 
 
 
 
 | 316 | template<typename _Functor, typename... _Args> | 
 
 
 
 
 | 317 | inline | 
 
 
 
 
 | 318 | typename __gnu_cxx::__enable_if< | 
 
 
 
 
 | 319 | (!is_member_pointer<_Functor>::value | 
 
 
 
 
 | 320 | && !is_function<_Functor>::value | 
 
 
 
 
 | 321 | && !is_function<typename remove_pointer<_Functor>::type>::value), | 
 
 
 
 
 | 322 | typename result_of<_Functor(_Args...)>::type | 
 
 
 
 
 | 323 | >::__type | 
 
 
 
 
 | 324 | __invoke(_Functor& __f, _Args&... __args) | 
 
 
 
 
 | 325 | { | 
 
 
 
 
 | 326 | return __f(__args...); | 
 
 
 
 
 | 327 | } | 
 
 
 
 
 | 328 |  | 
 
 
 
 
 | 329 | template<typename _Functor, typename... _Args> | 
 
 
 
 
 | 330 | inline | 
 
 
 
 
 | 331 | typename __gnu_cxx::__enable_if< | 
 
 
 
 
 | 332 | (is_member_pointer<_Functor>::value | 
 
 
 
 
 | 333 | && !is_function<_Functor>::value | 
 
 
 
 
 | 334 | && !is_function<typename remove_pointer<_Functor>::type>::value), | 
 
 
 
 
 | 335 | typename result_of<_Functor(_Args...)>::type | 
 
 
 
 
 | 336 | >::__type | 
 
 
 
 
 | 337 | __invoke(_Functor& __f, _Args&... __args) | 
 
 
 
 
 | 338 | { | 
 
 
 
 
 | 339 | return mem_fn(__f)(__args...); | 
 
 
 
 
 | 340 | } | 
 
 
 
 
 | 341 |  | 
 
 
 
 
 | 342 | // To pick up function references (that will become function pointers) | 
 
 
 
 
 | 343 | template<typename _Functor, typename... _Args> | 
 
 
 
 
 | 344 | inline | 
 
 
 
 
 | 345 | typename __gnu_cxx::__enable_if< | 
 
 
 
 
 | 346 | (is_pointer<_Functor>::value | 
 
 
 
 
 | 347 | && is_function<typename remove_pointer<_Functor>::type>::value), | 
 
 
 
 
 | 348 | typename result_of<_Functor(_Args...)>::type | 
 
 
 
 
 | 349 | >::__type | 
 
 
 
 
 | 350 | __invoke(_Functor __f, _Args&... __args) | 
 
 
 
 
 | 351 | { | 
 
 
 
 
 | 352 | return __f(__args...); | 
 
 
 
 
 | 353 | } | 
 
 
 
 
 | 354 |  | 
 
 
 
 
 | 355 | /** | 
 
 
 
 
 | 356 | *  Knowing which of unary_function and binary_function _Tp derives | 
 
 
 
 
 | 357 | *  from, derives from the same and ensures that reference_wrapper | 
 
 
 
 
 | 358 | *  will have a weak result type. See cases below. | 
 
 
 
 
 | 359 | */ | 
 
 
 
 
 | 360 | template<bool _Unary, bool _Binary, typename _Tp> | 
 
 
 
 
 | 361 | struct _Reference_wrapper_base_impl; | 
 
 
 
 
 | 362 |  | 
 
 
 
 
 | 363 | // Not a unary_function or binary_function, so try a weak result type. | 
 
 
 
 
 | 364 | template<typename _Tp> | 
 
 
 
 
 | 365 | struct _Reference_wrapper_base_impl<false, false, _Tp> | 
 
 
 
 
 | 366 | : _Weak_result_type<_Tp> | 
 
 
 
 
 | 367 | { }; | 
 
 
 
 
 | 368 |  | 
 
 
 
 
 | 369 | // unary_function but not binary_function | 
 
 
 
 
 | 370 | template<typename _Tp> | 
 
 
 
 
 | 371 | struct _Reference_wrapper_base_impl<true, false, _Tp> | 
 
 
 
 
 | 372 | : unary_function<typename _Tp::argument_type, | 
 
 
 
 
 | 373 | typename _Tp::result_type> | 
 
 
 
 
 | 374 | { }; | 
 
 
 
 
 | 375 |  | 
 
 
 
 
 | 376 | // binary_function but not unary_function | 
 
 
 
 
 | 377 | template<typename _Tp> | 
 
 
 
 
 | 378 | struct _Reference_wrapper_base_impl<false, true, _Tp> | 
 
 
 
 
 | 379 | : binary_function<typename _Tp::first_argument_type, | 
 
 
 
 
 | 380 | typename _Tp::second_argument_type, | 
 
 
 
 
 | 381 | typename _Tp::result_type> | 
 
 
 
 
 | 382 | { }; | 
 
 
 
 
 | 383 |  | 
 
 
 
 
 | 384 | // Both unary_function and binary_function. Import result_type to | 
 
 
 
 
 | 385 | // avoid conflicts. | 
 
 
 
 
 | 386 | template<typename _Tp> | 
 
 
 
 
 | 387 | struct _Reference_wrapper_base_impl<true, true, _Tp> | 
 
 
 
 
 | 388 | : unary_function<typename _Tp::argument_type, | 
 
 
 
 
 | 389 | typename _Tp::result_type>, | 
 
 
 
 
 | 390 | binary_function<typename _Tp::first_argument_type, | 
 
 
 
 
 | 391 | typename _Tp::second_argument_type, | 
 
 
 
 
 | 392 | typename _Tp::result_type> | 
 
 
 
 
 | 393 | { | 
 
 
 
 
 | 394 | typedef typename _Tp::result_type result_type; | 
 
 
 
 
 | 395 | }; | 
 
 
 
 
 | 396 |  | 
 
 
 
 
 | 397 | /** | 
 
 
 
 
 | 398 | *  Derives from unary_function or binary_function when it | 
 
 
 
 
 | 399 | *  can. Specializations handle all of the easy cases. The primary | 
 
 
 
 
 | 400 | *  template determines what to do with a class type, which may | 
 
 
 
 
 | 401 | *  derive from both unary_function and binary_function. | 
 
 
 
 
 | 402 | */ | 
 
 
 
 
 | 403 | template<typename _Tp> | 
 
 
 
 
 | 404 | struct _Reference_wrapper_base | 
 
 
 
 
 | 405 | : _Reference_wrapper_base_impl< | 
 
 
 
 
 | 406 | _Derives_from_unary_function<_Tp>::value, | 
 
 
 
 
 | 407 | _Derives_from_binary_function<_Tp>::value, | 
 
 
 
 
 | 408 | _Tp> | 
 
 
 
 
 | 409 | { }; | 
 
 
 
 
 | 410 |  | 
 
 
 
 
 | 411 | // - a function type (unary) | 
 
 
 
 
 | 412 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 413 | struct _Reference_wrapper_base<_Res(_T1)> | 
 
 
 
 
 | 414 | : unary_function<_T1, _Res> | 
 
 
 
 
 | 415 | { }; | 
 
 
 
 
 | 416 |  | 
 
 
 
 
 | 417 | // - a function type (binary) | 
 
 
 
 
 | 418 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 419 | struct _Reference_wrapper_base<_Res(_T1, _T2)> | 
 
 
 
 
 | 420 | : binary_function<_T1, _T2, _Res> | 
 
 
 
 
 | 421 | { }; | 
 
 
 
 
 | 422 |  | 
 
 
 
 
 | 423 | // - a function pointer type (unary) | 
 
 
 
 
 | 424 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 425 | struct _Reference_wrapper_base<_Res(*)(_T1)> | 
 
 
 
 
 | 426 | : unary_function<_T1, _Res> | 
 
 
 
 
 | 427 | { }; | 
 
 
 
 
 | 428 |  | 
 
 
 
 
 | 429 | // - a function pointer type (binary) | 
 
 
 
 
 | 430 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 431 | struct _Reference_wrapper_base<_Res(*)(_T1, _T2)> | 
 
 
 
 
 | 432 | : binary_function<_T1, _T2, _Res> | 
 
 
 
 
 | 433 | { }; | 
 
 
 
 
 | 434 |  | 
 
 
 
 
 | 435 | // - a pointer to member function type (unary, no qualifiers) | 
 
 
 
 
 | 436 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 437 | struct _Reference_wrapper_base<_Res (_T1::*)()> | 
 
 
 
 
 | 438 | : unary_function<_T1*, _Res> | 
 
 
 
 
 | 439 | { }; | 
 
 
 
 
 | 440 |  | 
 
 
 
 
 | 441 | // - a pointer to member function type (binary, no qualifiers) | 
 
 
 
 
 | 442 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 443 | struct _Reference_wrapper_base<_Res (_T1::*)(_T2)> | 
 
 
 
 
 | 444 | : binary_function<_T1*, _T2, _Res> | 
 
 
 
 
 | 445 | { }; | 
 
 
 
 
 | 446 |  | 
 
 
 
 
 | 447 | // - a pointer to member function type (unary, const) | 
 
 
 
 
 | 448 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 449 | struct _Reference_wrapper_base<_Res (_T1::*)() const> | 
 
 
 
 
 | 450 | : unary_function<const _T1*, _Res> | 
 
 
 
 
 | 451 | { }; | 
 
 
 
 
 | 452 |  | 
 
 
 
 
 | 453 | // - a pointer to member function type (binary, const) | 
 
 
 
 
 | 454 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 455 | struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const> | 
 
 
 
 
 | 456 | : binary_function<const _T1*, _T2, _Res> | 
 
 
 
 
 | 457 | { }; | 
 
 
 
 
 | 458 |  | 
 
 
 
 
 | 459 | // - a pointer to member function type (unary, volatile) | 
 
 
 
 
 | 460 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 461 | struct _Reference_wrapper_base<_Res (_T1::*)() volatile> | 
 
 
 
 
 | 462 | : unary_function<volatile _T1*, _Res> | 
 
 
 
 
 | 463 | { }; | 
 
 
 
 
 | 464 |  | 
 
 
 
 
 | 465 | // - a pointer to member function type (binary, volatile) | 
 
 
 
 
 | 466 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 467 | struct _Reference_wrapper_base<_Res (_T1::*)(_T2) volatile> | 
 
 
 
 
 | 468 | : binary_function<volatile _T1*, _T2, _Res> | 
 
 
 
 
 | 469 | { }; | 
 
 
 
 
 | 470 |  | 
 
 
 
 
 | 471 | // - a pointer to member function type (unary, const volatile) | 
 
 
 
 
 | 472 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 473 | struct _Reference_wrapper_base<_Res (_T1::*)() const volatile> | 
 
 
 
 
 | 474 | : unary_function<const volatile _T1*, _Res> | 
 
 
 
 
 | 475 | { }; | 
 
 
 
 
 | 476 |  | 
 
 
 
 
 | 477 | // - a pointer to member function type (binary, const volatile) | 
 
 
 
 
 | 478 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 479 | struct _Reference_wrapper_base<_Res (_T1::*)(_T2) const volatile> | 
 
 
 
 
 | 480 | : binary_function<const volatile _T1*, _T2, _Res> | 
 
 
 
 
 | 481 | { }; | 
 
 
 
 
 | 482 |  | 
 
 
 
 
 | 483 | /// reference_wrapper | 
 
 
 
 
 | 484 | template<typename _Tp> | 
 
 
 
 
 | 485 | class reference_wrapper | 
 
 
 
 
 | 486 | : public _Reference_wrapper_base<typename remove_cv<_Tp>::type> | 
 
 
 
 
 | 487 | { | 
 
 
 
 
 | 488 | // If _Tp is a function type, we can't form result_of<_Tp(...)>, | 
 
 
 
 
 | 489 | // so turn it into a function pointer type. | 
 
 
 
 
 | 490 | typedef typename _Function_to_function_pointer<_Tp>::type | 
 
 
 
 
 | 491 | _M_func_type; | 
 
 
 
 
 | 492 |  | 
 
 
 
 
 | 493 | _Tp* _M_data; | 
 
 
 
 
 | 494 | public: | 
 
 
 
 
 | 495 | typedef _Tp type; | 
 
 
 
 
 | 496 |  | 
 
 
 
 
 | 497 | explicit | 
 
 
 
 
 | 498 | reference_wrapper(_Tp& __indata) | 
 
 
 
 
 | 499 | : _M_data(std::__addressof(__indata)) | 
 
 
 
 
 | 500 | { } | 
 
 
 
 
 | 501 |  | 
 
 
 
 
 | 502 | reference_wrapper(const reference_wrapper<_Tp>& __inref): | 
 
 
 
 
 | 503 | _M_data(__inref._M_data) | 
 
 
 
 
 | 504 | { } | 
 
 
 
 
 | 505 |  | 
 
 
 
 
 | 506 | reference_wrapper& | 
 
 
 
 
 | 507 | operator=(const reference_wrapper<_Tp>& __inref) | 
 
 
 
 
 | 508 | { | 
 
 
 
 
 | 509 | _M_data = __inref._M_data; | 
 
 
 
 
 | 510 | return *this; | 
 
 
 
 
 | 511 | } | 
 
 
 
 
 | 512 |  | 
 
 
 
 
 | 513 | operator _Tp&() const | 
 
 
 
 
 | 514 | { return this->get(); } | 
 
 
 
 
 | 515 |  | 
 
 
 
 
 | 516 | _Tp& | 
 
 
 
 
 | 517 | get() const | 
 
 
 
 
 | 518 | { return *_M_data; } | 
 
 
 
 
 | 519 |  | 
 
 
 
 
 | 520 | template<typename... _Args> | 
 
 
 
 
 | 521 | typename result_of<_M_func_type(_Args...)>::type | 
 
 
 
 
 | 522 | operator()(_Args&... __args) const | 
 
 
 
 
 | 523 | { | 
 
 
 
 
 | 524 | return __invoke(get(), __args...); | 
 
 
 
 
 | 525 | } | 
 
 
 
 
 | 526 | }; | 
 
 
 
 
 | 527 |  | 
 
 
 
 
 | 528 |  | 
 
 
 
 
 | 529 | // Denotes a reference should be taken to a variable. | 
 
 
 
 
 | 530 | template<typename _Tp> | 
 
 
 
 
 | 531 | inline reference_wrapper<_Tp> | 
 
 
 
 
 | 532 | ref(_Tp& __t) | 
 
 
 
 
 | 533 | { return reference_wrapper<_Tp>(__t); } | 
 
 
 
 
 | 534 |  | 
 
 
 
 
 | 535 | // Denotes a const reference should be taken to a variable. | 
 
 
 
 
 | 536 | template<typename _Tp> | 
 
 
 
 
 | 537 | inline reference_wrapper<const _Tp> | 
 
 
 
 
 | 538 | cref(const _Tp& __t) | 
 
 
 
 
 | 539 | { return reference_wrapper<const _Tp>(__t); } | 
 
 
 
 
 | 540 |  | 
 
 
 
 
 | 541 | template<typename _Tp> | 
 
 
 
 
 | 542 | inline reference_wrapper<_Tp> | 
 
 
 
 
 | 543 | ref(reference_wrapper<_Tp> __t) | 
 
 
 
 
 | 544 | { return ref(__t.get()); } | 
 
 
 
 
 | 545 |  | 
 
 
 
 
 | 546 | template<typename _Tp> | 
 
 
 
 
 | 547 | inline reference_wrapper<const _Tp> | 
 
 
 
 
 | 548 | cref(reference_wrapper<_Tp> __t) | 
 
 
 
 
 | 549 | { return cref(__t.get()); } | 
 
 
 
 
 | 550 |  | 
 
 
 
 
 | 551 | template<typename _Tp, bool> | 
 
 
 
 
 | 552 | struct _Mem_fn_const_or_non | 
 
 
 
 
 | 553 | { | 
 
 
 
 
 | 554 | typedef const _Tp& type; | 
 
 
 
 
 | 555 | }; | 
 
 
 
 
 | 556 |  | 
 
 
 
 
 | 557 | template<typename _Tp> | 
 
 
 
 
 | 558 | struct _Mem_fn_const_or_non<_Tp, false> | 
 
 
 
 
 | 559 | { | 
 
 
 
 
 | 560 | typedef _Tp& type; | 
 
 
 
 
 | 561 | }; | 
 
 
 
 
 | 562 |  | 
 
 
 
 
 | 563 | /** | 
 
 
 
 
 | 564 | * Derives from @c unary_function or @c binary_function, or perhaps | 
 
 
 
 
 | 565 | * nothing, depending on the number of arguments provided. The | 
 
 
 
 
 | 566 | * primary template is the basis case, which derives nothing. | 
 
 
 
 
 | 567 | */ | 
 
 
 
 
 | 568 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 569 | struct _Maybe_unary_or_binary_function { }; | 
 
 
 
 
 | 570 |  | 
 
 
 
 
 | 571 | /// Derives from @c unary_function, as appropriate. | 
 
 
 
 
 | 572 | template<typename _Res, typename _T1> | 
 
 
 
 
 | 573 | struct _Maybe_unary_or_binary_function<_Res, _T1> | 
 
 
 
 
 | 574 | : std::unary_function<_T1, _Res> { }; | 
 
 
 
 
 | 575 |  | 
 
 
 
 
 | 576 | /// Derives from @c binary_function, as appropriate. | 
 
 
 
 
 | 577 | template<typename _Res, typename _T1, typename _T2> | 
 
 
 
 
 | 578 | struct _Maybe_unary_or_binary_function<_Res, _T1, _T2> | 
 
 
 
 
 | 579 | : std::binary_function<_T1, _T2, _Res> { }; | 
 
 
 
 
 | 580 |  | 
 
 
 
 
 | 581 | /// Implementation of @c mem_fn for member function pointers. | 
 
 
 
 
 | 582 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 583 | class _Mem_fn<_Res (_Class::*)(_ArgTypes...)> | 
 
 
 
 
 | 584 | : public _Maybe_unary_or_binary_function<_Res, _Class*, _ArgTypes...> | 
 
 
 
 
 | 585 | { | 
 
 
 
 
 | 586 | typedef _Res (_Class::*_Functor)(_ArgTypes...); | 
 
 
 
 
 | 587 |  | 
 
 
 
 
 | 588 | template<typename _Tp> | 
 
 
 
 
 | 589 | _Res | 
 
 
 
 
 | 590 | _M_call(_Tp& __object, const volatile _Class *, | 
 
 
 
 
 | 591 | _ArgTypes... __args) const | 
 
 
 
 
 | 592 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 593 |  | 
 
 
 
 
 | 594 | template<typename _Tp> | 
 
 
 
 
 | 595 | _Res | 
 
 
 
 
 | 596 | _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const | 
 
 
 
 
 | 597 | { return ((*__ptr).*__pmf)(__args...); } | 
 
 
 
 
 | 598 |  | 
 
 
 
 
 | 599 | public: | 
 
 
 
 
 | 600 | typedef _Res result_type; | 
 
 
 
 
 | 601 |  | 
 
 
 
 
 | 602 | explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } | 
 
 
 
 
 | 603 |  | 
 
 
 
 
 | 604 | // Handle objects | 
 
 
 
 
 | 605 | _Res | 
 
 
 
 
 | 606 | operator()(_Class& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 607 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 608 |  | 
 
 
 
 
 | 609 | // Handle pointers | 
 
 
 
 
 | 610 | _Res | 
 
 
 
 
 | 611 | operator()(_Class* __object, _ArgTypes... __args) const | 
 
 
 
 
 | 612 | { return (__object->*__pmf)(__args...); } | 
 
 
 
 
 | 613 |  | 
 
 
 
 
 | 614 | // Handle smart pointers, references and pointers to derived | 
 
 
 
 
 | 615 | template<typename _Tp> | 
 
 
 
 
 | 616 | _Res | 
 
 
 
 
 | 617 | operator()(_Tp& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 618 | { return _M_call(__object, &__object, __args...); } | 
 
 
 
 
 | 619 |  | 
 
 
 
 
 | 620 | private: | 
 
 
 
 
 | 621 | _Functor __pmf; | 
 
 
 
 
 | 622 | }; | 
 
 
 
 
 | 623 |  | 
 
 
 
 
 | 624 | /// Implementation of @c mem_fn for const member function pointers. | 
 
 
 
 
 | 625 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 626 | class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const> | 
 
 
 
 
 | 627 | : public _Maybe_unary_or_binary_function<_Res, const _Class*, | 
 
 
 
 
 | 628 | _ArgTypes...> | 
 
 
 
 
 | 629 | { | 
 
 
 
 
 | 630 | typedef _Res (_Class::*_Functor)(_ArgTypes...) const; | 
 
 
 
 
 | 631 |  | 
 
 
 
 
 | 632 | template<typename _Tp> | 
 
 
 
 
 | 633 | _Res | 
 
 
 
 
 | 634 | _M_call(_Tp& __object, const volatile _Class *, | 
 
 
 
 
 | 635 | _ArgTypes... __args) const | 
 
 
 
 
 | 636 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 637 |  | 
 
 
 
 
 | 638 | template<typename _Tp> | 
 
 
 
 
 | 639 | _Res | 
 
 
 
 
 | 640 | _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const | 
 
 
 
 
 | 641 | { return ((*__ptr).*__pmf)(__args...); } | 
 
 
 
 
 | 642 |  | 
 
 
 
 
 | 643 | public: | 
 
 
 
 
 | 644 | typedef _Res result_type; | 
 
 
 
 
 | 645 |  | 
 
 
 
 
 | 646 | explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } | 
 
 
 
 
 | 647 |  | 
 
 
 
 
 | 648 | // Handle objects | 
 
 
 
 
 | 649 | _Res | 
 
 
 
 
 | 650 | operator()(const _Class& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 651 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 652 |  | 
 
 
 
 
 | 653 | // Handle pointers | 
 
 
 
 
 | 654 | _Res | 
 
 
 
 
 | 655 | operator()(const _Class* __object, _ArgTypes... __args) const | 
 
 
 
 
 | 656 | { return (__object->*__pmf)(__args...); } | 
 
 
 
 
 | 657 |  | 
 
 
 
 
 | 658 | // Handle smart pointers, references and pointers to derived | 
 
 
 
 
 | 659 | template<typename _Tp> | 
 
 
 
 
 | 660 | _Res operator()(_Tp& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 661 | { return _M_call(__object, &__object, __args...); } | 
 
 
 
 
 | 662 |  | 
 
 
 
 
 | 663 | private: | 
 
 
 
 
 | 664 | _Functor __pmf; | 
 
 
 
 
 | 665 | }; | 
 
 
 
 
 | 666 |  | 
 
 
 
 
 | 667 | /// Implementation of @c mem_fn for volatile member function pointers. | 
 
 
 
 
 | 668 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 669 | class _Mem_fn<_Res (_Class::*)(_ArgTypes...) volatile> | 
 
 
 
 
 | 670 | : public _Maybe_unary_or_binary_function<_Res, volatile _Class*, | 
 
 
 
 
 | 671 | _ArgTypes...> | 
 
 
 
 
 | 672 | { | 
 
 
 
 
 | 673 | typedef _Res (_Class::*_Functor)(_ArgTypes...) volatile; | 
 
 
 
 
 | 674 |  | 
 
 
 
 
 | 675 | template<typename _Tp> | 
 
 
 
 
 | 676 | _Res | 
 
 
 
 
 | 677 | _M_call(_Tp& __object, const volatile _Class *, | 
 
 
 
 
 | 678 | _ArgTypes... __args) const | 
 
 
 
 
 | 679 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 680 |  | 
 
 
 
 
 | 681 | template<typename _Tp> | 
 
 
 
 
 | 682 | _Res | 
 
 
 
 
 | 683 | _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const | 
 
 
 
 
 | 684 | { return ((*__ptr).*__pmf)(__args...); } | 
 
 
 
 
 | 685 |  | 
 
 
 
 
 | 686 | public: | 
 
 
 
 
 | 687 | typedef _Res result_type; | 
 
 
 
 
 | 688 |  | 
 
 
 
 
 | 689 | explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } | 
 
 
 
 
 | 690 |  | 
 
 
 
 
 | 691 | // Handle objects | 
 
 
 
 
 | 692 | _Res | 
 
 
 
 
 | 693 | operator()(volatile _Class& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 694 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 695 |  | 
 
 
 
 
 | 696 | // Handle pointers | 
 
 
 
 
 | 697 | _Res | 
 
 
 
 
 | 698 | operator()(volatile _Class* __object, _ArgTypes... __args) const | 
 
 
 
 
 | 699 | { return (__object->*__pmf)(__args...); } | 
 
 
 
 
 | 700 |  | 
 
 
 
 
 | 701 | // Handle smart pointers, references and pointers to derived | 
 
 
 
 
 | 702 | template<typename _Tp> | 
 
 
 
 
 | 703 | _Res | 
 
 
 
 
 | 704 | operator()(_Tp& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 705 | { return _M_call(__object, &__object, __args...); } | 
 
 
 
 
 | 706 |  | 
 
 
 
 
 | 707 | private: | 
 
 
 
 
 | 708 | _Functor __pmf; | 
 
 
 
 
 | 709 | }; | 
 
 
 
 
 | 710 |  | 
 
 
 
 
 | 711 | /// Implementation of @c mem_fn for const volatile member function pointers. | 
 
 
 
 
 | 712 | template<typename _Res, typename _Class, typename... _ArgTypes> | 
 
 
 
 
 | 713 | class _Mem_fn<_Res (_Class::*)(_ArgTypes...) const volatile> | 
 
 
 
 
 | 714 | : public _Maybe_unary_or_binary_function<_Res, const volatile _Class*, | 
 
 
 
 
 | 715 | _ArgTypes...> | 
 
 
 
 
 | 716 | { | 
 
 
 
 
 | 717 | typedef _Res (_Class::*_Functor)(_ArgTypes...) const volatile; | 
 
 
 
 
 | 718 |  | 
 
 
 
 
 | 719 | template<typename _Tp> | 
 
 
 
 
 | 720 | _Res | 
 
 
 
 
 | 721 | _M_call(_Tp& __object, const volatile _Class *, | 
 
 
 
 
 | 722 | _ArgTypes... __args) const | 
 
 
 
 
 | 723 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 724 |  | 
 
 
 
 
 | 725 | template<typename _Tp> | 
 
 
 
 
 | 726 | _Res | 
 
 
 
 
 | 727 | _M_call(_Tp& __ptr, const volatile void *, _ArgTypes... __args) const | 
 
 
 
 
 | 728 | { return ((*__ptr).*__pmf)(__args...); } | 
 
 
 
 
 | 729 |  | 
 
 
 
 
 | 730 | public: | 
 
 
 
 
 | 731 | typedef _Res result_type; | 
 
 
 
 
 | 732 |  | 
 
 
 
 
 | 733 | explicit _Mem_fn(_Functor __pmf) : __pmf(__pmf) { } | 
 
 
 
 
 | 734 |  | 
 
 
 
 
 | 735 | // Handle objects | 
 
 
 
 
 | 736 | _Res | 
 
 
 
 
 | 737 | operator()(const volatile _Class& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 738 | { return (__object.*__pmf)(__args...); } | 
 
 
 
 
 | 739 |  | 
 
 
 
 
 | 740 | // Handle pointers | 
 
 
 
 
 | 741 | _Res | 
 
 
 
 
 | 742 | operator()(const volatile _Class* __object, _ArgTypes... __args) const | 
 
 
 
 
 | 743 | { return (__object->*__pmf)(__args...); } | 
 
 
 
 
 | 744 |  | 
 
 
 
 
 | 745 | // Handle smart pointers, references and pointers to derived | 
 
 
 
 
 | 746 | template<typename _Tp> | 
 
 
 
 
 | 747 | _Res operator()(_Tp& __object, _ArgTypes... __args) const | 
 
 
 
 
 | 748 | { return _M_call(__object, &__object, __args...); } | 
 
 
 
 
 | 749 |  | 
 
 
 
 
 | 750 | private: | 
 
 
 
 
 | 751 | _Functor __pmf; | 
 
 
 
 
 | 752 | }; | 
 
 
 
 
 | 753 |  | 
 
 
 
 
 | 754 |  | 
 
 
 
 
 | 755 | template<typename _Res, typename _Class> | 
 
 
 
 
 | 756 | class _Mem_fn<_Res _Class::*> | 
 
 
 
 
 | 757 | { | 
 
 
 
 
 | 758 | // This bit of genius is due to Peter Dimov, improved slightly by | 
 
 
 
 
 | 759 | // Douglas Gregor. | 
 
 
 
 
 | 760 | template<typename _Tp> | 
 
 
 
 
 | 761 | _Res& | 
 
 
 
 
 | 762 | _M_call(_Tp& __object, _Class *) const | 
 
 
 
 
 | 763 | { return __object.*__pm; } | 
 
 
 
 
 | 764 |  | 
 
 
 
 
 | 765 | template<typename _Tp, typename _Up> | 
 
 
 
 
 | 766 | _Res& | 
 
 
 
 
 | 767 | _M_call(_Tp& __object, _Up * const *) const | 
 
 
 
 
 | 768 | { return (*__object).*__pm; } | 
 
 
 
 
 | 769 |  | 
 
 
 
 
 | 770 | template<typename _Tp, typename _Up> | 
 
 
 
 
 | 771 | const _Res& | 
 
 
 
 
 | 772 | _M_call(_Tp& __object, const _Up * const *) const | 
 
 
 
 
 | 773 | { return (*__object).*__pm; } | 
 
 
 
 
 | 774 |  | 
 
 
 
 
 | 775 | template<typename _Tp> | 
 
 
 
 
 | 776 | const _Res& | 
 
 
 
 
 | 777 | _M_call(_Tp& __object, const _Class *) const | 
 
 
 
 
 | 778 | { return __object.*__pm; } | 
 
 
 
 
 | 779 |  | 
 
 
 
 
 | 780 | template<typename _Tp> | 
 
 
 
 
 | 781 | const _Res& | 
 
 
 
 
 | 782 | _M_call(_Tp& __ptr, const volatile void*) const | 
 
 
 
 
 | 783 | { return (*__ptr).*__pm; } | 
 
 
 
 
 | 784 |  | 
 
 
 
 
 | 785 | template<typename _Tp> static _Tp& __get_ref(); | 
 
 
 
 
 | 786 |  | 
 
 
 
 
 | 787 | template<typename _Tp> | 
 
 
 
 
 | 788 | static __sfinae_types::__one __check_const(_Tp&, _Class*); | 
 
 
 
 
 | 789 | template<typename _Tp, typename _Up> | 
 
 
 
 
 | 790 | static __sfinae_types::__one __check_const(_Tp&, _Up * const *); | 
 
 
 
 
 | 791 | template<typename _Tp, typename _Up> | 
 
 
 
 
 | 792 | static __sfinae_types::__two __check_const(_Tp&, const _Up * const *); | 
 
 
 
 
 | 793 | template<typename _Tp> | 
 
 
 
 
 | 794 | static __sfinae_types::__two __check_const(_Tp&, const _Class*); | 
 
 
 
 
 | 795 | template<typename _Tp> | 
 
 
 
 
 | 796 | static __sfinae_types::__two __check_const(_Tp&, const volatile void*); | 
 
 
 
 
 | 797 |  | 
 
 
 
 
 | 798 | public: | 
 
 
 
 
 | 799 | template<typename _Tp> | 
 
 
 
 
 | 800 | struct _Result_type | 
 
 
 
 
 | 801 | : _Mem_fn_const_or_non<_Res, | 
 
 
 
 
 | 802 | (sizeof(__sfinae_types::__two) | 
 
 
 
 
 | 803 | == sizeof(__check_const<_Tp>(__get_ref<_Tp>(), (_Tp*)0)))> | 
 
 
 
 
 | 804 | { }; | 
 
 
 
 
 | 805 |  | 
 
 
 
 
 | 806 | template<typename _Signature> | 
 
 
 
 
 | 807 | struct result; | 
 
 
 
 
 | 808 |  | 
 
 
 
 
 | 809 | template<typename _CVMem, typename _Tp> | 
 
 
 
 
 | 810 | struct result<_CVMem(_Tp)> | 
 
 
 
 
 | 811 | : public _Result_type<_Tp> { }; | 
 
 
 
 
 | 812 |  | 
 
 
 
 
 | 813 | template<typename _CVMem, typename _Tp> | 
 
 
 
 
 | 814 | struct result<_CVMem(_Tp&)> | 
 
 
 
 
 | 815 | : public _Result_type<_Tp> { }; | 
 
 
 
 
 | 816 |  | 
 
 
 
 
 | 817 | explicit | 
 
 
 
 
 | 818 | _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { } | 
 
 
 
 
 | 819 |  | 
 
 
 
 
 | 820 | // Handle objects | 
 
 
 
 
 | 821 | _Res& | 
 
 
 
 
 | 822 | operator()(_Class& __object) const | 
 
 
 
 
 | 823 | { return __object.*__pm; } | 
 
 
 
 
 | 824 |  | 
 
 
 
 
 | 825 | const _Res& | 
 
 
 
 
 | 826 | operator()(const _Class& __object) const | 
 
 
 
 
 | 827 | { return __object.*__pm; } | 
 
 
 
 
 | 828 |  | 
 
 
 
 
 | 829 | // Handle pointers | 
 
 
 
 
 | 830 | _Res& | 
 
 
 
 
 | 831 | operator()(_Class* __object) const | 
 
 
 
 
 | 832 | { return __object->*__pm; } | 
 
 
 
 
 | 833 |  | 
 
 
 
 
 | 834 | const _Res& | 
 
 
 
 
 | 835 | operator()(const _Class* __object) const | 
 
 
 
 
 | 836 | { return __object->*__pm; } | 
 
 
 
 
 | 837 |  | 
 
 
 
 
 | 838 | // Handle smart pointers and derived | 
 
 
 
 
 | 839 | template<typename _Tp> | 
 
 
 
 
 | 840 | typename _Result_type<_Tp>::type | 
 
 
 
 
 | 841 | operator()(_Tp& __unknown) const | 
 
 
 
 
 | 842 | { return _M_call(__unknown, &__unknown); } | 
 
 
 
 
 | 843 |  | 
 
 
 
 
 | 844 | private: | 
 
 
 
 
 | 845 | _Res _Class::*__pm; | 
 
 
 
 
 | 846 | }; | 
 
 
 
 
 | 847 |  | 
 
 
 
 
 | 848 | /** | 
 
 
 
 
 | 849 | *  @brief Returns a function object that forwards to the member | 
 
 
 
 
 | 850 | *  pointer @a pm. | 
 
 
 
 
 | 851 | */ | 
 
 
 
 
 | 852 | template<typename _Tp, typename _Class> | 
 
 
 
 
 | 853 | inline _Mem_fn<_Tp _Class::*> | 
 
 
 
 
 | 854 | mem_fn(_Tp _Class::* __pm) | 
 
 
 
 
 | 855 | { | 
 
 
 
 
 | 856 | return _Mem_fn<_Tp _Class::*>(__pm); | 
 
 
 
 
 | 857 | } | 
 
 
 
 
 | 858 |  | 
 
 
 
 
 | 859 | /** | 
 
 
 
 
 | 860 | *  @brief Determines if the given type _Tp is a function object | 
 
 
 
 
 | 861 | *  should be treated as a subexpression when evaluating calls to | 
 
 
 
 
 | 862 | *  function objects returned by bind(). [TR1 3.6.1] | 
 
 
 
 
 | 863 | */ | 
 
 
 
 
 | 864 | template<typename _Tp> | 
 
 
 
 
 | 865 | struct is_bind_expression | 
 
 
 
 
 | 866 | { static const bool value = false; }; | 
 
 
 
 
 | 867 |  | 
 
 
 
 
 | 868 | template<typename _Tp> | 
 
 
 
 
 | 869 | const bool is_bind_expression<_Tp>::value; | 
 
 
 
 
 | 870 |  | 
 
 
 
 
 | 871 | /** | 
 
 
 
 
 | 872 | *  @brief Determines if the given type _Tp is a placeholder in a | 
 
 
 
 
 | 873 | *  bind() expression and, if so, which placeholder it is. [TR1 3.6.2] | 
 
 
 
 
 | 874 | */ | 
 
 
 
 
 | 875 | template<typename _Tp> | 
 
 
 
 
 | 876 | struct is_placeholder | 
 
 
 
 
 | 877 | { static const int value = 0; }; | 
 
 
 
 
 | 878 |  | 
 
 
 
 
 | 879 | template<typename _Tp> | 
 
 
 
 
 | 880 | const int is_placeholder<_Tp>::value; | 
 
 
 
 
 | 881 |  | 
 
 
 
 
 | 882 | /// The type of placeholder objects defined by libstdc++. | 
 
 
 
 
 | 883 | using ::std::_Placeholder; | 
 
 
 
 
 | 884 |  | 
 
 
 
 
 | 885 | /** @namespace std::tr1::placeholders | 
 
 
 
 
 | 886 | *  @brief Sub-namespace for tr1/functional. | 
 
 
 
 
 | 887 | */ | 
 
 
 
 
 | 888 | namespace placeholders | 
 
 
 
 
 | 889 | { | 
 
 
 
 
 | 890 | // The C++11 std::placeholders are already exported from the library. | 
 
 
 
 
 | 891 | // Reusing them here avoids needing to export additional symbols for | 
 
 
 
 
 | 892 | // the TR1 placeholders, and avoids ODR violations due to defining | 
 
 
 
 
 | 893 | // them with internal linkage (as we used to do). | 
 
 
 
 
 | 894 | using namespace ::std::placeholders; | 
 
 
 
 
 | 895 | } | 
 
 
 
 
 | 896 |  | 
 
 
 
 
 | 897 | /** | 
 
 
 
 
 | 898 | *  Partial specialization of is_placeholder that provides the placeholder | 
 
 
 
 
 | 899 | *  number for the placeholder objects defined by libstdc++. | 
 
 
 
 
 | 900 | */ | 
 
 
 
 
 | 901 | template<int _Num> | 
 
 
 
 
 | 902 | struct is_placeholder<_Placeholder<_Num> > | 
 
 
 
 
 | 903 | : integral_constant<int, _Num> | 
 
 
 
 
 | 904 | { }; | 
 
 
 
 
 | 905 |  | 
 
 
 
 
 | 906 | template<int _Num> | 
 
 
 
 
 | 907 | struct is_placeholder<const _Placeholder<_Num> > | 
 
 
 
 
 | 908 | : integral_constant<int, _Num> | 
 
 
 
 
 | 909 | { }; | 
 
 
 
 
 | 910 |  | 
 
 
 
 
 | 911 | /** | 
 
 
 
 
 | 912 | * Stores a tuple of indices. Used by bind() to extract the elements | 
 
 
 
 
 | 913 | * in a tuple. | 
 
 
 
 
 | 914 | */ | 
 
 
 
 
 | 915 | template<int... _Indexes> | 
 
 
 
 
 | 916 | struct _Index_tuple { }; | 
 
 
 
 
 | 917 |  | 
 
 
 
 
 | 918 | /// Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. | 
 
 
 
 
 | 919 | template<std::size_t _Num, typename _Tuple = _Index_tuple<> > | 
 
 
 
 
 | 920 | struct _Build_index_tuple; | 
 
 
 
 
 | 921 |  | 
 
 
 
 
 | 922 | template<std::size_t _Num, int... _Indexes> | 
 
 
 
 
 | 923 | struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> > | 
 
 
 
 
 | 924 | : _Build_index_tuple<_Num - 1, | 
 
 
 
 
 | 925 | _Index_tuple<_Indexes..., sizeof...(_Indexes)> > | 
 
 
 
 
 | 926 | { | 
 
 
 
 
 | 927 | }; | 
 
 
 
 
 | 928 |  | 
 
 
 
 
 | 929 | template<int... _Indexes> | 
 
 
 
 
 | 930 | struct _Build_index_tuple<0, _Index_tuple<_Indexes...> > | 
 
 
 
 
 | 931 | { | 
 
 
 
 
 | 932 | typedef _Index_tuple<_Indexes...> __type; | 
 
 
 
 
 | 933 | }; | 
 
 
 
 
 | 934 |  | 
 
 
 
 
 | 935 | /** | 
 
 
 
 
 | 936 | * Used by _Safe_tuple_element to indicate that there is no tuple | 
 
 
 
 
 | 937 | * element at this position. | 
 
 
 
 
 | 938 | */ | 
 
 
 
 
 | 939 | struct _No_tuple_element; | 
 
 
 
 
 | 940 |  | 
 
 
 
 
 | 941 | /** | 
 
 
 
 
 | 942 | * Implementation helper for _Safe_tuple_element. This primary | 
 
 
 
 
 | 943 | * template handles the case where it is safe to use @c | 
 
 
 
 
 | 944 | * tuple_element. | 
 
 
 
 
 | 945 | */ | 
 
 
 
 
 | 946 | template<int __i, typename _Tuple, bool _IsSafe> | 
 
 
 
 
 | 947 | struct _Safe_tuple_element_impl | 
 
 
 
 
 | 948 | : tuple_element<__i, _Tuple> { }; | 
 
 
 
 
 | 949 |  | 
 
 
 
 
 | 950 | /** | 
 
 
 
 
 | 951 | * Implementation helper for _Safe_tuple_element. This partial | 
 
 
 
 
 | 952 | * specialization handles the case where it is not safe to use @c | 
 
 
 
 
 | 953 | * tuple_element. We just return @c _No_tuple_element. | 
 
 
 
 
 | 954 | */ | 
 
 
 
 
 | 955 | template<int __i, typename _Tuple> | 
 
 
 
 
 | 956 | struct _Safe_tuple_element_impl<__i, _Tuple, false> | 
 
 
 
 
 | 957 | { | 
 
 
 
 
 | 958 | typedef _No_tuple_element type; | 
 
 
 
 
 | 959 | }; | 
 
 
 
 
 | 960 |  | 
 
 
 
 
 | 961 | /** | 
 
 
 
 
 | 962 | * Like tuple_element, but returns @c _No_tuple_element when | 
 
 
 
 
 | 963 | * tuple_element would return an error. | 
 
 
 
 
 | 964 | */ | 
 
 
 
 
 | 965 | template<int __i, typename _Tuple> | 
 
 
 
 
 | 966 | struct _Safe_tuple_element | 
 
 
 
 
 | 967 | : _Safe_tuple_element_impl<__i, _Tuple, | 
 
 
 
 
 | 968 | (__i >= 0 && __i < tuple_size<_Tuple>::value)> | 
 
 
 
 
 | 969 | { | 
 
 
 
 
 | 970 | }; | 
 
 
 
 
 | 971 |  | 
 
 
 
 
 | 972 | /** | 
 
 
 
 
 | 973 | *  Maps an argument to bind() into an actual argument to the bound | 
 
 
 
 
 | 974 | *  function object [TR1 3.6.3/5]. Only the first parameter should | 
 
 
 
 
 | 975 | *  be specified: the rest are used to determine among the various | 
 
 
 
 
 | 976 | *  implementations. Note that, although this class is a function | 
 
 
 
 
 | 977 | *  object, it isn't entirely normal because it takes only two | 
 
 
 
 
 | 978 | *  parameters regardless of the number of parameters passed to the | 
 
 
 
 
 | 979 | *  bind expression. The first parameter is the bound argument and | 
 
 
 
 
 | 980 | *  the second parameter is a tuple containing references to the | 
 
 
 
 
 | 981 | *  rest of the arguments. | 
 
 
 
 
 | 982 | */ | 
 
 
 
 
 | 983 | template<typename _Arg, | 
 
 
 
 
 | 984 | bool _IsBindExp = is_bind_expression<_Arg>::value, | 
 
 
 
 
 | 985 | bool _IsPlaceholder = (is_placeholder<_Arg>::value > 0)> | 
 
 
 
 
 | 986 | class _Mu; | 
 
 
 
 
 | 987 |  | 
 
 
 
 
 | 988 | /** | 
 
 
 
 
 | 989 | *  If the argument is reference_wrapper<_Tp>, returns the | 
 
 
 
 
 | 990 | *  underlying reference. [TR1 3.6.3/5 bullet 1] | 
 
 
 
 
 | 991 | */ | 
 
 
 
 
 | 992 | template<typename _Tp> | 
 
 
 
 
 | 993 | class _Mu<reference_wrapper<_Tp>, false, false> | 
 
 
 
 
 | 994 | { | 
 
 
 
 
 | 995 | public: | 
 
 
 
 
 | 996 | typedef _Tp& result_type; | 
 
 
 
 
 | 997 |  | 
 
 
 
 
 | 998 | /* Note: This won't actually work for const volatile | 
 
 
 
 
 | 999 | * reference_wrappers, because reference_wrapper::get() is const | 
 
 
 
 
 | 1000 | * but not volatile-qualified. This might be a defect in the TR. | 
 
 
 
 
 | 1001 | */ | 
 
 
 
 
 | 1002 | template<typename _CVRef, typename _Tuple> | 
 
 
 
 
 | 1003 | result_type | 
 
 
 
 
 | 1004 | operator()(_CVRef& __arg, const _Tuple&) const volatile | 
 
 
 
 
 | 1005 | { return __arg.get(); } | 
 
 
 
 
 | 1006 | }; | 
 
 
 
 
 | 1007 |  | 
 
 
 
 
 | 1008 | /** | 
 
 
 
 
 | 1009 | *  If the argument is a bind expression, we invoke the underlying | 
 
 
 
 
 | 1010 | *  function object with the same cv-qualifiers as we are given and | 
 
 
 
 
 | 1011 | *  pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2] | 
 
 
 
 
 | 1012 | */ | 
 
 
 
 
 | 1013 | template<typename _Arg> | 
 
 
 
 
 | 1014 | class _Mu<_Arg, true, false> | 
 
 
 
 
 | 1015 | { | 
 
 
 
 
 | 1016 | public: | 
 
 
 
 
 | 1017 | template<typename _Signature> class result; | 
 
 
 
 
 | 1018 |  | 
 
 
 
 
 | 1019 | // Determine the result type when we pass the arguments along. This | 
 
 
 
 
 | 1020 | // involves passing along the cv-qualifiers placed on _Mu and | 
 
 
 
 
 | 1021 | // unwrapping the argument bundle. | 
 
 
 
 
 | 1022 | template<typename _CVMu, typename _CVArg, typename... _Args> | 
 
 
 
 
 | 1023 | class result<_CVMu(_CVArg, tuple<_Args...>)> | 
 
 
 
 
 | 1024 | : public result_of<_CVArg(_Args...)> { }; | 
 
 
 
 
 | 1025 |  | 
 
 
 
 
 | 1026 | template<typename _CVArg, typename... _Args> | 
 
 
 
 
 | 1027 | typename result_of<_CVArg(_Args...)>::type | 
 
 
 
 
 | 1028 | operator()(_CVArg& __arg, | 
 
 
 
 
 | 1029 | const tuple<_Args...>& __tuple) const volatile | 
 
 
 
 
 | 1030 | { | 
 
 
 
 
 | 1031 | // Construct an index tuple and forward to __call | 
 
 
 
 
 | 1032 | typedef typename _Build_index_tuple<sizeof...(_Args)>::__type | 
 
 
 
 
 | 1033 | _Indexes; | 
 
 
 
 
 | 1034 | return this->__call(__arg, __tuple, _Indexes()); | 
 
 
 
 
 | 1035 | } | 
 
 
 
 
 | 1036 |  | 
 
 
 
 
 | 1037 | private: | 
 
 
 
 
 | 1038 | // Invokes the underlying function object __arg by unpacking all | 
 
 
 
 
 | 1039 | // of the arguments in the tuple. | 
 
 
 
 
 | 1040 | template<typename _CVArg, typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1041 | typename result_of<_CVArg(_Args...)>::type | 
 
 
 
 
 | 1042 | __call(_CVArg& __arg, const tuple<_Args...>& __tuple, | 
 
 
 
 
 | 1043 | const _Index_tuple<_Indexes...>&) const volatile | 
 
 
 
 
 | 1044 | { | 
 
 
 
 
 | 1045 | return __arg(tr1::get<_Indexes>(__tuple)...); | 
 
 
 
 
 | 1046 | } | 
 
 
 
 
 | 1047 | }; | 
 
 
 
 
 | 1048 |  | 
 
 
 
 
 | 1049 | /** | 
 
 
 
 
 | 1050 | *  If the argument is a placeholder for the Nth argument, returns | 
 
 
 
 
 | 1051 | *  a reference to the Nth argument to the bind function object. | 
 
 
 
 
 | 1052 | *  [TR1 3.6.3/5 bullet 3] | 
 
 
 
 
 | 1053 | */ | 
 
 
 
 
 | 1054 | template<typename _Arg> | 
 
 
 
 
 | 1055 | class _Mu<_Arg, false, true> | 
 
 
 
 
 | 1056 | { | 
 
 
 
 
 | 1057 | public: | 
 
 
 
 
 | 1058 | template<typename _Signature> class result; | 
 
 
 
 
 | 1059 |  | 
 
 
 
 
 | 1060 | template<typename _CVMu, typename _CVArg, typename _Tuple> | 
 
 
 
 
 | 1061 | class result<_CVMu(_CVArg, _Tuple)> | 
 
 
 
 
 | 1062 | { | 
 
 
 
 
 | 1063 | // Add a reference, if it hasn't already been done for us. | 
 
 
 
 
 | 1064 | // This allows us to be a little bit sloppy in constructing | 
 
 
 
 
 | 1065 | // the tuple that we pass to result_of<...>. | 
 
 
 
 
 | 1066 | typedef typename _Safe_tuple_element<(is_placeholder<_Arg>::value | 
 
 
 
 
 | 1067 | - 1), _Tuple>::type | 
 
 
 
 
 | 1068 | __base_type; | 
 
 
 
 
 | 1069 |  | 
 
 
 
 
 | 1070 | public: | 
 
 
 
 
 | 1071 | typedef typename add_reference<__base_type>::type type; | 
 
 
 
 
 | 1072 | }; | 
 
 
 
 
 | 1073 |  | 
 
 
 
 
 | 1074 | template<typename _Tuple> | 
 
 
 
 
 | 1075 | typename result<_Mu(_Arg, _Tuple)>::type | 
 
 
 
 
 | 1076 | operator()(const volatile _Arg&, const _Tuple& __tuple) const volatile | 
 
 
 
 
 | 1077 | { | 
 
 
 
 
 | 1078 | return ::std::tr1::get<(is_placeholder<_Arg>::value - 1)>(__tuple); | 
 
 
 
 
 | 1079 | } | 
 
 
 
 
 | 1080 | }; | 
 
 
 
 
 | 1081 |  | 
 
 
 
 
 | 1082 | /** | 
 
 
 
 
 | 1083 | *  If the argument is just a value, returns a reference to that | 
 
 
 
 
 | 1084 | *  value. The cv-qualifiers on the reference are the same as the | 
 
 
 
 
 | 1085 | *  cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4] | 
 
 
 
 
 | 1086 | */ | 
 
 
 
 
 | 1087 | template<typename _Arg> | 
 
 
 
 
 | 1088 | class _Mu<_Arg, false, false> | 
 
 
 
 
 | 1089 | { | 
 
 
 
 
 | 1090 | public: | 
 
 
 
 
 | 1091 | template<typename _Signature> struct result; | 
 
 
 
 
 | 1092 |  | 
 
 
 
 
 | 1093 | template<typename _CVMu, typename _CVArg, typename _Tuple> | 
 
 
 
 
 | 1094 | struct result<_CVMu(_CVArg, _Tuple)> | 
 
 
 
 
 | 1095 | { | 
 
 
 
 
 | 1096 | typedef typename add_reference<_CVArg>::type type; | 
 
 
 
 
 | 1097 | }; | 
 
 
 
 
 | 1098 |  | 
 
 
 
 
 | 1099 | // Pick up the cv-qualifiers of the argument | 
 
 
 
 
 | 1100 | template<typename _CVArg, typename _Tuple> | 
 
 
 
 
 | 1101 | _CVArg& | 
 
 
 
 
 | 1102 | operator()(_CVArg& __arg, const _Tuple&) const volatile | 
 
 
 
 
 | 1103 | { return __arg; } | 
 
 
 
 
 | 1104 | }; | 
 
 
 
 
 | 1105 |  | 
 
 
 
 
 | 1106 | /** | 
 
 
 
 
 | 1107 | *  Maps member pointers into instances of _Mem_fn but leaves all | 
 
 
 
 
 | 1108 | *  other function objects untouched. Used by tr1::bind(). The | 
 
 
 
 
 | 1109 | *  primary template handles the non--member-pointer case. | 
 
 
 
 
 | 1110 | */ | 
 
 
 
 
 | 1111 | template<typename _Tp> | 
 
 
 
 
 | 1112 | struct _Maybe_wrap_member_pointer | 
 
 
 
 
 | 1113 | { | 
 
 
 
 
 | 1114 | typedef _Tp type; | 
 
 
 
 
 | 1115 |  | 
 
 
 
 
 | 1116 | static const _Tp& | 
 
 
 
 
 | 1117 | __do_wrap(const _Tp& __x) | 
 
 
 
 
 | 1118 | { return __x; } | 
 
 
 
 
 | 1119 | }; | 
 
 
 
 
 | 1120 |  | 
 
 
 
 
 | 1121 | /** | 
 
 
 
 
 | 1122 | *  Maps member pointers into instances of _Mem_fn but leaves all | 
 
 
 
 
 | 1123 | *  other function objects untouched. Used by tr1::bind(). This | 
 
 
 
 
 | 1124 | *  partial specialization handles the member pointer case. | 
 
 
 
 
 | 1125 | */ | 
 
 
 
 
 | 1126 | template<typename _Tp, typename _Class> | 
 
 
 
 
 | 1127 | struct _Maybe_wrap_member_pointer<_Tp _Class::*> | 
 
 
 
 
 | 1128 | { | 
 
 
 
 
 | 1129 | typedef _Mem_fn<_Tp _Class::*> type; | 
 
 
 
 
 | 1130 |  | 
 
 
 
 
 | 1131 | static type | 
 
 
 
 
 | 1132 | __do_wrap(_Tp _Class::* __pm) | 
 
 
 
 
 | 1133 | { return type(__pm); } | 
 
 
 
 
 | 1134 | }; | 
 
 
 
 
 | 1135 |  | 
 
 
 
 
 | 1136 | /// Type of the function object returned from bind(). | 
 
 
 
 
 | 1137 | template<typename _Signature> | 
 
 
 
 
 | 1138 | struct _Bind; | 
 
 
 
 
 | 1139 |  | 
 
 
 
 
 | 1140 | template<typename _Functor, typename... _Bound_args> | 
 
 
 
 
 | 1141 | class _Bind<_Functor(_Bound_args...)> | 
 
 
 
 
 | 1142 | : public _Weak_result_type<_Functor> | 
 
 
 
 
 | 1143 | { | 
 
 
 
 
 | 1144 | typedef _Bind __self_type; | 
 
 
 
 
 | 1145 | typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type | 
 
 
 
 
 | 1146 | _Bound_indexes; | 
 
 
 
 
 | 1147 |  | 
 
 
 
 
 | 1148 | _Functor _M_f; | 
 
 
 
 
 | 1149 | tuple<_Bound_args...> _M_bound_args; | 
 
 
 
 
 | 1150 |  | 
 
 
 
 
 | 1151 | // Call unqualified | 
 
 
 
 
 | 1152 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1153 | typename result_of< | 
 
 
 
 
 | 1154 | _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1155 | (_Bound_args, tuple<_Args...>)>::type...) | 
 
 
 
 
 | 1156 | >::type | 
 
 
 
 
 | 1157 | __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) | 
 
 
 
 
 | 1158 | { | 
 
 
 
 
 | 1159 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1160 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1161 | } | 
 
 
 
 
 | 1162 |  | 
 
 
 
 
 | 1163 | // Call as const | 
 
 
 
 
 | 1164 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1165 | typename result_of< | 
 
 
 
 
 | 1166 | const _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1167 | (const _Bound_args, tuple<_Args...>) | 
 
 
 
 
 | 1168 | >::type...)>::type | 
 
 
 
 
 | 1169 | __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const | 
 
 
 
 
 | 1170 | { | 
 
 
 
 
 | 1171 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1172 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1173 | } | 
 
 
 
 
 | 1174 |  | 
 
 
 
 
 | 1175 | // Call as volatile | 
 
 
 
 
 | 1176 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1177 | typename result_of< | 
 
 
 
 
 | 1178 | volatile _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1179 | (volatile _Bound_args, tuple<_Args...>) | 
 
 
 
 
 | 1180 | >::type...)>::type | 
 
 
 
 
 | 1181 | __call(const tuple<_Args...>& __args, | 
 
 
 
 
 | 1182 | _Index_tuple<_Indexes...>) volatile | 
 
 
 
 
 | 1183 | { | 
 
 
 
 
 | 1184 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1185 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1186 | } | 
 
 
 
 
 | 1187 |  | 
 
 
 
 
 | 1188 | // Call as const volatile | 
 
 
 
 
 | 1189 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1190 | typename result_of< | 
 
 
 
 
 | 1191 | const volatile _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1192 | (const volatile _Bound_args, | 
 
 
 
 
 | 1193 | tuple<_Args...>) | 
 
 
 
 
 | 1194 | >::type...)>::type | 
 
 
 
 
 | 1195 | __call(const tuple<_Args...>& __args, | 
 
 
 
 
 | 1196 | _Index_tuple<_Indexes...>) const volatile | 
 
 
 
 
 | 1197 | { | 
 
 
 
 
 | 1198 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1199 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1200 | } | 
 
 
 
 
 | 1201 |  | 
 
 
 
 
 | 1202 | public: | 
 
 
 
 
 | 1203 | explicit _Bind(_Functor __f, _Bound_args... __bound_args) | 
 
 
 
 
 | 1204 | : _M_f(__f), _M_bound_args(__bound_args...) { } | 
 
 
 
 
 | 1205 |  | 
 
 
 
 
 | 1206 | // Call unqualified | 
 
 
 
 
 | 1207 | template<typename... _Args> | 
 
 
 
 
 | 1208 | typename result_of< | 
 
 
 
 
 | 1209 | _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1210 | (_Bound_args, tuple<_Args...>)>::type...) | 
 
 
 
 
 | 1211 | >::type | 
 
 
 
 
 | 1212 | operator()(_Args&... __args) | 
 
 
 
 
 | 1213 | { | 
 
 
 
 
 | 1214 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1215 | } | 
 
 
 
 
 | 1216 |  | 
 
 
 
 
 | 1217 | // Call as const | 
 
 
 
 
 | 1218 | template<typename... _Args> | 
 
 
 
 
 | 1219 | typename result_of< | 
 
 
 
 
 | 1220 | const _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1221 | (const _Bound_args, tuple<_Args...>)>::type...) | 
 
 
 
 
 | 1222 | >::type | 
 
 
 
 
 | 1223 | operator()(_Args&... __args) const | 
 
 
 
 
 | 1224 | { | 
 
 
 
 
 | 1225 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1226 | } | 
 
 
 
 
 | 1227 |  | 
 
 
 
 
 | 1228 |  | 
 
 
 
 
 | 1229 | // Call as volatile | 
 
 
 
 
 | 1230 | template<typename... _Args> | 
 
 
 
 
 | 1231 | typename result_of< | 
 
 
 
 
 | 1232 | volatile _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1233 | (volatile _Bound_args, tuple<_Args...>)>::type...) | 
 
 
 
 
 | 1234 | >::type | 
 
 
 
 
 | 1235 | operator()(_Args&... __args) volatile | 
 
 
 
 
 | 1236 | { | 
 
 
 
 
 | 1237 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1238 | } | 
 
 
 
 
 | 1239 |  | 
 
 
 
 
 | 1240 |  | 
 
 
 
 
 | 1241 | // Call as const volatile | 
 
 
 
 
 | 1242 | template<typename... _Args> | 
 
 
 
 
 | 1243 | typename result_of< | 
 
 
 
 
 | 1244 | const volatile _Functor(typename result_of<_Mu<_Bound_args> | 
 
 
 
 
 | 1245 | (const volatile _Bound_args, | 
 
 
 
 
 | 1246 | tuple<_Args...>)>::type...) | 
 
 
 
 
 | 1247 | >::type | 
 
 
 
 
 | 1248 | operator()(_Args&... __args) const volatile | 
 
 
 
 
 | 1249 | { | 
 
 
 
 
 | 1250 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1251 | } | 
 
 
 
 
 | 1252 | }; | 
 
 
 
 
 | 1253 |  | 
 
 
 
 
 | 1254 | /// Type of the function object returned from bind<R>(). | 
 
 
 
 
 | 1255 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1256 | struct _Bind_result; | 
 
 
 
 
 | 1257 |  | 
 
 
 
 
 | 1258 | template<typename _Result, typename _Functor, typename... _Bound_args> | 
 
 
 
 
 | 1259 | class _Bind_result<_Result, _Functor(_Bound_args...)> | 
 
 
 
 
 | 1260 | { | 
 
 
 
 
 | 1261 | typedef _Bind_result __self_type; | 
 
 
 
 
 | 1262 | typedef typename _Build_index_tuple<sizeof...(_Bound_args)>::__type | 
 
 
 
 
 | 1263 | _Bound_indexes; | 
 
 
 
 
 | 1264 |  | 
 
 
 
 
 | 1265 | _Functor _M_f; | 
 
 
 
 
 | 1266 | tuple<_Bound_args...> _M_bound_args; | 
 
 
 
 
 | 1267 |  | 
 
 
 
 
 | 1268 | // Call unqualified | 
 
 
 
 
 | 1269 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1270 | _Result | 
 
 
 
 
 | 1271 | __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) | 
 
 
 
 
 | 1272 | { | 
 
 
 
 
 | 1273 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1274 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1275 | } | 
 
 
 
 
 | 1276 |  | 
 
 
 
 
 | 1277 | // Call as const | 
 
 
 
 
 | 1278 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1279 | _Result | 
 
 
 
 
 | 1280 | __call(const tuple<_Args...>& __args, _Index_tuple<_Indexes...>) const | 
 
 
 
 
 | 1281 | { | 
 
 
 
 
 | 1282 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1283 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1284 | } | 
 
 
 
 
 | 1285 |  | 
 
 
 
 
 | 1286 | // Call as volatile | 
 
 
 
 
 | 1287 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1288 | _Result | 
 
 
 
 
 | 1289 | __call(const tuple<_Args...>& __args, | 
 
 
 
 
 | 1290 | _Index_tuple<_Indexes...>) volatile | 
 
 
 
 
 | 1291 | { | 
 
 
 
 
 | 1292 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1293 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1294 | } | 
 
 
 
 
 | 1295 |  | 
 
 
 
 
 | 1296 | // Call as const volatile | 
 
 
 
 
 | 1297 | template<typename... _Args, int... _Indexes> | 
 
 
 
 
 | 1298 | _Result | 
 
 
 
 
 | 1299 | __call(const tuple<_Args...>& __args, | 
 
 
 
 
 | 1300 | _Index_tuple<_Indexes...>) const volatile | 
 
 
 
 
 | 1301 | { | 
 
 
 
 
 | 1302 | return _M_f(_Mu<_Bound_args>() | 
 
 
 
 
 | 1303 | (tr1::get<_Indexes>(_M_bound_args), __args)...); | 
 
 
 
 
 | 1304 | } | 
 
 
 
 
 | 1305 |  | 
 
 
 
 
 | 1306 | public: | 
 
 
 
 
 | 1307 | typedef _Result result_type; | 
 
 
 
 
 | 1308 |  | 
 
 
 
 
 | 1309 | explicit | 
 
 
 
 
 | 1310 | _Bind_result(_Functor __f, _Bound_args... __bound_args) | 
 
 
 
 
 | 1311 | : _M_f(__f), _M_bound_args(__bound_args...) { } | 
 
 
 
 
 | 1312 |  | 
 
 
 
 
 | 1313 | // Call unqualified | 
 
 
 
 
 | 1314 | template<typename... _Args> | 
 
 
 
 
 | 1315 | result_type | 
 
 
 
 
 | 1316 | operator()(_Args&... __args) | 
 
 
 
 
 | 1317 | { | 
 
 
 
 
 | 1318 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1319 | } | 
 
 
 
 
 | 1320 |  | 
 
 
 
 
 | 1321 | // Call as const | 
 
 
 
 
 | 1322 | template<typename... _Args> | 
 
 
 
 
 | 1323 | result_type | 
 
 
 
 
 | 1324 | operator()(_Args&... __args) const | 
 
 
 
 
 | 1325 | { | 
 
 
 
 
 | 1326 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1327 | } | 
 
 
 
 
 | 1328 |  | 
 
 
 
 
 | 1329 | // Call as volatile | 
 
 
 
 
 | 1330 | template<typename... _Args> | 
 
 
 
 
 | 1331 | result_type | 
 
 
 
 
 | 1332 | operator()(_Args&... __args) volatile | 
 
 
 
 
 | 1333 | { | 
 
 
 
 
 | 1334 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1335 | } | 
 
 
 
 
 | 1336 |  | 
 
 
 
 
 | 1337 | // Call as const volatile | 
 
 
 
 
 | 1338 | template<typename... _Args> | 
 
 
 
 
 | 1339 | result_type | 
 
 
 
 
 | 1340 | operator()(_Args&... __args) const volatile | 
 
 
 
 
 | 1341 | { | 
 
 
 
 
 | 1342 | return this->__call(tr1::tie(__args...), _Bound_indexes()); | 
 
 
 
 
 | 1343 | } | 
 
 
 
 
 | 1344 | }; | 
 
 
 
 
 | 1345 |  | 
 
 
 
 
 | 1346 | /// Class template _Bind is always a bind expression. | 
 
 
 
 
 | 1347 | template<typename _Signature> | 
 
 
 
 
 | 1348 | struct is_bind_expression<_Bind<_Signature> > | 
 
 
 
 
 | 1349 | { static const bool value = true; }; | 
 
 
 
 
 | 1350 |  | 
 
 
 
 
 | 1351 | template<typename _Signature> | 
 
 
 
 
 | 1352 | const bool is_bind_expression<_Bind<_Signature> >::value; | 
 
 
 
 
 | 1353 |  | 
 
 
 
 
 | 1354 | /// Class template _Bind is always a bind expression. | 
 
 
 
 
 | 1355 | template<typename _Signature> | 
 
 
 
 
 | 1356 | struct is_bind_expression<const _Bind<_Signature> > | 
 
 
 
 
 | 1357 | { static const bool value = true; }; | 
 
 
 
 
 | 1358 |  | 
 
 
 
 
 | 1359 | template<typename _Signature> | 
 
 
 
 
 | 1360 | const bool is_bind_expression<const _Bind<_Signature> >::value; | 
 
 
 
 
 | 1361 |  | 
 
 
 
 
 | 1362 | /// Class template _Bind is always a bind expression. | 
 
 
 
 
 | 1363 | template<typename _Signature> | 
 
 
 
 
 | 1364 | struct is_bind_expression<volatile _Bind<_Signature> > | 
 
 
 
 
 | 1365 | { static const bool value = true; }; | 
 
 
 
 
 | 1366 |  | 
 
 
 
 
 | 1367 | template<typename _Signature> | 
 
 
 
 
 | 1368 | const bool is_bind_expression<volatile _Bind<_Signature> >::value; | 
 
 
 
 
 | 1369 |  | 
 
 
 
 
 | 1370 | /// Class template _Bind is always a bind expression. | 
 
 
 
 
 | 1371 | template<typename _Signature> | 
 
 
 
 
 | 1372 | struct is_bind_expression<const volatile _Bind<_Signature> > | 
 
 
 
 
 | 1373 | { static const bool value = true; }; | 
 
 
 
 
 | 1374 |  | 
 
 
 
 
 | 1375 | template<typename _Signature> | 
 
 
 
 
 | 1376 | const bool is_bind_expression<const volatile _Bind<_Signature> >::value; | 
 
 
 
 
 | 1377 |  | 
 
 
 
 
 | 1378 | /// Class template _Bind_result is always a bind expression. | 
 
 
 
 
 | 1379 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1380 | struct is_bind_expression<_Bind_result<_Result, _Signature> > | 
 
 
 
 
 | 1381 | { static const bool value = true; }; | 
 
 
 
 
 | 1382 |  | 
 
 
 
 
 | 1383 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1384 | const bool is_bind_expression<_Bind_result<_Result, _Signature> >::value; | 
 
 
 
 
 | 1385 |  | 
 
 
 
 
 | 1386 | /// Class template _Bind_result is always a bind expression. | 
 
 
 
 
 | 1387 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1388 | struct is_bind_expression<const _Bind_result<_Result, _Signature> > | 
 
 
 
 
 | 1389 | { static const bool value = true; }; | 
 
 
 
 
 | 1390 |  | 
 
 
 
 
 | 1391 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1392 | const bool | 
 
 
 
 
 | 1393 | is_bind_expression<const _Bind_result<_Result, _Signature> >::value; | 
 
 
 
 
 | 1394 |  | 
 
 
 
 
 | 1395 | /// Class template _Bind_result is always a bind expression. | 
 
 
 
 
 | 1396 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1397 | struct is_bind_expression<volatile _Bind_result<_Result, _Signature> > | 
 
 
 
 
 | 1398 | { static const bool value = true; }; | 
 
 
 
 
 | 1399 |  | 
 
 
 
 
 | 1400 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1401 | const bool | 
 
 
 
 
 | 1402 | is_bind_expression<volatile _Bind_result<_Result, _Signature> >::value; | 
 
 
 
 
 | 1403 |  | 
 
 
 
 
 | 1404 | /// Class template _Bind_result is always a bind expression. | 
 
 
 
 
 | 1405 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1406 | struct | 
 
 
 
 
 | 1407 | is_bind_expression<const volatile _Bind_result<_Result, _Signature> > | 
 
 
 
 
 | 1408 | { static const bool value = true; }; | 
 
 
 
 
 | 1409 |  | 
 
 
 
 
 | 1410 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1411 | const bool | 
 
 
 
 
 | 1412 | is_bind_expression<const volatile _Bind_result<_Result, | 
 
 
 
 
 | 1413 | _Signature> >::value; | 
 
 
 
 
 | 1414 |  | 
 
 
 
 
 | 1415 | #if __cplusplus >= 201103L | 
 
 
 
 
 | 1416 | // Specialize tr1::is_bind_expression for std::bind closure types, | 
 
 
 
 
 | 1417 | // so that they can also work with tr1::bind. | 
 
 
 
 
 | 1418 |  | 
 
 
 
 
 | 1419 | template<typename _Signature> | 
 
 
 
 
 | 1420 | struct is_bind_expression<std::_Bind<_Signature>> | 
 
 
 
 
 | 1421 | : true_type { }; | 
 
 
 
 
 | 1422 |  | 
 
 
 
 
 | 1423 | template<typename _Signature> | 
 
 
 
 
 | 1424 | struct is_bind_expression<const std::_Bind<_Signature>> | 
 
 
 
 
 | 1425 | : true_type { }; | 
 
 
 
 
 | 1426 |  | 
 
 
 
 
 | 1427 | template<typename _Signature> | 
 
 
 
 
 | 1428 | struct is_bind_expression<volatile std::_Bind<_Signature>> | 
 
 
 
 
 | 1429 | : true_type { }; | 
 
 
 
 
 | 1430 |  | 
 
 
 
 
 | 1431 | template<typename _Signature> | 
 
 
 
 
 | 1432 | struct is_bind_expression<const volatile std::_Bind<_Signature>> | 
 
 
 
 
 | 1433 | : true_type { }; | 
 
 
 
 
 | 1434 |  | 
 
 
 
 
 | 1435 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1436 | struct is_bind_expression<std::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 1437 | : true_type { }; | 
 
 
 
 
 | 1438 |  | 
 
 
 
 
 | 1439 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1440 | struct is_bind_expression<const std::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 1441 | : true_type { }; | 
 
 
 
 
 | 1442 |  | 
 
 
 
 
 | 1443 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1444 | struct is_bind_expression<volatile std::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 1445 | : true_type { }; | 
 
 
 
 
 | 1446 |  | 
 
 
 
 
 | 1447 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 1448 | struct is_bind_expression<const volatile std::_Bind_result<_Result, | 
 
 
 
 
 | 1449 | _Signature>> | 
 
 
 
 
 | 1450 | : true_type { }; | 
 
 
 
 
 | 1451 | #endif | 
 
 
 
 
 | 1452 |  | 
 
 
 
 
 | 1453 | /// bind | 
 
 
 
 
 | 1454 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1455 | inline | 
 
 
 
 
 | 1456 | _Bind<typename _Maybe_wrap_member_pointer<_Functor>::type(_ArgTypes...)> | 
 
 
 
 
 | 1457 | bind(_Functor __f, _ArgTypes... __args) | 
 
 
 
 
 | 1458 | { | 
 
 
 
 
 | 1459 | typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type; | 
 
 
 
 
 | 1460 | typedef typename __maybe_type::type __functor_type; | 
 
 
 
 
 | 1461 | typedef _Bind<__functor_type(_ArgTypes...)> __result_type; | 
 
 
 
 
 | 1462 | return __result_type(__maybe_type::__do_wrap(__f), __args...); | 
 
 
 
 
 | 1463 | } | 
 
 
 
 
 | 1464 |  | 
 
 
 
 
 | 1465 | template<typename _Result, typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1466 | inline | 
 
 
 
 
 | 1467 | _Bind_result<_Result, | 
 
 
 
 
 | 1468 | typename _Maybe_wrap_member_pointer<_Functor>::type | 
 
 
 
 
 | 1469 | (_ArgTypes...)> | 
 
 
 
 
 | 1470 | bind(_Functor __f, _ArgTypes... __args) | 
 
 
 
 
 | 1471 | { | 
 
 
 
 
 | 1472 | typedef _Maybe_wrap_member_pointer<_Functor> __maybe_type; | 
 
 
 
 
 | 1473 | typedef typename __maybe_type::type __functor_type; | 
 
 
 
 
 | 1474 | typedef _Bind_result<_Result, __functor_type(_ArgTypes...)> | 
 
 
 
 
 | 1475 | __result_type; | 
 
 
 
 
 | 1476 | return __result_type(__maybe_type::__do_wrap(__f), __args...); | 
 
 
 
 
 | 1477 | } | 
 
 
 
 
 | 1478 |  | 
 
 
 
 
 | 1479 | /** | 
 
 
 
 
 | 1480 | *  @brief Exception class thrown when class template function's | 
 
 
 
 
 | 1481 | *  operator() is called with an empty target. | 
 
 
 
 
 | 1482 | *  @ingroup exceptions | 
 
 
 
 
 | 1483 | */ | 
 
 
 
 
 | 1484 | class bad_function_call : public std::exception { }; | 
 
 
 
 
 | 1485 |  | 
 
 
 
 
 | 1486 | /** | 
 
 
 
 
 | 1487 | *  The integral constant expression 0 can be converted into a | 
 
 
 
 
 | 1488 | *  pointer to this type. It is used by the function template to | 
 
 
 
 
 | 1489 | *  accept NULL pointers. | 
 
 
 
 
 | 1490 | */ | 
 
 
 
 
 | 1491 | struct _M_clear_type; | 
 
 
 
 
 | 1492 |  | 
 
 
 
 
 | 1493 | /** | 
 
 
 
 
 | 1494 | *  Trait identifying @a location-invariant types, meaning that the | 
 
 
 
 
 | 1495 | *  address of the object (or any of its members) will not escape. | 
 
 
 
 
 | 1496 | *  Also implies a trivial copy constructor and assignment operator. | 
 
 
 
 
 | 1497 | */ | 
 
 
 
 
 | 1498 | template<typename _Tp> | 
 
 
 
 
 | 1499 | struct __is_location_invariant | 
 
 
 
 
 | 1500 | : integral_constant<bool, | 
 
 
 
 
 | 1501 | (is_pointer<_Tp>::value | 
 
 
 
 
 | 1502 | || is_member_pointer<_Tp>::value)> | 
 
 
 
 
 | 1503 | { | 
 
 
 
 
 | 1504 | }; | 
 
 
 
 
 | 1505 |  | 
 
 
 
 
 | 1506 | class _Undefined_class; | 
 
 
 
 
 | 1507 |  | 
 
 
 
 
 | 1508 | union _Nocopy_types | 
 
 
 
 
 | 1509 | { | 
 
 
 
 
 | 1510 | void*       _M_object; | 
 
 
 
 
 | 1511 | const void* _M_const_object; | 
 
 
 
 
 | 1512 | void (*_M_function_pointer)(); | 
 
 
 
 
 | 1513 | void (_Undefined_class::*_M_member_pointer)(); | 
 
 
 
 
 | 1514 | }; | 
 
 
 
 
 | 1515 |  | 
 
 
 
 
 | 1516 | union _Any_data | 
 
 
 
 
 | 1517 | { | 
 
 
 
 
 | 1518 | void*       _M_access()       { return &_M_pod_data[0]; } | 
 
 
 
 
 | 1519 | const void* _M_access() const { return &_M_pod_data[0]; } | 
 
 
 
 
 | 1520 |  | 
 
 
 
 
 | 1521 | template<typename _Tp> | 
 
 
 
 
 | 1522 | _Tp& | 
 
 
 
 
 | 1523 | _M_access() | 
 
 
 
 
 | 1524 | { return *static_cast<_Tp*>(_M_access()); } | 
 
 
 
 
 | 1525 |  | 
 
 
 
 
 | 1526 | template<typename _Tp> | 
 
 
 
 
 | 1527 | const _Tp& | 
 
 
 
 
 | 1528 | _M_access() const | 
 
 
 
 
 | 1529 | { return *static_cast<const _Tp*>(_M_access()); } | 
 
 
 
 
 | 1530 |  | 
 
 
 
 
 | 1531 | _Nocopy_types _M_unused; | 
 
 
 
 
 | 1532 | char _M_pod_data[sizeof(_Nocopy_types)]; | 
 
 
 
 
 | 1533 | }; | 
 
 
 
 
 | 1534 |  | 
 
 
 
 
 | 1535 | enum _Manager_operation | 
 
 
 
 
 | 1536 | { | 
 
 
 
 
 | 1537 | __get_type_info, | 
 
 
 
 
 | 1538 | __get_functor_ptr, | 
 
 
 
 
 | 1539 | __clone_functor, | 
 
 
 
 
 | 1540 | __destroy_functor | 
 
 
 
 
 | 1541 | }; | 
 
 
 
 
 | 1542 |  | 
 
 
 
 
 | 1543 | // Simple type wrapper that helps avoid annoying const problems | 
 
 
 
 
 | 1544 | // when casting between void pointers and pointers-to-pointers. | 
 
 
 
 
 | 1545 | template<typename _Tp> | 
 
 
 
 
 | 1546 | struct _Simple_type_wrapper | 
 
 
 
 
 | 1547 | { | 
 
 
 
 
 | 1548 | _Simple_type_wrapper(_Tp __value) : __value(__value) { } | 
 
 
 
 
 | 1549 |  | 
 
 
 
 
 | 1550 | _Tp __value; | 
 
 
 
 
 | 1551 | }; | 
 
 
 
 
 | 1552 |  | 
 
 
 
 
 | 1553 | template<typename _Tp> | 
 
 
 
 
 | 1554 | struct __is_location_invariant<_Simple_type_wrapper<_Tp> > | 
 
 
 
 
 | 1555 | : __is_location_invariant<_Tp> | 
 
 
 
 
 | 1556 | { | 
 
 
 
 
 | 1557 | }; | 
 
 
 
 
 | 1558 |  | 
 
 
 
 
 | 1559 | // Converts a reference to a function object into a callable | 
 
 
 
 
 | 1560 | // function object. | 
 
 
 
 
 | 1561 | template<typename _Functor> | 
 
 
 
 
 | 1562 | inline _Functor& | 
 
 
 
 
 | 1563 | __callable_functor(_Functor& __f) | 
 
 
 
 
 | 1564 | { return __f; } | 
 
 
 
 
 | 1565 |  | 
 
 
 
 
 | 1566 | template<typename _Member, typename _Class> | 
 
 
 
 
 | 1567 | inline _Mem_fn<_Member _Class::*> | 
 
 
 
 
 | 1568 | __callable_functor(_Member _Class::* &__p) | 
 
 
 
 
 | 1569 | { return mem_fn(__p); } | 
 
 
 
 
 | 1570 |  | 
 
 
 
 
 | 1571 | template<typename _Member, typename _Class> | 
 
 
 
 
 | 1572 | inline _Mem_fn<_Member _Class::*> | 
 
 
 
 
 | 1573 | __callable_functor(_Member _Class::* const &__p) | 
 
 
 
 
 | 1574 | { return mem_fn(__p); } | 
 
 
 
 
 | 1575 |  | 
 
 
 
 
 | 1576 | template<typename _Signature> | 
 
 
 
 
 | 1577 | class function; | 
 
 
 
 
 | 1578 |  | 
 
 
 
 
 | 1579 | /// Base class of all polymorphic function object wrappers. | 
 
 
 
 
 | 1580 | class _Function_base | 
 
 
 
 
 | 1581 | { | 
 
 
 
 
 | 1582 | public: | 
 
 
 
 
 | 1583 | static const std::size_t _M_max_size = sizeof(_Nocopy_types); | 
 
 
 
 
 | 1584 | static const std::size_t _M_max_align = __alignof__(_Nocopy_types); | 
 
 
 
 
 | 1585 |  | 
 
 
 
 
 | 1586 | template<typename _Functor> | 
 
 
 
 
 | 1587 | class _Base_manager | 
 
 
 
 
 | 1588 | { | 
 
 
 
 
 | 1589 | protected: | 
 
 
 
 
 | 1590 | static const bool __stored_locally = | 
 
 
 
 
 | 1591 | (__is_location_invariant<_Functor>::value | 
 
 
 
 
 | 1592 | && sizeof(_Functor) <= _M_max_size | 
 
 
 
 
 | 1593 | && __alignof__(_Functor) <= _M_max_align | 
 
 
 
 
 | 1594 | && (_M_max_align % __alignof__(_Functor) == 0)); | 
 
 
 
 
 | 1595 |  | 
 
 
 
 
 | 1596 | typedef integral_constant<bool, __stored_locally> _Local_storage; | 
 
 
 
 
 | 1597 |  | 
 
 
 
 
 | 1598 | // Retrieve a pointer to the function object | 
 
 
 
 
 | 1599 | static _Functor* | 
 
 
 
 
 | 1600 | _M_get_pointer(const _Any_data& __source) | 
 
 
 
 
 | 1601 | { | 
 
 
 
 
 | 1602 | const _Functor* __ptr = | 
 
 
 
 
 | 1603 | __stored_locally? std::__addressof(__source._M_access<_Functor>()) | 
 
 
 
 
 | 1604 | /* have stored a pointer */ : __source._M_access<_Functor*>(); | 
 
 
 
 
 | 1605 | return const_cast<_Functor*>(__ptr); | 
 
 
 
 
 | 1606 | } | 
 
 
 
 
 | 1607 |  | 
 
 
 
 
 | 1608 | // Clone a location-invariant function object that fits within | 
 
 
 
 
 | 1609 | // an _Any_data structure. | 
 
 
 
 
 | 1610 | static void | 
 
 
 
 
 | 1611 | _M_clone(_Any_data& __dest, const _Any_data& __source, true_type) | 
 
 
 
 
 | 1612 | { | 
 
 
 
 
 | 1613 | new (__dest._M_access()) _Functor(__source._M_access<_Functor>()); | 
 
 
 
 
 | 1614 | } | 
 
 
 
 
 | 1615 |  | 
 
 
 
 
 | 1616 | // Clone a function object that is not location-invariant or | 
 
 
 
 
 | 1617 | // that cannot fit into an _Any_data structure. | 
 
 
 
 
 | 1618 | static void | 
 
 
 
 
 | 1619 | _M_clone(_Any_data& __dest, const _Any_data& __source, false_type) | 
 
 
 
 
 | 1620 | { | 
 
 
 
 
 | 1621 | __dest._M_access<_Functor*>() = | 
 
 
 
 
 | 1622 | new _Functor(*__source._M_access<_Functor*>()); | 
 
 
 
 
 | 1623 | } | 
 
 
 
 
 | 1624 |  | 
 
 
 
 
 | 1625 | // Destroying a location-invariant object may still require | 
 
 
 
 
 | 1626 | // destruction. | 
 
 
 
 
 | 1627 | static void | 
 
 
 
 
 | 1628 | _M_destroy(_Any_data& __victim, true_type) | 
 
 
 
 
 | 1629 | { | 
 
 
 
 
 | 1630 | __victim._M_access<_Functor>().~_Functor(); | 
 
 
 
 
 | 1631 | } | 
 
 
 
 
 | 1632 |  | 
 
 
 
 
 | 1633 | // Destroying an object located on the heap. | 
 
 
 
 
 | 1634 | static void | 
 
 
 
 
 | 1635 | _M_destroy(_Any_data& __victim, false_type) | 
 
 
 
 
 | 1636 | { | 
 
 
 
 
 | 1637 | delete __victim._M_access<_Functor*>(); | 
 
 
 
 
 | 1638 | } | 
 
 
 
 
 | 1639 |  | 
 
 
 
 
 | 1640 | public: | 
 
 
 
 
 | 1641 | static bool | 
 
 
 
 
 | 1642 | _M_manager(_Any_data& __dest, const _Any_data& __source, | 
 
 
 
 
 | 1643 | _Manager_operation __op) | 
 
 
 
 
 | 1644 | { | 
 
 
 
 
 | 1645 | switch (__op) | 
 
 
 
 
 | 1646 | { | 
 
 
 
 
 | 1647 | #if __cpp_rtti | 
 
 
 
 
 | 1648 | case __get_type_info: | 
 
 
 
 
 | 1649 | __dest._M_access<const type_info*>() = &typeid(_Functor); | 
 
 
 
 
 | 1650 | break; | 
 
 
 
 
 | 1651 | #endif | 
 
 
 
 
 | 1652 | case __get_functor_ptr: | 
 
 
 
 
 | 1653 | __dest._M_access<_Functor*>() = _M_get_pointer(__source); | 
 
 
 
 
 | 1654 | break; | 
 
 
 
 
 | 1655 |  | 
 
 
 
 
 | 1656 | case __clone_functor: | 
 
 
 
 
 | 1657 | _M_clone(__dest, __source, _Local_storage()); | 
 
 
 
 
 | 1658 | break; | 
 
 
 
 
 | 1659 |  | 
 
 
 
 
 | 1660 | case __destroy_functor: | 
 
 
 
 
 | 1661 | _M_destroy(__dest, _Local_storage()); | 
 
 
 
 
 | 1662 | break; | 
 
 
 
 
 | 1663 | } | 
 
 
 
 
 | 1664 | return false; | 
 
 
 
 
 | 1665 | } | 
 
 
 
 
 | 1666 |  | 
 
 
 
 
 | 1667 | static void | 
 
 
 
 
 | 1668 | _M_init_functor(_Any_data& __functor, const _Functor& __f) | 
 
 
 
 
 | 1669 | { _M_init_functor(__functor, __f, _Local_storage()); } | 
 
 
 
 
 | 1670 |  | 
 
 
 
 
 | 1671 | template<typename _Signature> | 
 
 
 
 
 | 1672 | static bool | 
 
 
 
 
 | 1673 | _M_not_empty_function(const function<_Signature>& __f) | 
 
 
 
 
 | 1674 | { return static_cast<bool>(__f); } | 
 
 
 
 
 | 1675 |  | 
 
 
 
 
 | 1676 | template<typename _Tp> | 
 
 
 
 
 | 1677 | static bool | 
 
 
 
 
 | 1678 | _M_not_empty_function(const _Tp*& __fp) | 
 
 
 
 
 | 1679 | { return __fp; } | 
 
 
 
 
 | 1680 |  | 
 
 
 
 
 | 1681 | template<typename _Class, typename _Tp> | 
 
 
 
 
 | 1682 | static bool | 
 
 
 
 
 | 1683 | _M_not_empty_function(_Tp _Class::* const& __mp) | 
 
 
 
 
 | 1684 | { return __mp; } | 
 
 
 
 
 | 1685 |  | 
 
 
 
 
 | 1686 | template<typename _Tp> | 
 
 
 
 
 | 1687 | static bool | 
 
 
 
 
 | 1688 | _M_not_empty_function(const _Tp&) | 
 
 
 
 
 | 1689 | { return true; } | 
 
 
 
 
 | 1690 |  | 
 
 
 
 
 | 1691 | private: | 
 
 
 
 
 | 1692 | static void | 
 
 
 
 
 | 1693 | _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) | 
 
 
 
 
 | 1694 | { new (__functor._M_access()) _Functor(__f); } | 
 
 
 
 
 | 1695 |  | 
 
 
 
 
 | 1696 | static void | 
 
 
 
 
 | 1697 | _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type) | 
 
 
 
 
 | 1698 | { __functor._M_access<_Functor*>() = new _Functor(__f); } | 
 
 
 
 
 | 1699 | }; | 
 
 
 
 
 | 1700 |  | 
 
 
 
 
 | 1701 | template<typename _Functor> | 
 
 
 
 
 | 1702 | class _Ref_manager : public _Base_manager<_Functor*> | 
 
 
 
 
 | 1703 | { | 
 
 
 
 
 | 1704 | typedef _Function_base::_Base_manager<_Functor*> _Base; | 
 
 
 
 
 | 1705 |  | 
 
 
 
 
 | 1706 | public: | 
 
 
 
 
 | 1707 | static bool | 
 
 
 
 
 | 1708 | _M_manager(_Any_data& __dest, const _Any_data& __source, | 
 
 
 
 
 | 1709 | _Manager_operation __op) | 
 
 
 
 
 | 1710 | { | 
 
 
 
 
 | 1711 | switch (__op) | 
 
 
 
 
 | 1712 | { | 
 
 
 
 
 | 1713 | #if __cpp_rtti | 
 
 
 
 
 | 1714 | case __get_type_info: | 
 
 
 
 
 | 1715 | __dest._M_access<const type_info*>() = &typeid(_Functor); | 
 
 
 
 
 | 1716 | break; | 
 
 
 
 
 | 1717 | #endif | 
 
 
 
 
 | 1718 | case __get_functor_ptr: | 
 
 
 
 
 | 1719 | __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source); | 
 
 
 
 
 | 1720 | return is_const<_Functor>::value; | 
 
 
 
 
 | 1721 | break; | 
 
 
 
 
 | 1722 |  | 
 
 
 
 
 | 1723 | default: | 
 
 
 
 
 | 1724 | _Base::_M_manager(__dest, __source, __op); | 
 
 
 
 
 | 1725 | } | 
 
 
 
 
 | 1726 | return false; | 
 
 
 
 
 | 1727 | } | 
 
 
 
 
 | 1728 |  | 
 
 
 
 
 | 1729 | static void | 
 
 
 
 
 | 1730 | _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f) | 
 
 
 
 
 | 1731 | { | 
 
 
 
 
 | 1732 | _Base::_M_init_functor(__functor, std::__addressof(__f.get())); | 
 
 
 
 
 | 1733 | } | 
 
 
 
 
 | 1734 | }; | 
 
 
 
 
 | 1735 |  | 
 
 
 
 
 | 1736 | _Function_base() : _M_manager(0) { } | 
 
 
 
 
 | 1737 |  | 
 
 
 
 
 | 1738 | ~_Function_base() | 
 
 
 
 
 | 1739 | { | 
 
 
 
 
 | 1740 | if (_M_manager) | 
 
 
 
 
 | 1741 | _M_manager(_M_functor, _M_functor, __destroy_functor); | 
 
 
 
 
 | 1742 | } | 
 
 
 
 
 | 1743 |  | 
 
 
 
 
 | 1744 |  | 
 
 
 
 
 | 1745 | bool _M_empty() const { return !_M_manager; } | 
 
 
 
 
 | 1746 |  | 
 
 
 
 
 | 1747 | typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, | 
 
 
 
 
 | 1748 | _Manager_operation); | 
 
 
 
 
 | 1749 |  | 
 
 
 
 
 | 1750 | _Any_data     _M_functor; | 
 
 
 
 
 | 1751 | _Manager_type _M_manager; | 
 
 
 
 
 | 1752 | }; | 
 
 
 
 
 | 1753 |  | 
 
 
 
 
 | 1754 | template<typename _Signature, typename _Functor> | 
 
 
 
 
 | 1755 | class _Function_handler; | 
 
 
 
 
 | 1756 |  | 
 
 
 
 
 | 1757 | template<typename _Res, typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1758 | class _Function_handler<_Res(_ArgTypes...), _Functor> | 
 
 
 
 
 | 1759 | : public _Function_base::_Base_manager<_Functor> | 
 
 
 
 
 | 1760 | { | 
 
 
 
 
 | 1761 | typedef _Function_base::_Base_manager<_Functor> _Base; | 
 
 
 
 
 | 1762 |  | 
 
 
 
 
 | 1763 | public: | 
 
 
 
 
 | 1764 | static _Res | 
 
 
 
 
 | 1765 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1766 | { | 
 
 
 
 
 | 1767 | return (*_Base::_M_get_pointer(__functor))(__args...); | 
 
 
 
 
 | 1768 | } | 
 
 
 
 
 | 1769 | }; | 
 
 
 
 
 | 1770 |  | 
 
 
 
 
 | 1771 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1772 | class _Function_handler<void(_ArgTypes...), _Functor> | 
 
 
 
 
 | 1773 | : public _Function_base::_Base_manager<_Functor> | 
 
 
 
 
 | 1774 | { | 
 
 
 
 
 | 1775 | typedef _Function_base::_Base_manager<_Functor> _Base; | 
 
 
 
 
 | 1776 |  | 
 
 
 
 
 | 1777 | public: | 
 
 
 
 
 | 1778 | static void | 
 
 
 
 
 | 1779 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1780 | { | 
 
 
 
 
 | 1781 | (*_Base::_M_get_pointer(__functor))(__args...); | 
 
 
 
 
 | 1782 | } | 
 
 
 
 
 | 1783 | }; | 
 
 
 
 
 | 1784 |  | 
 
 
 
 
 | 1785 | template<typename _Res, typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1786 | class _Function_handler<_Res(_ArgTypes...), reference_wrapper<_Functor> > | 
 
 
 
 
 | 1787 | : public _Function_base::_Ref_manager<_Functor> | 
 
 
 
 
 | 1788 | { | 
 
 
 
 
 | 1789 | typedef _Function_base::_Ref_manager<_Functor> _Base; | 
 
 
 
 
 | 1790 |  | 
 
 
 
 
 | 1791 | public: | 
 
 
 
 
 | 1792 | static _Res | 
 
 
 
 
 | 1793 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1794 | { | 
 
 
 
 
 | 1795 | return | 
 
 
 
 
 | 1796 | __callable_functor(**_Base::_M_get_pointer(__functor))(__args...); | 
 
 
 
 
 | 1797 | } | 
 
 
 
 
 | 1798 | }; | 
 
 
 
 
 | 1799 |  | 
 
 
 
 
 | 1800 | template<typename _Functor, typename... _ArgTypes> | 
 
 
 
 
 | 1801 | class _Function_handler<void(_ArgTypes...), reference_wrapper<_Functor> > | 
 
 
 
 
 | 1802 | : public _Function_base::_Ref_manager<_Functor> | 
 
 
 
 
 | 1803 | { | 
 
 
 
 
 | 1804 | typedef _Function_base::_Ref_manager<_Functor> _Base; | 
 
 
 
 
 | 1805 |  | 
 
 
 
 
 | 1806 | public: | 
 
 
 
 
 | 1807 | static void | 
 
 
 
 
 | 1808 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1809 | { | 
 
 
 
 
 | 1810 | __callable_functor(**_Base::_M_get_pointer(__functor))(__args...); | 
 
 
 
 
 | 1811 | } | 
 
 
 
 
 | 1812 | }; | 
 
 
 
 
 | 1813 |  | 
 
 
 
 
 | 1814 | template<typename _Class, typename _Member, typename _Res, | 
 
 
 
 
 | 1815 | typename... _ArgTypes> | 
 
 
 
 
 | 1816 | class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> | 
 
 
 
 
 | 1817 | : public _Function_handler<void(_ArgTypes...), _Member _Class::*> | 
 
 
 
 
 | 1818 | { | 
 
 
 
 
 | 1819 | typedef _Function_handler<void(_ArgTypes...), _Member _Class::*> | 
 
 
 
 
 | 1820 | _Base; | 
 
 
 
 
 | 1821 |  | 
 
 
 
 
 | 1822 | public: | 
 
 
 
 
 | 1823 | static _Res | 
 
 
 
 
 | 1824 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1825 | { | 
 
 
 
 
 | 1826 | return tr1:: | 
 
 
 
 
 | 1827 | mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...); | 
 
 
 
 
 | 1828 | } | 
 
 
 
 
 | 1829 | }; | 
 
 
 
 
 | 1830 |  | 
 
 
 
 
 | 1831 | template<typename _Class, typename _Member, typename... _ArgTypes> | 
 
 
 
 
 | 1832 | class _Function_handler<void(_ArgTypes...), _Member _Class::*> | 
 
 
 
 
 | 1833 | : public _Function_base::_Base_manager< | 
 
 
 
 
 | 1834 | _Simple_type_wrapper< _Member _Class::* > > | 
 
 
 
 
 | 1835 | { | 
 
 
 
 
 | 1836 | typedef _Member _Class::* _Functor; | 
 
 
 
 
 | 1837 | typedef _Simple_type_wrapper<_Functor> _Wrapper; | 
 
 
 
 
 | 1838 | typedef _Function_base::_Base_manager<_Wrapper> _Base; | 
 
 
 
 
 | 1839 |  | 
 
 
 
 
 | 1840 | public: | 
 
 
 
 
 | 1841 | static bool | 
 
 
 
 
 | 1842 | _M_manager(_Any_data& __dest, const _Any_data& __source, | 
 
 
 
 
 | 1843 | _Manager_operation __op) | 
 
 
 
 
 | 1844 | { | 
 
 
 
 
 | 1845 | switch (__op) | 
 
 
 
 
 | 1846 | { | 
 
 
 
 
 | 1847 | #if __cpp_rtti | 
 
 
 
 
 | 1848 | case __get_type_info: | 
 
 
 
 
 | 1849 | __dest._M_access<const type_info*>() = &typeid(_Functor); | 
 
 
 
 
 | 1850 | break; | 
 
 
 
 
 | 1851 | #endif | 
 
 
 
 
 | 1852 | case __get_functor_ptr: | 
 
 
 
 
 | 1853 | __dest._M_access<_Functor*>() = | 
 
 
 
 
 | 1854 | &_Base::_M_get_pointer(__source)->__value; | 
 
 
 
 
 | 1855 | break; | 
 
 
 
 
 | 1856 |  | 
 
 
 
 
 | 1857 | default: | 
 
 
 
 
 | 1858 | _Base::_M_manager(__dest, __source, __op); | 
 
 
 
 
 | 1859 | } | 
 
 
 
 
 | 1860 | return false; | 
 
 
 
 
 | 1861 | } | 
 
 
 
 
 | 1862 |  | 
 
 
 
 
 | 1863 | static void | 
 
 
 
 
 | 1864 | _M_invoke(const _Any_data& __functor, _ArgTypes... __args) | 
 
 
 
 
 | 1865 | { | 
 
 
 
 
 | 1866 | tr1::mem_fn(_Base::_M_get_pointer(__functor)->__value)(__args...); | 
 
 
 
 
 | 1867 | } | 
 
 
 
 
 | 1868 | }; | 
 
 
 
 
 | 1869 |  | 
 
 
 
 
 | 1870 | /// class function | 
 
 
 
 
 | 1871 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 1872 | class function<_Res(_ArgTypes...)> | 
 
 
 
 
 | 1873 | : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, | 
 
 
 
 
 | 1874 | private _Function_base | 
 
 
 
 
 | 1875 | { | 
 
 
 
 
 | 1876 | #if __cplusplus < 201103L | 
 
 
 
 
 | 1877 | /// This class is used to implement the safe_bool idiom. | 
 
 
 
 
 | 1878 | struct _Hidden_type | 
 
 
 
 
 | 1879 | { | 
 
 
 
 
 | 1880 | _Hidden_type* _M_bool; | 
 
 
 
 
 | 1881 | }; | 
 
 
 
 
 | 1882 |  | 
 
 
 
 
 | 1883 | /// This typedef is used to implement the safe_bool idiom. | 
 
 
 
 
 | 1884 | typedef _Hidden_type* _Hidden_type::* _Safe_bool; | 
 
 
 
 
 | 1885 | #endif | 
 
 
 
 
 | 1886 |  | 
 
 
 
 
 | 1887 | typedef _Res _Signature_type(_ArgTypes...); | 
 
 
 
 
 | 1888 |  | 
 
 
 
 
 | 1889 | struct _Useless { }; | 
 
 
 
 
 | 1890 |  | 
 
 
 
 
 | 1891 | public: | 
 
 
 
 
 | 1892 | typedef _Res result_type; | 
 
 
 
 
 | 1893 |  | 
 
 
 
 
 | 1894 | // [3.7.2.1] construct/copy/destroy | 
 
 
 
 
 | 1895 |  | 
 
 
 
 
 | 1896 | /** | 
 
 
 
 
 | 1897 | *  @brief Default construct creates an empty function call wrapper. | 
 
 
 
 
 | 1898 | *  @post @c !(bool)*this | 
 
 
 
 
 | 1899 | */ | 
 
 
 
 
 | 1900 | function() : _Function_base() { } | 
 
 
 
 
 | 1901 |  | 
 
 
 
 
 | 1902 | /** | 
 
 
 
 
 | 1903 | *  @brief Default construct creates an empty function call wrapper. | 
 
 
 
 
 | 1904 | *  @post @c !(bool)*this | 
 
 
 
 
 | 1905 | */ | 
 
 
 
 
 | 1906 | function(_M_clear_type*) : _Function_base() { } | 
 
 
 
 
 | 1907 |  | 
 
 
 
 
 | 1908 | /** | 
 
 
 
 
 | 1909 | *  @brief %Function copy constructor. | 
 
 
 
 
 | 1910 | *  @param x A %function object with identical call signature. | 
 
 
 
 
 | 1911 | *  @post @c (bool)*this == (bool)x | 
 
 
 
 
 | 1912 | * | 
 
 
 
 
 | 1913 | *  The newly-created %function contains a copy of the target of @a | 
 
 
 
 
 | 1914 | *  x (if it has one). | 
 
 
 
 
 | 1915 | */ | 
 
 
 
 
 | 1916 | function(const function& __x); | 
 
 
 
 
 | 1917 |  | 
 
 
 
 
 | 1918 | /** | 
 
 
 
 
 | 1919 | *  @brief Builds a %function that targets a copy of the incoming | 
 
 
 
 
 | 1920 | *  function object. | 
 
 
 
 
 | 1921 | *  @param f A %function object that is callable with parameters of | 
 
 
 
 
 | 1922 | *  type @c T1, @c T2, ..., @c TN and returns a value convertible | 
 
 
 
 
 | 1923 | *  to @c Res. | 
 
 
 
 
 | 1924 | * | 
 
 
 
 
 | 1925 | *  The newly-created %function object will target a copy of @a | 
 
 
 
 
 | 1926 | *  f. If @a f is @c reference_wrapper<F>, then this function | 
 
 
 
 
 | 1927 | *  object will contain a reference to the function object @c | 
 
 
 
 
 | 1928 | *  f.get(). If @a f is a NULL function pointer or NULL | 
 
 
 
 
 | 1929 | *  pointer-to-member, the newly-created object will be empty. | 
 
 
 
 
 | 1930 | * | 
 
 
 
 
 | 1931 | *  If @a f is a non-NULL function pointer or an object of type @c | 
 
 
 
 
 | 1932 | *  reference_wrapper<F>, this function will not throw. | 
 
 
 
 
 | 1933 | */ | 
 
 
 
 
 | 1934 | template<typename _Functor> | 
 
 
 
 
 | 1935 | function(_Functor __f, | 
 
 
 
 
 | 1936 | typename __gnu_cxx::__enable_if< | 
 
 
 
 
 | 1937 | !is_integral<_Functor>::value, _Useless>::__type | 
 
 
 
 
 | 1938 | = _Useless()); | 
 
 
 
 
 | 1939 |  | 
 
 
 
 
 | 1940 | /** | 
 
 
 
 
 | 1941 | *  @brief %Function assignment operator. | 
 
 
 
 
 | 1942 | *  @param x A %function with identical call signature. | 
 
 
 
 
 | 1943 | *  @post @c (bool)*this == (bool)x | 
 
 
 
 
 | 1944 | *  @returns @c *this | 
 
 
 
 
 | 1945 | * | 
 
 
 
 
 | 1946 | *  The target of @a x is copied to @c *this. If @a x has no | 
 
 
 
 
 | 1947 | *  target, then @c *this will be empty. | 
 
 
 
 
 | 1948 | * | 
 
 
 
 
 | 1949 | *  If @a x targets a function pointer or a reference to a function | 
 
 
 
 
 | 1950 | *  object, then this operation will not throw an %exception. | 
 
 
 
 
 | 1951 | */ | 
 
 
 
 
 | 1952 | function& | 
 
 
 
 
 | 1953 | operator=(const function& __x) | 
 
 
 
 
 | 1954 | { | 
 
 
 
 
 | 1955 | function(__x).swap(*this); | 
 
 
 
 
 | 1956 | return *this; | 
 
 
 
 
 | 1957 | } | 
 
 
 
 
 | 1958 |  | 
 
 
 
 
 | 1959 | /** | 
 
 
 
 
 | 1960 | *  @brief %Function assignment to zero. | 
 
 
 
 
 | 1961 | *  @post @c !(bool)*this | 
 
 
 
 
 | 1962 | *  @returns @c *this | 
 
 
 
 
 | 1963 | * | 
 
 
 
 
 | 1964 | *  The target of @c *this is deallocated, leaving it empty. | 
 
 
 
 
 | 1965 | */ | 
 
 
 
 
 | 1966 | function& | 
 
 
 
 
 | 1967 | operator=(_M_clear_type*) | 
 
 
 
 
 | 1968 | { | 
 
 
 
 
 | 1969 | if (_M_manager) | 
 
 
 
 
 | 1970 | { | 
 
 
 
 
 | 1971 | _M_manager(_M_functor, _M_functor, __destroy_functor); | 
 
 
 
 
 | 1972 | _M_manager = 0; | 
 
 
 
 
 | 1973 | _M_invoker = 0; | 
 
 
 
 
 | 1974 | } | 
 
 
 
 
 | 1975 | return *this; | 
 
 
 
 
 | 1976 | } | 
 
 
 
 
 | 1977 |  | 
 
 
 
 
 | 1978 | /** | 
 
 
 
 
 | 1979 | *  @brief %Function assignment to a new target. | 
 
 
 
 
 | 1980 | *  @param f A %function object that is callable with parameters of | 
 
 
 
 
 | 1981 | *  type @c T1, @c T2, ..., @c TN and returns a value convertible | 
 
 
 
 
 | 1982 | *  to @c Res. | 
 
 
 
 
 | 1983 | *  @return @c *this | 
 
 
 
 
 | 1984 | * | 
 
 
 
 
 | 1985 | *  This  %function object wrapper will target a copy of @a | 
 
 
 
 
 | 1986 | *  f. If @a f is @c reference_wrapper<F>, then this function | 
 
 
 
 
 | 1987 | *  object will contain a reference to the function object @c | 
 
 
 
 
 | 1988 | *  f.get(). If @a f is a NULL function pointer or NULL | 
 
 
 
 
 | 1989 | *  pointer-to-member, @c this object will be empty. | 
 
 
 
 
 | 1990 | * | 
 
 
 
 
 | 1991 | *  If @a f is a non-NULL function pointer or an object of type @c | 
 
 
 
 
 | 1992 | *  reference_wrapper<F>, this function will not throw. | 
 
 
 
 
 | 1993 | */ | 
 
 
 
 
 | 1994 | template<typename _Functor> | 
 
 
 
 
 | 1995 | typename __gnu_cxx::__enable_if<!is_integral<_Functor>::value, | 
 
 
 
 
 | 1996 | function&>::__type | 
 
 
 
 
 | 1997 | operator=(_Functor __f) | 
 
 
 
 
 | 1998 | { | 
 
 
 
 
 | 1999 | function(__f).swap(*this); | 
 
 
 
 
 | 2000 | return *this; | 
 
 
 
 
 | 2001 | } | 
 
 
 
 
 | 2002 |  | 
 
 
 
 
 | 2003 | // [3.7.2.2] function modifiers | 
 
 
 
 
 | 2004 |  | 
 
 
 
 
 | 2005 | /** | 
 
 
 
 
 | 2006 | *  @brief Swap the targets of two %function objects. | 
 
 
 
 
 | 2007 | *  @param f A %function with identical call signature. | 
 
 
 
 
 | 2008 | * | 
 
 
 
 
 | 2009 | *  Swap the targets of @c this function object and @a f. This | 
 
 
 
 
 | 2010 | *  function will not throw an %exception. | 
 
 
 
 
 | 2011 | */ | 
 
 
 
 
 | 2012 | void swap(function& __x) | 
 
 
 
 
 | 2013 | { | 
 
 
 
 
 | 2014 | std::swap(_M_functor, __x._M_functor); | 
 
 
 
 
 | 2015 | std::swap(_M_manager, __x._M_manager); | 
 
 
 
 
 | 2016 | std::swap(_M_invoker, __x._M_invoker); | 
 
 
 
 
 | 2017 | } | 
 
 
 
 
 | 2018 |  | 
 
 
 
 
 | 2019 | // [3.7.2.3] function capacity | 
 
 
 
 
 | 2020 |  | 
 
 
 
 
 | 2021 | /** | 
 
 
 
 
 | 2022 | *  @brief Determine if the %function wrapper has a target. | 
 
 
 
 
 | 2023 | * | 
 
 
 
 
 | 2024 | *  @return @c true when this %function object contains a target, | 
 
 
 
 
 | 2025 | *  or @c false when it is empty. | 
 
 
 
 
 | 2026 | * | 
 
 
 
 
 | 2027 | *  This function will not throw an %exception. | 
 
 
 
 
 | 2028 | */ | 
 
 
 
 
 | 2029 | #if __cplusplus >= 201103L | 
 
 
 
 
 | 2030 | explicit operator bool() const | 
 
 
 
 
 | 2031 | { return !_M_empty(); } | 
 
 
 
 
 | 2032 | #else | 
 
 
 
 
 | 2033 | operator _Safe_bool() const | 
 
 
 
 
 | 2034 | { | 
 
 
 
 
 | 2035 | if (_M_empty()) | 
 
 
 
 
 | 2036 | return 0; | 
 
 
 
 
 | 2037 | else | 
 
 
 
 
 | 2038 | return &_Hidden_type::_M_bool; | 
 
 
 
 
 | 2039 | } | 
 
 
 
 
 | 2040 | #endif | 
 
 
 
 
 | 2041 |  | 
 
 
 
 
 | 2042 | // [3.7.2.4] function invocation | 
 
 
 
 
 | 2043 |  | 
 
 
 
 
 | 2044 | /** | 
 
 
 
 
 | 2045 | *  @brief Invokes the function targeted by @c *this. | 
 
 
 
 
 | 2046 | *  @returns the result of the target. | 
 
 
 
 
 | 2047 | *  @throws bad_function_call when @c !(bool)*this | 
 
 
 
 
 | 2048 | * | 
 
 
 
 
 | 2049 | *  The function call operator invokes the target function object | 
 
 
 
 
 | 2050 | *  stored by @c this. | 
 
 
 
 
 | 2051 | */ | 
 
 
 
 
 | 2052 | _Res operator()(_ArgTypes... __args) const; | 
 
 
 
 
 | 2053 |  | 
 
 
 
 
 | 2054 | #if __cpp_rtti | 
 
 
 
 
 | 2055 | // [3.7.2.5] function target access | 
 
 
 
 
 | 2056 | /** | 
 
 
 
 
 | 2057 | *  @brief Determine the type of the target of this function object | 
 
 
 
 
 | 2058 | *  wrapper. | 
 
 
 
 
 | 2059 | * | 
 
 
 
 
 | 2060 | *  @returns the type identifier of the target function object, or | 
 
 
 
 
 | 2061 | *  @c typeid(void) if @c !(bool)*this. | 
 
 
 
 
 | 2062 | * | 
 
 
 
 
 | 2063 | *  This function will not throw an %exception. | 
 
 
 
 
 | 2064 | */ | 
 
 
 
 
 | 2065 | const type_info& target_type() const; | 
 
 
 
 
 | 2066 |  | 
 
 
 
 
 | 2067 | /** | 
 
 
 
 
 | 2068 | *  @brief Access the stored target function object. | 
 
 
 
 
 | 2069 | * | 
 
 
 
 
 | 2070 | *  @return Returns a pointer to the stored target function object, | 
 
 
 
 
 | 2071 | *  if @c typeid(Functor).equals(target_type()); otherwise, a NULL | 
 
 
 
 
 | 2072 | *  pointer. | 
 
 
 
 
 | 2073 | * | 
 
 
 
 
 | 2074 | * This function will not throw an %exception. | 
 
 
 
 
 | 2075 | */ | 
 
 
 
 
 | 2076 | template<typename _Functor>       _Functor* target(); | 
 
 
 
 
 | 2077 |  | 
 
 
 
 
 | 2078 | /// @overload | 
 
 
 
 
 | 2079 | template<typename _Functor> const _Functor* target() const; | 
 
 
 
 
 | 2080 | #endif | 
 
 
 
 
 | 2081 |  | 
 
 
 
 
 | 2082 | private: | 
 
 
 
 
 | 2083 | // [3.7.2.6] undefined operators | 
 
 
 
 
 | 2084 | template<typename _Function> | 
 
 
 
 
 | 2085 | void operator==(const function<_Function>&) const; | 
 
 
 
 
 | 2086 | template<typename _Function> | 
 
 
 
 
 | 2087 | void operator!=(const function<_Function>&) const; | 
 
 
 
 
 | 2088 |  | 
 
 
 
 
 | 2089 | typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...); | 
 
 
 
 
 | 2090 | _Invoker_type _M_invoker; | 
 
 
 
 
 | 2091 | }; | 
 
 
 
 
 | 2092 |  | 
 
 
 
 
 | 2093 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2094 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2095 | function(const function& __x) | 
 
 
 
 
 | 2096 | : _Function_base() | 
 
 
 
 
 | 2097 | { | 
 
 
 
 
 | 2098 | if (static_cast<bool>(__x)) | 
 
 
 
 
 | 2099 | { | 
 
 
 
 
 | 2100 | __x._M_manager(_M_functor, __x._M_functor, __clone_functor); | 
 
 
 
 
 | 2101 | _M_invoker = __x._M_invoker; | 
 
 
 
 
 | 2102 | _M_manager = __x._M_manager; | 
 
 
 
 
 | 2103 | } | 
 
 
 
 
 | 2104 | } | 
 
 
 
 
 | 2105 |  | 
 
 
 
 
 | 2106 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2107 | template<typename _Functor> | 
 
 
 
 
 | 2108 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2109 | function(_Functor __f, | 
 
 
 
 
 | 2110 | typename __gnu_cxx::__enable_if< | 
 
 
 
 
 | 2111 | !is_integral<_Functor>::value, _Useless>::__type) | 
 
 
 
 
 | 2112 | : _Function_base() | 
 
 
 
 
 | 2113 | { | 
 
 
 
 
 | 2114 | typedef _Function_handler<_Signature_type, _Functor> _My_handler; | 
 
 
 
 
 | 2115 |  | 
 
 
 
 
 | 2116 | if (_My_handler::_M_not_empty_function(__f)) | 
 
 
 
 
 | 2117 | { | 
 
 
 
 
 | 2118 | _My_handler::_M_init_functor(_M_functor, __f); | 
 
 
 
 
 | 2119 | _M_invoker = &_My_handler::_M_invoke; | 
 
 
 
 
 | 2120 | _M_manager = &_My_handler::_M_manager; | 
 
 
 
 
 | 2121 | } | 
 
 
 
 
 | 2122 | } | 
 
 
 
 
 | 2123 |  | 
 
 
 
 
 | 2124 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2125 | _Res | 
 
 
 
 
 | 2126 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2127 | operator()(_ArgTypes... __args) const | 
 
 
 
 
 | 2128 | { | 
 
 
 
 
 | 2129 | if (_M_empty()) | 
 
 
 
 
 | 2130 | _GLIBCXX_THROW_OR_ABORT(bad_function_call()); | 
 
 
 
 
 | 2131 | return _M_invoker(_M_functor, __args...); | 
 
 
 
 
 | 2132 | } | 
 
 
 
 
 | 2133 |  | 
 
 
 
 
 | 2134 | #if __cpp_rtti | 
 
 
 
 
 | 2135 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2136 | const type_info& | 
 
 
 
 
 | 2137 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2138 | target_type() const | 
 
 
 
 
 | 2139 | { | 
 
 
 
 
 | 2140 | if (_M_manager) | 
 
 
 
 
 | 2141 | { | 
 
 
 
 
 | 2142 | _Any_data __typeinfo_result; | 
 
 
 
 
 | 2143 | _M_manager(__typeinfo_result, _M_functor, __get_type_info); | 
 
 
 
 
 | 2144 | return *__typeinfo_result._M_access<const type_info*>(); | 
 
 
 
 
 | 2145 | } | 
 
 
 
 
 | 2146 | else | 
 
 
 
 
 | 2147 | return typeid(void); | 
 
 
 
 
 | 2148 | } | 
 
 
 
 
 | 2149 |  | 
 
 
 
 
 | 2150 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2151 | template<typename _Functor> | 
 
 
 
 
 | 2152 | _Functor* | 
 
 
 
 
 | 2153 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2154 | target() | 
 
 
 
 
 | 2155 | { | 
 
 
 
 
 | 2156 | if (typeid(_Functor) == target_type() && _M_manager) | 
 
 
 
 
 | 2157 | { | 
 
 
 
 
 | 2158 | _Any_data __ptr; | 
 
 
 
 
 | 2159 | if (_M_manager(__ptr, _M_functor, __get_functor_ptr) | 
 
 
 
 
 | 2160 | && !is_const<_Functor>::value) | 
 
 
 
 
 | 2161 | return 0; | 
 
 
 
 
 | 2162 | else | 
 
 
 
 
 | 2163 | return __ptr._M_access<_Functor*>(); | 
 
 
 
 
 | 2164 | } | 
 
 
 
 
 | 2165 | else | 
 
 
 
 
 | 2166 | return 0; | 
 
 
 
 
 | 2167 | } | 
 
 
 
 
 | 2168 |  | 
 
 
 
 
 | 2169 | template<typename _Res, typename... _ArgTypes> | 
 
 
 
 
 | 2170 | template<typename _Functor> | 
 
 
 
 
 | 2171 | const _Functor* | 
 
 
 
 
 | 2172 | function<_Res(_ArgTypes...)>:: | 
 
 
 
 
 | 2173 | target() const | 
 
 
 
 
 | 2174 | { | 
 
 
 
 
 | 2175 | if (typeid(_Functor) == target_type() && _M_manager) | 
 
 
 
 
 | 2176 | { | 
 
 
 
 
 | 2177 | _Any_data __ptr; | 
 
 
 
 
 | 2178 | _M_manager(__ptr, _M_functor, __get_functor_ptr); | 
 
 
 
 
 | 2179 | return __ptr._M_access<const _Functor*>(); | 
 
 
 
 
 | 2180 | } | 
 
 
 
 
 | 2181 | else | 
 
 
 
 
 | 2182 | return 0; | 
 
 
 
 
 | 2183 | } | 
 
 
 
 
 | 2184 | #endif | 
 
 
 
 
 | 2185 |  | 
 
 
 
 
 | 2186 | // [3.7.2.7] null pointer comparisons | 
 
 
 
 
 | 2187 |  | 
 
 
 
 
 | 2188 | /** | 
 
 
 
 
 | 2189 | *  @brief Compares a polymorphic function object wrapper against 0 | 
 
 
 
 
 | 2190 | *  (the NULL pointer). | 
 
 
 
 
 | 2191 | *  @returns @c true if the wrapper has no target, @c false otherwise | 
 
 
 
 
 | 2192 | * | 
 
 
 
 
 | 2193 | *  This function will not throw an %exception. | 
 
 
 
 
 | 2194 | */ | 
 
 
 
 
 | 2195 | template<typename _Signature> | 
 
 
 
 
 | 2196 | inline bool | 
 
 
 
 
 | 2197 | operator==(const function<_Signature>& __f, _M_clear_type*) | 
 
 
 
 
 | 2198 | { return !static_cast<bool>(__f); } | 
 
 
 
 
 | 2199 |  | 
 
 
 
 
 | 2200 | /// @overload | 
 
 
 
 
 | 2201 | template<typename _Signature> | 
 
 
 
 
 | 2202 | inline bool | 
 
 
 
 
 | 2203 | operator==(_M_clear_type*, const function<_Signature>& __f) | 
 
 
 
 
 | 2204 | { return !static_cast<bool>(__f); } | 
 
 
 
 
 | 2205 |  | 
 
 
 
 
 | 2206 | /** | 
 
 
 
 
 | 2207 | *  @brief Compares a polymorphic function object wrapper against 0 | 
 
 
 
 
 | 2208 | *  (the NULL pointer). | 
 
 
 
 
 | 2209 | *  @returns @c false if the wrapper has no target, @c true otherwise | 
 
 
 
 
 | 2210 | * | 
 
 
 
 
 | 2211 | *  This function will not throw an %exception. | 
 
 
 
 
 | 2212 | */ | 
 
 
 
 
 | 2213 | template<typename _Signature> | 
 
 
 
 
 | 2214 | inline bool | 
 
 
 
 
 | 2215 | operator!=(const function<_Signature>& __f, _M_clear_type*) | 
 
 
 
 
 | 2216 | { return static_cast<bool>(__f); } | 
 
 
 
 
 | 2217 |  | 
 
 
 
 
 | 2218 | /// @overload | 
 
 
 
 
 | 2219 | template<typename _Signature> | 
 
 
 
 
 | 2220 | inline bool | 
 
 
 
 
 | 2221 | operator!=(_M_clear_type*, const function<_Signature>& __f) | 
 
 
 
 
 | 2222 | { return static_cast<bool>(__f); } | 
 
 
 
 
 | 2223 |  | 
 
 
 
 
 | 2224 | // [3.7.2.8] specialized algorithms | 
 
 
 
 
 | 2225 |  | 
 
 
 
 
 | 2226 | /** | 
 
 
 
 
 | 2227 | *  @brief Swap the targets of two polymorphic function object wrappers. | 
 
 
 
 
 | 2228 | * | 
 
 
 
 
 | 2229 | *  This function will not throw an %exception. | 
 
 
 
 
 | 2230 | */ | 
 
 
 
 
 | 2231 | template<typename _Signature> | 
 
 
 
 
 | 2232 | inline void | 
 
 
 
 
 | 2233 | swap(function<_Signature>& __x, function<_Signature>& __y) | 
 
 
 
 
 | 2234 | { __x.swap(__y); } | 
 
 
 
 
 | 2235 | } | 
 
 
 
 
 | 2236 |  | 
 
 
 
 
 | 2237 | #if __cplusplus >= 201103L | 
 
 
 
 
 | 2238 | // Specialize std::is_bind_expression for tr1::bind closure types, | 
 
 
 
 
 | 2239 | // so that they can also work with std::bind. | 
 
 
 
 
 | 2240 |  | 
 
 
 
 
 | 2241 | template<typename _Signature> | 
 
 
 
 
 | 2242 | struct is_bind_expression<tr1::_Bind<_Signature>> | 
 
 
 
 
 | 2243 | : true_type { }; | 
 
 
 
 
 | 2244 |  | 
 
 
 
 
 | 2245 | template<typename _Signature> | 
 
 
 
 
 | 2246 | struct is_bind_expression<const tr1::_Bind<_Signature>> | 
 
 
 
 
 | 2247 | : true_type { }; | 
 
 
 
 
 | 2248 |  | 
 
 
 
 
 | 2249 | template<typename _Signature> | 
 
 
 
 
 | 2250 | struct is_bind_expression<volatile tr1::_Bind<_Signature>> | 
 
 
 
 
 | 2251 | : true_type { }; | 
 
 
 
 
 | 2252 |  | 
 
 
 
 
 | 2253 | template<typename _Signature> | 
 
 
 
 
 | 2254 | struct is_bind_expression<const volatile tr1::_Bind<_Signature>> | 
 
 
 
 
 | 2255 | : true_type { }; | 
 
 
 
 
 | 2256 |  | 
 
 
 
 
 | 2257 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 2258 | struct is_bind_expression<tr1::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 2259 | : true_type { }; | 
 
 
 
 
 | 2260 |  | 
 
 
 
 
 | 2261 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 2262 | struct is_bind_expression<const tr1::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 2263 | : true_type { }; | 
 
 
 
 
 | 2264 |  | 
 
 
 
 
 | 2265 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 2266 | struct is_bind_expression<volatile tr1::_Bind_result<_Result, _Signature>> | 
 
 
 
 
 | 2267 | : true_type { }; | 
 
 
 
 
 | 2268 |  | 
 
 
 
 
 | 2269 | template<typename _Result, typename _Signature> | 
 
 
 
 
 | 2270 | struct is_bind_expression<const volatile tr1::_Bind_result<_Result, | 
 
 
 
 
 | 2271 | _Signature>> | 
 
 
 
 
 | 2272 | : true_type { }; | 
 
 
 
 
 | 2273 |  | 
 
 
 
 
 | 2274 | #endif // C++11 | 
 
 
 
 
 | 2275 | _GLIBCXX_END_NAMESPACE_VERSION | 
 
 
 
 
 | 2276 | } | 
 
 
 
 
 | 2277 |  | 
 
 
 
 
 | 2278 | #endif // _GLIBCXX_TR1_FUNCTIONAL |