Home | History | Annotate | Download | only in include
      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 #include <new>
     19 
     20 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
     21 #pragma GCC system_header
     22 #endif
     23 
     24 _LIBCPP_BEGIN_NAMESPACE_STD
     25 
     26 template <class _Arg, class _Result>
     27 struct _LIBCPP_TYPE_VIS_ONLY unary_function
     28 {
     29     typedef _Arg    argument_type;
     30     typedef _Result result_type;
     31 };
     32 
     33 template <class _Arg1, class _Arg2, class _Result>
     34 struct _LIBCPP_TYPE_VIS_ONLY binary_function
     35 {
     36     typedef _Arg1   first_argument_type;
     37     typedef _Arg2   second_argument_type;
     38     typedef _Result result_type;
     39 };
     40 
     41 template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
     42 
     43 template <class _Tp>
     44 struct __has_result_type
     45 {
     46 private:
     47     struct __two {char __lx; char __lxx;};
     48     template <class _Up> static __two __test(...);
     49     template <class _Up> static char __test(typename _Up::result_type* = 0);
     50 public:
     51     static const bool value = sizeof(__test<_Tp>(0)) == 1;
     52 };
     53 
     54 #if _LIBCPP_STD_VER > 11
     55 template <class _Tp = void>
     56 #else
     57 template <class _Tp>
     58 #endif
     59 struct _LIBCPP_TYPE_VIS_ONLY less : binary_function<_Tp, _Tp, bool>
     60 {
     61     _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 
     62     bool operator()(const _Tp& __x, const _Tp& __y) const
     63         {return __x < __y;}
     64 };
     65 
     66 #if _LIBCPP_STD_VER > 11
     67 template <>
     68 struct _LIBCPP_TYPE_VIS_ONLY less<void>
     69 {
     70     template <class _T1, class _T2> 
     71     _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
     72     auto operator()(_T1&& __t, _T2&& __u) const
     73     _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)))
     74     -> decltype        (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))
     75         { return        _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); }
     76     typedef void is_transparent;
     77 };
     78 #endif
     79 
     80 // addressof
     81 
     82 template <class _Tp>
     83 inline _LIBCPP_INLINE_VISIBILITY
     84 _Tp*
     85 addressof(_Tp& __x) _NOEXCEPT
     86 {
     87     return (_Tp*)&reinterpret_cast<const volatile char&>(__x);
     88 }
     89 
     90 #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
     91 // Objective-C++ Automatic Reference Counting uses qualified pointers
     92 // that require special addressof() signatures. When
     93 // _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
     94 // itself is providing these definitions. Otherwise, we provide them.
     95 template <class _Tp>
     96 inline _LIBCPP_INLINE_VISIBILITY
     97 __strong _Tp*
     98 addressof(__strong _Tp& __x) _NOEXCEPT
     99 {
    100   return &__x;
    101 }
    102 
    103 #ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
    104 template <class _Tp>
    105 inline _LIBCPP_INLINE_VISIBILITY
    106 __weak _Tp*
    107 addressof(__weak _Tp& __x) _NOEXCEPT
    108 {
    109   return &__x;
    110 }
    111 #endif
    112 
    113 template <class _Tp>
    114 inline _LIBCPP_INLINE_VISIBILITY
    115 __autoreleasing _Tp*
    116 addressof(__autoreleasing _Tp& __x) _NOEXCEPT
    117 {
    118   return &__x;
    119 }
    120 
    121 template <class _Tp>
    122 inline _LIBCPP_INLINE_VISIBILITY
    123 __unsafe_unretained _Tp*
    124 addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
    125 {
    126   return &__x;
    127 }
    128 #endif
    129 
    130 
    131 // __weak_result_type
    132 
    133 template <class _Tp>
    134 struct __derives_from_unary_function
    135 {
    136 private:
    137     struct __two {char __lx; char __lxx;};
    138     static __two __test(...);
    139     template <class _Ap, class _Rp>
    140         static unary_function<_Ap, _Rp>
    141         __test(const volatile unary_function<_Ap, _Rp>*);
    142 public:
    143     static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
    144     typedef decltype(__test((_Tp*)0)) type;
    145 };
    146 
    147 template <class _Tp>
    148 struct __derives_from_binary_function
    149 {
    150 private:
    151     struct __two {char __lx; char __lxx;};
    152     static __two __test(...);
    153     template <class _A1, class _A2, class _Rp>
    154         static binary_function<_A1, _A2, _Rp>
    155         __test(const volatile binary_function<_A1, _A2, _Rp>*);
    156 public:
    157     static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
    158     typedef decltype(__test((_Tp*)0)) type;
    159 };
    160 
    161 template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
    162 struct __maybe_derive_from_unary_function  // bool is true
    163     : public __derives_from_unary_function<_Tp>::type
    164 {
    165 };
    166 
    167 template <class _Tp>
    168 struct __maybe_derive_from_unary_function<_Tp, false>
    169 {
    170 };
    171 
    172 template <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
    173 struct __maybe_derive_from_binary_function  // bool is true
    174     : public __derives_from_binary_function<_Tp>::type
    175 {
    176 };
    177 
    178 template <class _Tp>
    179 struct __maybe_derive_from_binary_function<_Tp, false>
    180 {
    181 };
    182 
    183 template <class _Tp, bool = __has_result_type<_Tp>::value>
    184 struct __weak_result_type_imp // bool is true
    185     : public __maybe_derive_from_unary_function<_Tp>,
    186       public __maybe_derive_from_binary_function<_Tp>
    187 {
    188     typedef typename _Tp::result_type result_type;
    189 };
    190 
    191 template <class _Tp>
    192 struct __weak_result_type_imp<_Tp, false>
    193     : public __maybe_derive_from_unary_function<_Tp>,
    194       public __maybe_derive_from_binary_function<_Tp>
    195 {
    196 };
    197 
    198 template <class _Tp>
    199 struct __weak_result_type
    200     : public __weak_result_type_imp<_Tp>
    201 {
    202 };
    203 
    204 // 0 argument case
    205 
    206 template <class _Rp>
    207 struct __weak_result_type<_Rp ()>
    208 {
    209     typedef _Rp result_type;
    210 };
    211 
    212 template <class _Rp>
    213 struct __weak_result_type<_Rp (&)()>
    214 {
    215     typedef _Rp result_type;
    216 };
    217 
    218 template <class _Rp>
    219 struct __weak_result_type<_Rp (*)()>
    220 {
    221     typedef _Rp result_type;
    222 };
    223 
    224 // 1 argument case
    225 
    226 template <class _Rp, class _A1>
    227 struct __weak_result_type<_Rp (_A1)>
    228     : public unary_function<_A1, _Rp>
    229 {
    230 };
    231 
    232 template <class _Rp, class _A1>
    233 struct __weak_result_type<_Rp (&)(_A1)>
    234     : public unary_function<_A1, _Rp>
    235 {
    236 };
    237 
    238 template <class _Rp, class _A1>
    239 struct __weak_result_type<_Rp (*)(_A1)>
    240     : public unary_function<_A1, _Rp>
    241 {
    242 };
    243 
    244 template <class _Rp, class _Cp>
    245 struct __weak_result_type<_Rp (_Cp::*)()>
    246     : public unary_function<_Cp*, _Rp>
    247 {
    248 };
    249 
    250 template <class _Rp, class _Cp>
    251 struct __weak_result_type<_Rp (_Cp::*)() const>
    252     : public unary_function<const _Cp*, _Rp>
    253 {
    254 };
    255 
    256 template <class _Rp, class _Cp>
    257 struct __weak_result_type<_Rp (_Cp::*)() volatile>
    258     : public unary_function<volatile _Cp*, _Rp>
    259 {
    260 };
    261 
    262 template <class _Rp, class _Cp>
    263 struct __weak_result_type<_Rp (_Cp::*)() const volatile>
    264     : public unary_function<const volatile _Cp*, _Rp>
    265 {
    266 };
    267 
    268 // 2 argument case
    269 
    270 template <class _Rp, class _A1, class _A2>
    271 struct __weak_result_type<_Rp (_A1, _A2)>
    272     : public binary_function<_A1, _A2, _Rp>
    273 {
    274 };
    275 
    276 template <class _Rp, class _A1, class _A2>
    277 struct __weak_result_type<_Rp (*)(_A1, _A2)>
    278     : public binary_function<_A1, _A2, _Rp>
    279 {
    280 };
    281 
    282 template <class _Rp, class _A1, class _A2>
    283 struct __weak_result_type<_Rp (&)(_A1, _A2)>
    284     : public binary_function<_A1, _A2, _Rp>
    285 {
    286 };
    287 
    288 template <class _Rp, class _Cp, class _A1>
    289 struct __weak_result_type<_Rp (_Cp::*)(_A1)>
    290     : public binary_function<_Cp*, _A1, _Rp>
    291 {
    292 };
    293 
    294 template <class _Rp, class _Cp, class _A1>
    295 struct __weak_result_type<_Rp (_Cp::*)(_A1) const>
    296     : public binary_function<const _Cp*, _A1, _Rp>
    297 {
    298 };
    299 
    300 template <class _Rp, class _Cp, class _A1>
    301 struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
    302     : public binary_function<volatile _Cp*, _A1, _Rp>
    303 {
    304 };
    305 
    306 template <class _Rp, class _Cp, class _A1>
    307 struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
    308     : public binary_function<const volatile _Cp*, _A1, _Rp>
    309 {
    310 };
    311 
    312 
    313 #ifndef _LIBCPP_HAS_NO_VARIADICS
    314 // 3 or more arguments
    315 
    316 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
    317 struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)>
    318 {
    319     typedef _Rp result_type;
    320 };
    321 
    322 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
    323 struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)>
    324 {
    325     typedef _Rp result_type;
    326 };
    327 
    328 template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
    329 struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)>
    330 {
    331     typedef _Rp result_type;
    332 };
    333 
    334 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
    335 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)>
    336 {
    337     typedef _Rp result_type;
    338 };
    339 
    340 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
    341 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const>
    342 {
    343     typedef _Rp result_type;
    344 };
    345 
    346 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
    347 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile>
    348 {
    349     typedef _Rp result_type;
    350 };
    351 
    352 template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
    353 struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
    354 {
    355     typedef _Rp result_type;
    356 };
    357 
    358 #endif // _LIBCPP_HAS_NO_VARIADICS
    359 
    360 // __invoke
    361 
    362 #ifndef _LIBCPP_HAS_NO_VARIADICS
    363 
    364 // bullets 1 and 2
    365 
    366 template <class _Fp, class _A0, class ..._Args,
    367             class>
    368 inline _LIBCPP_INLINE_VISIBILITY
    369 auto
    370 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
    371     -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
    372 {
    373     return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...);
    374 }
    375 
    376 template <class _Fp, class _A0, class ..._Args,
    377             class>
    378 inline _LIBCPP_INLINE_VISIBILITY
    379 auto
    380 __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
    381     -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
    382 {
    383     return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...);
    384 }
    385 
    386 // bullets 3 and 4
    387 
    388 template <class _Fp, class _A0,
    389             class>
    390 inline _LIBCPP_INLINE_VISIBILITY
    391 auto
    392 __invoke(_Fp&& __f, _A0&& __a0)
    393     -> decltype(_VSTD::forward<_A0>(__a0).*__f)
    394 {
    395     return _VSTD::forward<_A0>(__a0).*__f;
    396 }
    397 
    398 template <class _Fp, class _A0,
    399             class>
    400 inline _LIBCPP_INLINE_VISIBILITY
    401 auto
    402 __invoke(_Fp&& __f, _A0&& __a0)
    403     -> decltype((*_VSTD::forward<_A0>(__a0)).*__f)
    404 {
    405     return (*_VSTD::forward<_A0>(__a0)).*__f;
    406 }
    407 
    408 // bullet 5
    409 
    410 template <class _Fp, class ..._Args>
    411 inline _LIBCPP_INLINE_VISIBILITY
    412 auto
    413 __invoke(_Fp&& __f, _Args&& ...__args)
    414     -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
    415 {
    416     return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...);
    417 }
    418 template <class _Tp, class ..._Args>
    419 struct __invoke_return
    420 {
    421     typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
    422 };
    423 
    424 #else // _LIBCPP_HAS_NO_VARIADICS
    425 
    426 #include <__functional_base_03>
    427 
    428 #endif  // _LIBCPP_HAS_NO_VARIADICS
    429 
    430 
    431 template <class _Ret>
    432 struct __invoke_void_return_wrapper
    433 {
    434 #ifndef _LIBCPP_HAS_NO_VARIADICS
    435     template <class ..._Args>
    436     static _Ret __call(_Args&&... __args) {
    437         return __invoke(_VSTD::forward<_Args>(__args)...);
    438     }
    439 #else
    440     template <class _Fn>
    441     static _Ret __call(_Fn __f) {
    442         return __invoke(__f);
    443     }
    444 
    445     template <class _Fn, class _A0>
    446     static _Ret __call(_Fn __f, _A0& __a0) {
    447         return __invoke(__f, __a0);
    448     }
    449 
    450     template <class _Fn, class _A0, class _A1>
    451     static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) {
    452         return __invoke(__f, __a0, __a1);
    453     }
    454 
    455     template <class _Fn, class _A0, class _A1, class _A2>
    456     static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){
    457         return __invoke(__f, __a0, __a1, __a2);
    458     }
    459 #endif
    460 };
    461 
    462 template <>
    463 struct __invoke_void_return_wrapper<void>
    464 {
    465 #ifndef _LIBCPP_HAS_NO_VARIADICS
    466     template <class ..._Args>
    467     static void __call(_Args&&... __args) {
    468         __invoke(_VSTD::forward<_Args>(__args)...);
    469     }
    470 #else
    471     template <class _Fn>
    472     static void __call(_Fn __f) {
    473         __invoke(__f);
    474     }
    475 
    476     template <class _Fn, class _A0>
    477     static void __call(_Fn __f, _A0& __a0) {
    478         __invoke(__f, __a0);
    479     }
    480 
    481     template <class _Fn, class _A0, class _A1>
    482     static void __call(_Fn __f, _A0& __a0, _A1& __a1) {
    483         __invoke(__f, __a0, __a1);
    484     }
    485 
    486     template <class _Fn, class _A0, class _A1, class _A2>
    487     static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) {
    488         __invoke(__f, __a0, __a1, __a2);
    489     }
    490 #endif
    491 };
    492 
    493 template <class _Tp>
    494 class _LIBCPP_TYPE_VIS_ONLY reference_wrapper
    495     : public __weak_result_type<_Tp>
    496 {
    497 public:
    498     // types
    499     typedef _Tp type;
    500 private:
    501     type* __f_;
    502 
    503 public:
    504     // construct/copy/destroy
    505     _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
    506         : __f_(_VSTD::addressof(__f)) {}
    507 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    508     private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
    509 #endif
    510 
    511     // access
    512     _LIBCPP_INLINE_VISIBILITY operator type&    () const _NOEXCEPT {return *__f_;}
    513     _LIBCPP_INLINE_VISIBILITY          type& get() const _NOEXCEPT {return *__f_;}
    514 
    515 #ifndef _LIBCPP_HAS_NO_VARIADICS
    516     // invoke
    517     template <class... _ArgTypes>
    518        _LIBCPP_INLINE_VISIBILITY
    519        typename __invoke_of<type&, _ArgTypes...>::type
    520           operator() (_ArgTypes&&... __args) const
    521           {
    522               return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
    523           }
    524 #else
    525 
    526     _LIBCPP_INLINE_VISIBILITY
    527     typename __invoke_return<type>::type
    528        operator() () const
    529        {
    530            return __invoke(get());
    531        }
    532 
    533     template <class _A0>
    534        _LIBCPP_INLINE_VISIBILITY
    535        typename __invoke_return0<type&, _A0>::type
    536           operator() (_A0& __a0) const
    537           {
    538               return __invoke<type&, _A0>(get(), __a0);
    539           }
    540 
    541     template <class _A0, class _A1>
    542        _LIBCPP_INLINE_VISIBILITY
    543        typename __invoke_return1<type&, _A0, _A1>::type
    544           operator() (_A0& __a0, _A1& __a1) const
    545           {
    546               return __invoke<type&, _A0, _A1>(get(), __a0, __a1);
    547           }
    548 
    549     template <class _A0, class _A1, class _A2>
    550        _LIBCPP_INLINE_VISIBILITY
    551        typename __invoke_return2<type&, _A0, _A1, _A2>::type
    552           operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
    553           {
    554               return __invoke<type&, _A0, _A1, _A2>(get(), __a0, __a1, __a2);
    555           }
    556 #endif // _LIBCPP_HAS_NO_VARIADICS
    557 };
    558 
    559 template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
    560 template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {};
    561 template <class _Tp> struct __is_reference_wrapper
    562     : public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {};
    563 
    564 template <class _Tp>
    565 inline _LIBCPP_INLINE_VISIBILITY
    566 reference_wrapper<_Tp>
    567 ref(_Tp& __t) _NOEXCEPT
    568 {
    569     return reference_wrapper<_Tp>(__t);
    570 }
    571 
    572 template <class _Tp>
    573 inline _LIBCPP_INLINE_VISIBILITY
    574 reference_wrapper<_Tp>
    575 ref(reference_wrapper<_Tp> __t) _NOEXCEPT
    576 {
    577     return ref(__t.get());
    578 }
    579 
    580 template <class _Tp>
    581 inline _LIBCPP_INLINE_VISIBILITY
    582 reference_wrapper<const _Tp>
    583 cref(const _Tp& __t) _NOEXCEPT
    584 {
    585     return reference_wrapper<const _Tp>(__t);
    586 }
    587 
    588 template <class _Tp>
    589 inline _LIBCPP_INLINE_VISIBILITY
    590 reference_wrapper<const _Tp>
    591 cref(reference_wrapper<_Tp> __t) _NOEXCEPT
    592 {
    593     return cref(__t.get());
    594 }
    595 
    596 #ifndef _LIBCPP_HAS_NO_VARIADICS
    597 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    598 #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
    599 
    600 template <class _Tp> void ref(const _Tp&&) = delete;
    601 template <class _Tp> void cref(const _Tp&&) = delete;
    602 
    603 #else  // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
    604 
    605 template <class _Tp> void ref(const _Tp&&);// = delete;
    606 template <class _Tp> void cref(const _Tp&&);// = delete;
    607 
    608 #endif  // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
    609 
    610 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    611 
    612 #endif  // _LIBCPP_HAS_NO_VARIADICS
    613 
    614 #if _LIBCPP_STD_VER > 11
    615 template <class _Tp1, class _Tp2 = void>
    616 struct __is_transparent
    617 {
    618 private:
    619     struct __two {char __lx; char __lxx;};
    620     template <class _Up> static __two __test(...);
    621     template <class _Up> static char __test(typename _Up::is_transparent* = 0);
    622 public:
    623     static const bool value = sizeof(__test<_Tp1>(0)) == 1;
    624 };
    625 #endif
    626 
    627 // allocator_arg_t
    628 
    629 struct _LIBCPP_TYPE_VIS_ONLY allocator_arg_t { };
    630 
    631 #if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MEMORY)
    632 extern const allocator_arg_t allocator_arg;
    633 #else
    634 constexpr allocator_arg_t allocator_arg = allocator_arg_t();
    635 #endif
    636 
    637 // uses_allocator
    638 
    639 template <class _Tp>
    640 struct __has_allocator_type
    641 {
    642 private:
    643     struct __two {char __lx; char __lxx;};
    644     template <class _Up> static __two __test(...);
    645     template <class _Up> static char __test(typename _Up::allocator_type* = 0);
    646 public:
    647     static const bool value = sizeof(__test<_Tp>(0)) == 1;
    648 };
    649 
    650 template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
    651 struct __uses_allocator
    652     : public integral_constant<bool,
    653         is_convertible<_Alloc, typename _Tp::allocator_type>::value>
    654 {
    655 };
    656 
    657 template <class _Tp, class _Alloc>
    658 struct __uses_allocator<_Tp, _Alloc, false>
    659     : public false_type
    660 {
    661 };
    662 
    663 template <class _Tp, class _Alloc>
    664 struct _LIBCPP_TYPE_VIS_ONLY uses_allocator
    665     : public __uses_allocator<_Tp, _Alloc>
    666 {
    667 };
    668 
    669 #ifndef _LIBCPP_HAS_NO_VARIADICS
    670 
    671 // allocator construction
    672 
    673 template <class _Tp, class _Alloc, class ..._Args>
    674 struct __uses_alloc_ctor_imp
    675 {
    676     static const bool __ua = uses_allocator<_Tp, _Alloc>::value;
    677     static const bool __ic =
    678         is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
    679     static const int value = __ua ? 2 - __ic : 0;
    680 };
    681 
    682 template <class _Tp, class _Alloc, class ..._Args>
    683 struct __uses_alloc_ctor
    684     : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
    685     {};
    686 
    687 template <class _Tp, class _Allocator, class... _Args>
    688 inline _LIBCPP_INLINE_VISIBILITY
    689 void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
    690 {
    691     new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
    692 }
    693 
    694 template <class _Tp, class _Allocator, class... _Args>
    695 inline _LIBCPP_INLINE_VISIBILITY
    696 void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
    697 {
    698     new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
    699 }
    700 
    701 template <class _Tp, class _Allocator, class... _Args>
    702 inline _LIBCPP_INLINE_VISIBILITY
    703 void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
    704 {
    705     new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
    706 }
    707 
    708 template <class _Tp, class _Allocator, class... _Args>
    709 inline _LIBCPP_INLINE_VISIBILITY
    710 void __user_alloc_construct (_Tp *__storage, const _Allocator &__a, _Args &&... __args)
    711 { 
    712     __user_alloc_construct_impl( 
    713              __uses_alloc_ctor<_Tp, _Allocator>(), 
    714              __storage, __a, _VSTD::forward<_Args>(__args)...
    715         );
    716 }
    717 #endif  // _LIBCPP_HAS_NO_VARIADICS
    718 
    719 _LIBCPP_END_NAMESPACE_STD
    720 
    721 #endif  // _LIBCPP_FUNCTIONAL_BASE
    722