1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_FUNCTIONAL_BASE 12 #define _LIBCPP_FUNCTIONAL_BASE 13 14 #include <__config> 15 #include <type_traits> 16 #include <typeinfo> 17 #include <exception> 18 19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 20 #pragma GCC system_header 21 #endif 22 23 _LIBCPP_BEGIN_NAMESPACE_STD 24 25 template <class _Arg, class _Result> 26 struct _LIBCPP_TYPE_VIS unary_function 27 { 28 typedef _Arg argument_type; 29 typedef _Result result_type; 30 }; 31 32 template <class _Arg1, class _Arg2, class _Result> 33 struct _LIBCPP_TYPE_VIS binary_function 34 { 35 typedef _Arg1 first_argument_type; 36 typedef _Arg2 second_argument_type; 37 typedef _Result result_type; 38 }; 39 40 template <class _Tp> struct _LIBCPP_TYPE_VIS hash; 41 42 template <class _Tp> 43 struct __has_result_type 44 { 45 private: 46 struct __two {char __lx; char __lxx;}; 47 template <class _Up> static __two __test(...); 48 template <class _Up> static char __test(typename _Up::result_type* = 0); 49 public: 50 static const bool value = sizeof(__test<_Tp>(0)) == 1; 51 }; 52 53 template <class _Tp> 54 struct _LIBCPP_TYPE_VIS less : binary_function<_Tp, _Tp, bool> 55 { 56 _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const 57 {return __x < __y;} 58 }; 59 60 #ifdef _LIBCPP_HAS_NO_VARIADICS 61 62 #include <__functional_base_03> 63 64 #else // _LIBCPP_HAS_NO_VARIADICS 65 66 // __weak_result_type 67 68 template <class _Tp> 69 struct __derives_from_unary_function 70 { 71 private: 72 struct __two {char __lx; char __lxx;}; 73 static __two __test(...); 74 template <class _Ap, class _Rp> 75 static unary_function<_Ap, _Rp> 76 __test(const volatile unary_function<_Ap, _Rp>*); 77 public: 78 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 79 typedef decltype(__test((_Tp*)0)) type; 80 }; 81 82 template <class _Tp> 83 struct __derives_from_binary_function 84 { 85 private: 86 struct __two {char __lx; char __lxx;}; 87 static __two __test(...); 88 template <class _A1, class _A2, class _Rp> 89 static binary_function<_A1, _A2, _Rp> 90 __test(const volatile binary_function<_A1, _A2, _Rp>*); 91 public: 92 static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; 93 typedef decltype(__test((_Tp*)0)) type; 94 }; 95 96 template <class _Tp, bool = __derives_from_unary_function<_Tp>::value> 97 struct __maybe_derive_from_unary_function // bool is true 98 : public __derives_from_unary_function<_Tp>::type 99 { 100 }; 101 102 template <class _Tp> 103 struct __maybe_derive_from_unary_function<_Tp, false> 104 { 105 }; 106 107 template <class _Tp, bool = __derives_from_binary_function<_Tp>::value> 108 struct __maybe_derive_from_binary_function // bool is true 109 : public __derives_from_binary_function<_Tp>::type 110 { 111 }; 112 113 template <class _Tp> 114 struct __maybe_derive_from_binary_function<_Tp, false> 115 { 116 }; 117 118 template <class _Tp, bool = __has_result_type<_Tp>::value> 119 struct __weak_result_type_imp // bool is true 120 : public __maybe_derive_from_unary_function<_Tp>, 121 public __maybe_derive_from_binary_function<_Tp> 122 { 123 typedef typename _Tp::result_type result_type; 124 }; 125 126 template <class _Tp> 127 struct __weak_result_type_imp<_Tp, false> 128 : public __maybe_derive_from_unary_function<_Tp>, 129 public __maybe_derive_from_binary_function<_Tp> 130 { 131 }; 132 133 template <class _Tp> 134 struct __weak_result_type 135 : public __weak_result_type_imp<_Tp> 136 { 137 }; 138 139 // 0 argument case 140 141 template <class _Rp> 142 struct __weak_result_type<_Rp ()> 143 { 144 typedef _Rp result_type; 145 }; 146 147 template <class _Rp> 148 struct __weak_result_type<_Rp (&)()> 149 { 150 typedef _Rp result_type; 151 }; 152 153 template <class _Rp> 154 struct __weak_result_type<_Rp (*)()> 155 { 156 typedef _Rp result_type; 157 }; 158 159 // 1 argument case 160 161 template <class _Rp, class _A1> 162 struct __weak_result_type<_Rp (_A1)> 163 : public unary_function<_A1, _Rp> 164 { 165 }; 166 167 template <class _Rp, class _A1> 168 struct __weak_result_type<_Rp (&)(_A1)> 169 : public unary_function<_A1, _Rp> 170 { 171 }; 172 173 template <class _Rp, class _A1> 174 struct __weak_result_type<_Rp (*)(_A1)> 175 : public unary_function<_A1, _Rp> 176 { 177 }; 178 179 template <class _Rp, class _Cp> 180 struct __weak_result_type<_Rp (_Cp::*)()> 181 : public unary_function<_Cp*, _Rp> 182 { 183 }; 184 185 template <class _Rp, class _Cp> 186 struct __weak_result_type<_Rp (_Cp::*)() const> 187 : public unary_function<const _Cp*, _Rp> 188 { 189 }; 190 191 template <class _Rp, class _Cp> 192 struct __weak_result_type<_Rp (_Cp::*)() volatile> 193 : public unary_function<volatile _Cp*, _Rp> 194 { 195 }; 196 197 template <class _Rp, class _Cp> 198 struct __weak_result_type<_Rp (_Cp::*)() const volatile> 199 : public unary_function<const volatile _Cp*, _Rp> 200 { 201 }; 202 203 // 2 argument case 204 205 template <class _Rp, class _A1, class _A2> 206 struct __weak_result_type<_Rp (_A1, _A2)> 207 : public binary_function<_A1, _A2, _Rp> 208 { 209 }; 210 211 template <class _Rp, class _A1, class _A2> 212 struct __weak_result_type<_Rp (*)(_A1, _A2)> 213 : public binary_function<_A1, _A2, _Rp> 214 { 215 }; 216 217 template <class _Rp, class _A1, class _A2> 218 struct __weak_result_type<_Rp (&)(_A1, _A2)> 219 : public binary_function<_A1, _A2, _Rp> 220 { 221 }; 222 223 template <class _Rp, class _Cp, class _A1> 224 struct __weak_result_type<_Rp (_Cp::*)(_A1)> 225 : public binary_function<_Cp*, _A1, _Rp> 226 { 227 }; 228 229 template <class _Rp, class _Cp, class _A1> 230 struct __weak_result_type<_Rp (_Cp::*)(_A1) const> 231 : public binary_function<const _Cp*, _A1, _Rp> 232 { 233 }; 234 235 template <class _Rp, class _Cp, class _A1> 236 struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> 237 : public binary_function<volatile _Cp*, _A1, _Rp> 238 { 239 }; 240 241 template <class _Rp, class _Cp, class _A1> 242 struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> 243 : public binary_function<const volatile _Cp*, _A1, _Rp> 244 { 245 }; 246 247 // 3 or more arguments 248 249 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 250 struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> 251 { 252 typedef _Rp result_type; 253 }; 254 255 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 256 struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> 257 { 258 typedef _Rp result_type; 259 }; 260 261 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> 262 struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> 263 { 264 typedef _Rp result_type; 265 }; 266 267 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 268 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> 269 { 270 typedef _Rp result_type; 271 }; 272 273 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 274 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> 275 { 276 typedef _Rp result_type; 277 }; 278 279 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 280 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> 281 { 282 typedef _Rp result_type; 283 }; 284 285 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> 286 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> 287 { 288 typedef _Rp result_type; 289 }; 290 291 // __invoke 292 293 // bullets 1 and 2 294 295 template <class _Fp, class _A0, class ..._Args, 296 class> 297 inline _LIBCPP_INLINE_VISIBILITY 298 auto 299 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 300 -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)) 301 { 302 return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...); 303 } 304 305 template <class _Fp, class _A0, class ..._Args, 306 class> 307 inline _LIBCPP_INLINE_VISIBILITY 308 auto 309 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) 310 -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)) 311 { 312 return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...); 313 } 314 315 // bullets 3 and 4 316 317 template <class _Fp, class _A0, 318 class> 319 inline _LIBCPP_INLINE_VISIBILITY 320 auto 321 __invoke(_Fp&& __f, _A0&& __a0) 322 -> decltype(_VSTD::forward<_A0>(__a0).*__f) 323 { 324 return _VSTD::forward<_A0>(__a0).*__f; 325 } 326 327 template <class _Fp, class _A0, 328 class> 329 inline _LIBCPP_INLINE_VISIBILITY 330 auto 331 __invoke(_Fp&& __f, _A0&& __a0) 332 -> decltype((*_VSTD::forward<_A0>(__a0)).*__f) 333 { 334 return (*_VSTD::forward<_A0>(__a0)).*__f; 335 } 336 337 // bullet 5 338 339 template <class _Fp, class ..._Args> 340 inline _LIBCPP_INLINE_VISIBILITY 341 auto 342 __invoke(_Fp&& __f, _Args&& ...__args) 343 -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)) 344 { 345 return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...); 346 } 347 348 template <class _Tp, class ..._Args> 349 struct __invoke_return 350 { 351 typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type; 352 }; 353 354 template <class _Tp> 355 class _LIBCPP_TYPE_VIS reference_wrapper 356 : public __weak_result_type<_Tp> 357 { 358 public: 359 // types 360 typedef _Tp type; 361 private: 362 type* __f_; 363 364 public: 365 // construct/copy/destroy 366 _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT : __f_(&__f) {} 367 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 368 private: reference_wrapper(type&&); public: // = delete; // do not bind to temps 369 #endif 370 371 // access 372 _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;} 373 _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;} 374 375 // invoke 376 template <class... _ArgTypes> 377 _LIBCPP_INLINE_VISIBILITY 378 typename __invoke_of<type&, _ArgTypes...>::type 379 operator() (_ArgTypes&&... __args) const 380 { 381 return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...); 382 } 383 }; 384 385 template <class _Tp> struct ____is_reference_wrapper : public false_type {}; 386 template <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {}; 387 template <class _Tp> struct __is_reference_wrapper 388 : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {}; 389 390 template <class _Tp> 391 inline _LIBCPP_INLINE_VISIBILITY 392 reference_wrapper<_Tp> 393 ref(_Tp& __t) _NOEXCEPT 394 { 395 return reference_wrapper<_Tp>(__t); 396 } 397 398 template <class _Tp> 399 inline _LIBCPP_INLINE_VISIBILITY 400 reference_wrapper<_Tp> 401 ref(reference_wrapper<_Tp> __t) _NOEXCEPT 402 { 403 return ref(__t.get()); 404 } 405 406 template <class _Tp> 407 inline _LIBCPP_INLINE_VISIBILITY 408 reference_wrapper<const _Tp> 409 cref(const _Tp& __t) _NOEXCEPT 410 { 411 return reference_wrapper<const _Tp>(__t); 412 } 413 414 template <class _Tp> 415 inline _LIBCPP_INLINE_VISIBILITY 416 reference_wrapper<const _Tp> 417 cref(reference_wrapper<_Tp> __t) _NOEXCEPT 418 { 419 return cref(__t.get()); 420 } 421 422 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 423 #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS 424 425 template <class _Tp> void ref(const _Tp&&) = delete; 426 template <class _Tp> void cref(const _Tp&&) = delete; 427 428 #else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS 429 430 template <class _Tp> void ref(const _Tp&&);// = delete; 431 template <class _Tp> void cref(const _Tp&&);// = delete; 432 433 #endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS 434 435 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 436 437 #endif // _LIBCPP_HAS_NO_VARIADICS 438 439 _LIBCPP_END_NAMESPACE_STD 440 441 #endif // _LIBCPP_FUNCTIONAL_BASE 442