Home | History | Annotate | Download | only in include
      1 // C++11 <type_traits> -*- C++ -*-
      2 
      3 // Copyright (C) 2007-2014 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 include/type_traits
     26  *  This is a Standard C++ Library header.
     27  */
     28 
     29 #ifndef _GLIBCXX_TYPE_TRAITS
     30 #define _GLIBCXX_TYPE_TRAITS 1
     31 
     32 #pragma GCC system_header
     33 
     34 #if __cplusplus < 201103L
     35 # include <bits/c++0x_warning.h>
     36 #else
     37 
     38 #include <bits/c++config.h>
     39 
     40 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
     41 # if defined (__UINT_LEAST16_TYPE__) && defined(__UINT_LEAST32_TYPE__)
     42 namespace std
     43 {
     44   typedef __UINT_LEAST16_TYPE__ uint_least16_t;
     45   typedef __UINT_LEAST32_TYPE__ uint_least32_t;
     46 }
     47 # else
     48 #  include <cstdint>
     49 # endif
     50 #endif
     51 
     52 namespace std _GLIBCXX_VISIBILITY(default)
     53 {
     54 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     55 
     56   /**
     57    * @defgroup metaprogramming Metaprogramming
     58    * @ingroup utilities
     59    *
     60    * Template utilities for compile-time introspection and modification,
     61    * including type classification traits, type property inspection traits
     62    * and type transformation traits.
     63    *
     64    * @{
     65    */
     66 
     67   /// integral_constant
     68   template<typename _Tp, _Tp __v>
     69     struct integral_constant
     70     {
     71       static constexpr _Tp                  value = __v;
     72       typedef _Tp                           value_type;
     73       typedef integral_constant<_Tp, __v>   type;
     74       constexpr operator value_type() const { return value; }
     75 #if __cplusplus > 201103L
     76 
     77 #define __cpp_lib_integral_constant_callable 201304
     78 
     79       constexpr value_type operator()() const { return value; }
     80 #endif
     81     };
     82   
     83   template<typename _Tp, _Tp __v>
     84     constexpr _Tp integral_constant<_Tp, __v>::value;
     85 
     86   /// The type used as a compile-time boolean with true value.
     87   typedef integral_constant<bool, true>     true_type;
     88 
     89   /// The type used as a compile-time boolean with false value.
     90   typedef integral_constant<bool, false>    false_type;
     91 
     92   // Meta programming helper types.
     93 
     94   template<bool, typename, typename>
     95     struct conditional;
     96 
     97   template<typename...>
     98     struct __or_;
     99 
    100   template<>
    101     struct __or_<>
    102     : public false_type
    103     { };
    104 
    105   template<typename _B1>
    106     struct __or_<_B1>
    107     : public _B1
    108     { };
    109 
    110   template<typename _B1, typename _B2>
    111     struct __or_<_B1, _B2>
    112     : public conditional<_B1::value, _B1, _B2>::type
    113     { };
    114 
    115   template<typename _B1, typename _B2, typename _B3, typename... _Bn>
    116     struct __or_<_B1, _B2, _B3, _Bn...>
    117     : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
    118     { };
    119 
    120   template<typename...>
    121     struct __and_;
    122 
    123   template<>
    124     struct __and_<>
    125     : public true_type
    126     { };
    127 
    128   template<typename _B1>
    129     struct __and_<_B1>
    130     : public _B1
    131     { };
    132 
    133   template<typename _B1, typename _B2>
    134     struct __and_<_B1, _B2>
    135     : public conditional<_B1::value, _B2, _B1>::type
    136     { };
    137 
    138   template<typename _B1, typename _B2, typename _B3, typename... _Bn>
    139     struct __and_<_B1, _B2, _B3, _Bn...>
    140     : public conditional<_B1::value, __and_<_B2, _B3, _Bn...>, _B1>::type
    141     { };
    142 
    143   template<typename _Pp>
    144     struct __not_
    145     : public integral_constant<bool, !_Pp::value>
    146     { };
    147 
    148   // For several sfinae-friendly trait implementations we transport both the
    149   // result information (as the member type) and the failure information (no
    150   // member type). This is very similar to std::enable_if, but we cannot use
    151   // them, because we need to derive from them as an implementation detail.
    152 
    153   template<typename _Tp>
    154     struct __success_type
    155     { typedef _Tp type; };
    156 
    157   struct __failure_type
    158   { };
    159 
    160   // Primary type categories.
    161 
    162   template<typename>
    163     struct remove_cv;
    164 
    165   template<typename>
    166     struct __is_void_helper
    167     : public false_type { };
    168 
    169   template<>
    170     struct __is_void_helper<void>
    171     : public true_type { };
    172 
    173   /// is_void
    174   template<typename _Tp>
    175     struct is_void
    176     : public __is_void_helper<typename remove_cv<_Tp>::type>::type
    177     { };
    178 
    179   template<typename>
    180     struct __is_integral_helper
    181     : public false_type { };
    182 
    183   template<>
    184     struct __is_integral_helper<bool>
    185     : public true_type { };
    186   
    187   template<>
    188     struct __is_integral_helper<char>
    189     : public true_type { };
    190 
    191   template<>
    192     struct __is_integral_helper<signed char>
    193     : public true_type { };
    194 
    195   template<>
    196     struct __is_integral_helper<unsigned char>
    197     : public true_type { };
    198 
    199 #ifdef _GLIBCXX_USE_WCHAR_T
    200   template<>
    201     struct __is_integral_helper<wchar_t>
    202     : public true_type { };
    203 #endif
    204 
    205   template<>
    206     struct __is_integral_helper<char16_t>
    207     : public true_type { };
    208 
    209   template<>
    210     struct __is_integral_helper<char32_t>
    211     : public true_type { };
    212 
    213   template<>
    214     struct __is_integral_helper<short>
    215     : public true_type { };
    216 
    217   template<>
    218     struct __is_integral_helper<unsigned short>
    219     : public true_type { };
    220 
    221   template<>
    222     struct __is_integral_helper<int>
    223     : public true_type { };
    224 
    225   template<>
    226     struct __is_integral_helper<unsigned int>
    227     : public true_type { };
    228 
    229   template<>
    230     struct __is_integral_helper<long>
    231     : public true_type { };
    232 
    233   template<>
    234     struct __is_integral_helper<unsigned long>
    235     : public true_type { };
    236 
    237   template<>
    238     struct __is_integral_helper<long long>
    239     : public true_type { };
    240 
    241   template<>
    242     struct __is_integral_helper<unsigned long long>
    243     : public true_type { };
    244 
    245 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
    246   template<>
    247     struct __is_integral_helper<__int128>
    248     : public true_type { };
    249 
    250   template<>
    251     struct __is_integral_helper<unsigned __int128>
    252     : public true_type { };
    253 #endif
    254 
    255   /// is_integral
    256   template<typename _Tp>
    257     struct is_integral
    258     : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
    259     { };
    260 
    261   template<typename>
    262     struct __is_floating_point_helper
    263     : public false_type { };
    264 
    265   template<>
    266     struct __is_floating_point_helper<float>
    267     : public true_type { };
    268 
    269   template<>
    270     struct __is_floating_point_helper<double>
    271     : public true_type { };
    272 
    273   template<>
    274     struct __is_floating_point_helper<long double>
    275     : public true_type { };
    276 
    277 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128) && (!defined (__ANDROID__) || !defined(__clang__) || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
    278   template<>
    279     struct __is_floating_point_helper<__float128>
    280     : public true_type { };
    281 #endif
    282 
    283   /// is_floating_point
    284   template<typename _Tp>
    285     struct is_floating_point
    286     : public __is_floating_point_helper<typename remove_cv<_Tp>::type>::type
    287     { };
    288 
    289   /// is_array
    290   template<typename>
    291     struct is_array
    292     : public false_type { };
    293 
    294   template<typename _Tp, std::size_t _Size>
    295     struct is_array<_Tp[_Size]>
    296     : public true_type { };
    297 
    298   template<typename _Tp>
    299     struct is_array<_Tp[]>
    300     : public true_type { };
    301 
    302   template<typename>
    303     struct __is_pointer_helper
    304     : public false_type { };
    305 
    306   template<typename _Tp>
    307     struct __is_pointer_helper<_Tp*>
    308     : public true_type { };
    309 
    310   /// is_pointer
    311   template<typename _Tp>
    312     struct is_pointer
    313     : public __is_pointer_helper<typename remove_cv<_Tp>::type>::type
    314     { };
    315 
    316   /// is_lvalue_reference
    317   template<typename>
    318     struct is_lvalue_reference
    319     : public false_type { };
    320 
    321   template<typename _Tp>
    322     struct is_lvalue_reference<_Tp&>
    323     : public true_type { };
    324 
    325   /// is_rvalue_reference
    326   template<typename>
    327     struct is_rvalue_reference
    328     : public false_type { };
    329 
    330   template<typename _Tp>
    331     struct is_rvalue_reference<_Tp&&>
    332     : public true_type { };
    333 
    334   template<typename>
    335     struct is_function;
    336 
    337   template<typename>
    338     struct __is_member_object_pointer_helper
    339     : public false_type { };
    340 
    341   template<typename _Tp, typename _Cp>
    342     struct __is_member_object_pointer_helper<_Tp _Cp::*>
    343     : public integral_constant<bool, !is_function<_Tp>::value> { };
    344 
    345   /// is_member_object_pointer
    346   template<typename _Tp>
    347     struct is_member_object_pointer
    348     : public __is_member_object_pointer_helper<
    349 				typename remove_cv<_Tp>::type>::type
    350     { };
    351 
    352   template<typename>
    353     struct __is_member_function_pointer_helper
    354     : public false_type { };
    355 
    356   template<typename _Tp, typename _Cp>
    357     struct __is_member_function_pointer_helper<_Tp _Cp::*>
    358     : public integral_constant<bool, is_function<_Tp>::value> { };
    359 
    360   /// is_member_function_pointer
    361   template<typename _Tp>
    362     struct is_member_function_pointer
    363     : public __is_member_function_pointer_helper<
    364 				typename remove_cv<_Tp>::type>::type
    365     { };
    366 
    367   /// is_enum
    368   template<typename _Tp>
    369     struct is_enum
    370     : public integral_constant<bool, __is_enum(_Tp)>
    371     { };
    372 
    373   /// is_union
    374   template<typename _Tp>
    375     struct is_union
    376     : public integral_constant<bool, __is_union(_Tp)>
    377     { };
    378 
    379   /// is_class
    380   template<typename _Tp>
    381     struct is_class
    382     : public integral_constant<bool, __is_class(_Tp)>
    383     { };
    384 
    385   /// is_function
    386   template<typename>
    387     struct is_function
    388     : public false_type { };
    389 
    390   template<typename _Res, typename... _ArgTypes>
    391     struct is_function<_Res(_ArgTypes...)>
    392     : public true_type { };
    393 
    394   template<typename _Res, typename... _ArgTypes>
    395     struct is_function<_Res(_ArgTypes...) &>
    396     : public true_type { };
    397 
    398   template<typename _Res, typename... _ArgTypes>
    399     struct is_function<_Res(_ArgTypes...) &&>
    400     : public true_type { };
    401 
    402   template<typename _Res, typename... _ArgTypes>
    403     struct is_function<_Res(_ArgTypes......)>
    404     : public true_type { };
    405 
    406   template<typename _Res, typename... _ArgTypes>
    407     struct is_function<_Res(_ArgTypes......) &>
    408     : public true_type { };
    409 
    410   template<typename _Res, typename... _ArgTypes>
    411     struct is_function<_Res(_ArgTypes......) &&>
    412     : public true_type { };
    413 
    414   template<typename _Res, typename... _ArgTypes>
    415     struct is_function<_Res(_ArgTypes...) const>
    416     : public true_type { };
    417 
    418   template<typename _Res, typename... _ArgTypes>
    419     struct is_function<_Res(_ArgTypes...) const &>
    420     : public true_type { };
    421 
    422   template<typename _Res, typename... _ArgTypes>
    423     struct is_function<_Res(_ArgTypes...) const &&>
    424     : public true_type { };
    425 
    426   template<typename _Res, typename... _ArgTypes>
    427     struct is_function<_Res(_ArgTypes......) const>
    428     : public true_type { };
    429 
    430   template<typename _Res, typename... _ArgTypes>
    431     struct is_function<_Res(_ArgTypes......) const &>
    432     : public true_type { };
    433 
    434   template<typename _Res, typename... _ArgTypes>
    435     struct is_function<_Res(_ArgTypes......) const &&>
    436     : public true_type { };
    437 
    438   template<typename _Res, typename... _ArgTypes>
    439     struct is_function<_Res(_ArgTypes...) volatile>
    440     : public true_type { };
    441 
    442   template<typename _Res, typename... _ArgTypes>
    443     struct is_function<_Res(_ArgTypes...) volatile &>
    444     : public true_type { };
    445 
    446   template<typename _Res, typename... _ArgTypes>
    447     struct is_function<_Res(_ArgTypes...) volatile &&>
    448     : public true_type { };
    449 
    450   template<typename _Res, typename... _ArgTypes>
    451     struct is_function<_Res(_ArgTypes......) volatile>
    452     : public true_type { };
    453 
    454   template<typename _Res, typename... _ArgTypes>
    455     struct is_function<_Res(_ArgTypes......) volatile &>
    456     : public true_type { };
    457 
    458   template<typename _Res, typename... _ArgTypes>
    459     struct is_function<_Res(_ArgTypes......) volatile &&>
    460     : public true_type { };
    461 
    462   template<typename _Res, typename... _ArgTypes>
    463     struct is_function<_Res(_ArgTypes...) const volatile>
    464     : public true_type { };
    465 
    466   template<typename _Res, typename... _ArgTypes>
    467     struct is_function<_Res(_ArgTypes...) const volatile &>
    468     : public true_type { };
    469 
    470   template<typename _Res, typename... _ArgTypes>
    471     struct is_function<_Res(_ArgTypes...) const volatile &&>
    472     : public true_type { };
    473 
    474   template<typename _Res, typename... _ArgTypes>
    475     struct is_function<_Res(_ArgTypes......) const volatile>
    476     : public true_type { };
    477 
    478   template<typename _Res, typename... _ArgTypes>
    479     struct is_function<_Res(_ArgTypes......) const volatile &>
    480     : public true_type { };
    481 
    482   template<typename _Res, typename... _ArgTypes>
    483     struct is_function<_Res(_ArgTypes......) const volatile &&>
    484     : public true_type { };
    485 
    486 #define __cpp_lib_is_null_pointer 201309
    487 
    488   template<typename>
    489     struct __is_null_pointer_helper
    490     : public false_type { };
    491 
    492   template<>
    493     struct __is_null_pointer_helper<std::nullptr_t>
    494     : public true_type { };
    495 
    496   /// is_null_pointer (LWG 2247).
    497   template<typename _Tp>
    498     struct is_null_pointer
    499     : public __is_null_pointer_helper<typename remove_cv<_Tp>::type>::type
    500     { };
    501 
    502   /// __is_nullptr_t (extension).
    503   template<typename _Tp>
    504     struct __is_nullptr_t
    505     : public is_null_pointer<_Tp>
    506     { };
    507 
    508   // Composite type categories.
    509 
    510   /// is_reference
    511   template<typename _Tp>
    512     struct is_reference
    513     : public __or_<is_lvalue_reference<_Tp>,
    514                    is_rvalue_reference<_Tp>>::type
    515     { };
    516 
    517   /// is_arithmetic
    518   template<typename _Tp>
    519     struct is_arithmetic
    520     : public __or_<is_integral<_Tp>, is_floating_point<_Tp>>::type
    521     { };
    522 
    523   /// is_fundamental
    524   template<typename _Tp>
    525     struct is_fundamental
    526     : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
    527 		   is_null_pointer<_Tp>>::type
    528     { };
    529 
    530   /// is_object
    531   template<typename _Tp>
    532     struct is_object
    533     : public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
    534                           is_void<_Tp>>>::type
    535     { };
    536 
    537   template<typename>
    538     struct is_member_pointer;
    539 
    540   /// is_scalar
    541   template<typename _Tp>
    542     struct is_scalar
    543     : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
    544                    is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
    545     { };
    546 
    547   /// is_compound
    548   template<typename _Tp>
    549     struct is_compound
    550     : public integral_constant<bool, !is_fundamental<_Tp>::value> { };
    551 
    552   template<typename _Tp>
    553     struct __is_member_pointer_helper
    554     : public false_type { };
    555 
    556   template<typename _Tp, typename _Cp>
    557     struct __is_member_pointer_helper<_Tp _Cp::*>
    558     : public true_type { };
    559 
    560   /// is_member_pointer
    561   template<typename _Tp>
    562     struct is_member_pointer
    563     : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
    564     { };
    565 
    566   // Utility to detect referenceable types ([defns.referenceable]).
    567 
    568   template<typename _Tp>
    569     struct __is_referenceable
    570     : public __or_<is_object<_Tp>, is_reference<_Tp>>::type
    571     { };
    572 
    573   template<typename _Res, typename... _Args>
    574     struct __is_referenceable<_Res(_Args...)>
    575     : public true_type
    576     { };
    577 
    578   template<typename _Res, typename... _Args>
    579     struct __is_referenceable<_Res(_Args......)>
    580     : public true_type
    581     { };
    582 
    583   // Type properties.
    584 
    585   /// is_const
    586   template<typename>
    587     struct is_const
    588     : public false_type { };
    589 
    590   template<typename _Tp>
    591     struct is_const<_Tp const>
    592     : public true_type { };
    593   
    594   /// is_volatile
    595   template<typename>
    596     struct is_volatile
    597     : public false_type { };
    598 
    599   template<typename _Tp>
    600     struct is_volatile<_Tp volatile>
    601     : public true_type { };
    602 
    603   /// is_trivial
    604   template<typename _Tp>
    605     struct is_trivial
    606     : public integral_constant<bool, __is_trivial(_Tp)>
    607     { };
    608 
    609   // is_trivially_copyable (still unimplemented)
    610 
    611   /// is_standard_layout
    612   template<typename _Tp>
    613     struct is_standard_layout
    614     : public integral_constant<bool, __is_standard_layout(_Tp)>
    615     { };
    616 
    617   /// is_pod
    618   // Could use is_standard_layout && is_trivial instead of the builtin.
    619   template<typename _Tp>
    620     struct is_pod
    621     : public integral_constant<bool, __is_pod(_Tp)>
    622     { };
    623 
    624   /// is_literal_type
    625   template<typename _Tp>
    626     struct is_literal_type
    627     : public integral_constant<bool, __is_literal_type(_Tp)>
    628     { };
    629 
    630   /// is_empty
    631   template<typename _Tp>
    632     struct is_empty
    633     : public integral_constant<bool, __is_empty(_Tp)>
    634     { };
    635 
    636   /// is_polymorphic
    637   template<typename _Tp>
    638     struct is_polymorphic
    639     : public integral_constant<bool, __is_polymorphic(_Tp)>
    640     { };
    641 
    642 #if __cplusplus > 201103L
    643   /// is_final
    644   #define __cpp_lib_is_final 201402L
    645   template<typename _Tp>
    646     struct is_final
    647     : public integral_constant<bool, __is_final(_Tp)>
    648     { };
    649 #endif
    650 
    651   /// is_abstract
    652   template<typename _Tp>
    653     struct is_abstract
    654     : public integral_constant<bool, __is_abstract(_Tp)>
    655     { };
    656 
    657   template<typename _Tp,
    658 	   bool = is_arithmetic<_Tp>::value>
    659     struct __is_signed_helper
    660     : public false_type { };
    661 
    662   template<typename _Tp>
    663     struct __is_signed_helper<_Tp, true>
    664     : public integral_constant<bool, _Tp(-1) < _Tp(0)>
    665     { };
    666 
    667   /// is_signed
    668   template<typename _Tp>
    669     struct is_signed
    670     : public __is_signed_helper<_Tp>::type
    671     { };
    672 
    673   /// is_unsigned
    674   template<typename _Tp>
    675     struct is_unsigned
    676     : public __and_<is_arithmetic<_Tp>, __not_<is_signed<_Tp>>>::type
    677     { };
    678 
    679 
    680   // Destructible and constructible type properties.
    681 
    682   template<typename>
    683     struct add_rvalue_reference;
    684 
    685   /**
    686    *  @brief  Utility to simplify expressions used in unevaluated operands
    687    *  @ingroup utilities
    688    */
    689   template<typename _Tp>
    690     typename add_rvalue_reference<_Tp>::type declval() noexcept;
    691 
    692   template<typename, unsigned = 0>
    693     struct extent;
    694 
    695   template<typename>
    696     struct remove_all_extents;
    697 
    698   template<typename _Tp>
    699     struct __is_array_known_bounds
    700     : public integral_constant<bool, (extent<_Tp>::value > 0)>
    701     { };
    702 
    703   template<typename _Tp>
    704     struct __is_array_unknown_bounds
    705     : public __and_<is_array<_Tp>, __not_<extent<_Tp>>>::type
    706     { };
    707     
    708   // In N3290 is_destructible does not say anything about function
    709   // types and abstract types, see LWG 2049. This implementation
    710   // describes function types as non-destructible and all complete
    711   // object types as destructible, iff the explicit destructor
    712   // call expression is wellformed.
    713   struct __do_is_destructible_impl
    714   {
    715     template<typename _Tp, typename = decltype(declval<_Tp&>().~_Tp())>
    716       static true_type __test(int);
    717 
    718     template<typename>
    719       static false_type __test(...);
    720   };
    721 
    722   template<typename _Tp>
    723     struct __is_destructible_impl
    724     : public __do_is_destructible_impl
    725     {
    726       typedef decltype(__test<_Tp>(0)) type;
    727     };
    728 
    729   template<typename _Tp,
    730            bool = __or_<is_void<_Tp>,
    731                         __is_array_unknown_bounds<_Tp>,
    732                         is_function<_Tp>>::value,
    733            bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
    734     struct __is_destructible_safe;
    735 
    736   template<typename _Tp>
    737     struct __is_destructible_safe<_Tp, false, false>
    738     : public __is_destructible_impl<typename
    739                remove_all_extents<_Tp>::type>::type
    740     { };
    741 
    742   template<typename _Tp>
    743     struct __is_destructible_safe<_Tp, true, false>
    744     : public false_type { };
    745 
    746   template<typename _Tp>
    747     struct __is_destructible_safe<_Tp, false, true>
    748     : public true_type { };
    749 
    750   /// is_destructible
    751   template<typename _Tp>
    752     struct is_destructible
    753     : public __is_destructible_safe<_Tp>::type
    754     { };
    755 
    756   // is_nothrow_destructible requires that is_destructible is
    757   // satisfied as well.  We realize that by mimicing the
    758   // implementation of is_destructible but refer to noexcept(expr)
    759   // instead of decltype(expr).
    760   struct __do_is_nt_destructible_impl
    761   {
    762     template<typename _Tp>
    763       static integral_constant<bool, noexcept(declval<_Tp&>().~_Tp())>
    764         __test(int);
    765 
    766     template<typename>
    767       static false_type __test(...);
    768   };
    769 
    770   template<typename _Tp>
    771     struct __is_nt_destructible_impl
    772     : public __do_is_nt_destructible_impl
    773     {
    774       typedef decltype(__test<_Tp>(0)) type;
    775     };
    776 
    777   template<typename _Tp,
    778            bool = __or_<is_void<_Tp>,
    779                         __is_array_unknown_bounds<_Tp>,
    780                         is_function<_Tp>>::value,
    781            bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
    782     struct __is_nt_destructible_safe;
    783 
    784   template<typename _Tp>
    785     struct __is_nt_destructible_safe<_Tp, false, false>
    786     : public __is_nt_destructible_impl<typename
    787                remove_all_extents<_Tp>::type>::type
    788     { };
    789 
    790   template<typename _Tp>
    791     struct __is_nt_destructible_safe<_Tp, true, false>
    792     : public false_type { };
    793 
    794   template<typename _Tp>
    795     struct __is_nt_destructible_safe<_Tp, false, true>
    796     : public true_type { };
    797 
    798   /// is_nothrow_destructible
    799   template<typename _Tp>
    800     struct is_nothrow_destructible
    801     : public __is_nt_destructible_safe<_Tp>::type
    802     { };
    803 
    804   struct __do_is_default_constructible_impl
    805   {
    806     template<typename _Tp, typename = decltype(_Tp())>
    807       static true_type __test(int);
    808 
    809     template<typename>
    810       static false_type __test(...);
    811   };
    812 
    813   template<typename _Tp>
    814     struct __is_default_constructible_impl
    815     : public __do_is_default_constructible_impl
    816     {
    817       typedef decltype(__test<_Tp>(0)) type;
    818     };
    819 
    820   template<typename _Tp>
    821     struct __is_default_constructible_atom
    822     : public __and_<__not_<is_void<_Tp>>,
    823                     __is_default_constructible_impl<_Tp>>::type
    824     { };
    825 
    826   template<typename _Tp, bool = is_array<_Tp>::value>
    827     struct __is_default_constructible_safe;
    828 
    829   // The following technique is a workaround for a current core language
    830   // restriction, which does not allow for array types to occur in 
    831   // functional casts of the form T().  Complete arrays can be default-
    832   // constructed, if the element type is default-constructible, but 
    833   // arrays with unknown bounds are not.
    834   template<typename _Tp>
    835     struct __is_default_constructible_safe<_Tp, true>
    836     : public __and_<__is_array_known_bounds<_Tp>,
    837 		    __is_default_constructible_atom<typename
    838                       remove_all_extents<_Tp>::type>>::type
    839     { };
    840 
    841   template<typename _Tp>
    842     struct __is_default_constructible_safe<_Tp, false>
    843     : public __is_default_constructible_atom<_Tp>::type
    844     { };
    845 
    846   /// is_default_constructible
    847   template<typename _Tp>
    848     struct is_default_constructible
    849     : public __is_default_constructible_safe<_Tp>::type
    850     { };
    851 
    852 
    853   // Implementation of is_constructible.
    854 
    855   // The hardest part of this trait is the binary direct-initialization
    856   // case, because we hit into a functional cast of the form T(arg).
    857   // This implementation uses different strategies depending on the
    858   // target type to reduce the test overhead as much as possible:
    859   //
    860   // a) For a reference target type, we use a static_cast expression 
    861   //    modulo its extra cases.
    862   //
    863   // b) For a non-reference target type we use a ::new expression.
    864   struct __do_is_static_castable_impl
    865   {
    866     template<typename _From, typename _To, typename
    867              = decltype(static_cast<_To>(declval<_From>()))>
    868       static true_type __test(int);
    869 
    870     template<typename, typename>
    871       static false_type __test(...);
    872   };
    873 
    874   template<typename _From, typename _To>
    875     struct __is_static_castable_impl
    876     : public __do_is_static_castable_impl
    877     {
    878       typedef decltype(__test<_From, _To>(0)) type;
    879     };
    880 
    881   template<typename _From, typename _To>
    882     struct __is_static_castable_safe
    883     : public __is_static_castable_impl<_From, _To>::type
    884     { };
    885 
    886   // __is_static_castable
    887   template<typename _From, typename _To>
    888     struct __is_static_castable
    889     : public integral_constant<bool, (__is_static_castable_safe<
    890 				      _From, _To>::value)>
    891     { };
    892 
    893   // Implementation for non-reference types. To meet the proper
    894   // variable definition semantics, we also need to test for
    895   // is_destructible in this case.
    896   // This form should be simplified by a single expression:
    897   // ::delete ::new _Tp(declval<_Arg>()), see c++/51222.
    898   struct __do_is_direct_constructible_impl
    899   {
    900     template<typename _Tp, typename _Arg, typename
    901 	     = decltype(::new _Tp(declval<_Arg>()))>
    902       static true_type __test(int);
    903 
    904     template<typename, typename>
    905       static false_type __test(...);
    906   };
    907 
    908   template<typename _Tp, typename _Arg>
    909     struct __is_direct_constructible_impl
    910     : public __do_is_direct_constructible_impl
    911     {
    912       typedef decltype(__test<_Tp, _Arg>(0)) type;
    913     };
    914 
    915   template<typename _Tp, typename _Arg>
    916     struct __is_direct_constructible_new_safe
    917     : public __and_<is_destructible<_Tp>,
    918                     __is_direct_constructible_impl<_Tp, _Arg>>::type
    919     { };
    920 
    921   template<typename, typename>
    922     struct is_same;
    923 
    924   template<typename, typename>
    925     struct is_base_of;
    926 
    927   template<typename>
    928     struct remove_reference;
    929 
    930   template<typename _From, typename _To, bool
    931            = __not_<__or_<is_void<_From>, 
    932                           is_function<_From>>>::value>
    933     struct __is_base_to_derived_ref;
    934 
    935   // Detect whether we have a downcast situation during
    936   // reference binding.
    937   template<typename _From, typename _To>
    938     struct __is_base_to_derived_ref<_From, _To, true>
    939     {
    940       typedef typename remove_cv<typename remove_reference<_From
    941         >::type>::type __src_t;
    942       typedef typename remove_cv<typename remove_reference<_To
    943         >::type>::type __dst_t;
    944       typedef __and_<__not_<is_same<__src_t, __dst_t>>,
    945 		     is_base_of<__src_t, __dst_t>> type;
    946       static constexpr bool value = type::value;
    947     };
    948 
    949   template<typename _From, typename _To>
    950     struct __is_base_to_derived_ref<_From, _To, false>
    951     : public false_type
    952     { };
    953 
    954   template<typename _From, typename _To, bool
    955            = __and_<is_lvalue_reference<_From>,
    956                     is_rvalue_reference<_To>>::value>
    957     struct __is_lvalue_to_rvalue_ref;
    958 
    959   // Detect whether we have an lvalue of non-function type
    960   // bound to a reference-compatible rvalue-reference.
    961   template<typename _From, typename _To>
    962     struct __is_lvalue_to_rvalue_ref<_From, _To, true>
    963     {
    964       typedef typename remove_cv<typename remove_reference<
    965         _From>::type>::type __src_t;
    966       typedef typename remove_cv<typename remove_reference<
    967         _To>::type>::type __dst_t;
    968       typedef __and_<__not_<is_function<__src_t>>, 
    969         __or_<is_same<__src_t, __dst_t>,
    970 		    is_base_of<__dst_t, __src_t>>> type;
    971       static constexpr bool value = type::value;
    972     };
    973 
    974   template<typename _From, typename _To>
    975     struct __is_lvalue_to_rvalue_ref<_From, _To, false>
    976     : public false_type
    977     { };
    978 
    979   // Here we handle direct-initialization to a reference type as 
    980   // equivalent to a static_cast modulo overshooting conversions.
    981   // These are restricted to the following conversions:
    982   //    a) A base class value to a derived class reference
    983   //    b) An lvalue to an rvalue-reference of reference-compatible 
    984   //       types that are not functions
    985   template<typename _Tp, typename _Arg>
    986     struct __is_direct_constructible_ref_cast
    987     : public __and_<__is_static_castable<_Arg, _Tp>,
    988                     __not_<__or_<__is_base_to_derived_ref<_Arg, _Tp>,
    989                                  __is_lvalue_to_rvalue_ref<_Arg, _Tp>
    990                    >>>::type
    991     { };
    992 
    993   template<typename _Tp, typename _Arg>
    994     struct __is_direct_constructible_new
    995     : public conditional<is_reference<_Tp>::value,
    996 			 __is_direct_constructible_ref_cast<_Tp, _Arg>,
    997 			 __is_direct_constructible_new_safe<_Tp, _Arg>
    998 			 >::type
    999     { };
   1000 
   1001   template<typename _Tp, typename _Arg>
   1002     struct __is_direct_constructible
   1003     : public __is_direct_constructible_new<_Tp, _Arg>::type
   1004     { };
   1005 
   1006   // Since default-construction and binary direct-initialization have
   1007   // been handled separately, the implementation of the remaining
   1008   // n-ary construction cases is rather straightforward. We can use
   1009   // here a functional cast, because array types are excluded anyway
   1010   // and this form is never interpreted as a C cast.
   1011   struct __do_is_nary_constructible_impl
   1012   {
   1013     template<typename _Tp, typename... _Args, typename
   1014              = decltype(_Tp(declval<_Args>()...))>
   1015       static true_type __test(int);
   1016 
   1017     template<typename, typename...>
   1018       static false_type __test(...);
   1019   };
   1020 
   1021   template<typename _Tp, typename... _Args>
   1022     struct __is_nary_constructible_impl
   1023     : public __do_is_nary_constructible_impl
   1024     {
   1025       typedef decltype(__test<_Tp, _Args...>(0)) type;
   1026     };
   1027 
   1028   template<typename _Tp, typename... _Args>
   1029     struct __is_nary_constructible
   1030     : public __is_nary_constructible_impl<_Tp, _Args...>::type
   1031     {
   1032       static_assert(sizeof...(_Args) > 1,
   1033                     "Only useful for > 1 arguments");
   1034     };
   1035 
   1036   template<typename _Tp, typename... _Args>
   1037     struct __is_constructible_impl
   1038     : public __is_nary_constructible<_Tp, _Args...>
   1039     { };
   1040 
   1041   template<typename _Tp, typename _Arg>
   1042     struct __is_constructible_impl<_Tp, _Arg>
   1043     : public __is_direct_constructible<_Tp, _Arg>
   1044     { };
   1045 
   1046   template<typename _Tp>
   1047     struct __is_constructible_impl<_Tp>
   1048     : public is_default_constructible<_Tp>
   1049     { };
   1050 
   1051   /// is_constructible
   1052   template<typename _Tp, typename... _Args>
   1053     struct is_constructible
   1054     : public __is_constructible_impl<_Tp, _Args...>::type
   1055     { };
   1056 
   1057   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1058     struct __is_copy_constructible_impl;
   1059 
   1060   template<typename _Tp>
   1061     struct __is_copy_constructible_impl<_Tp, false>
   1062     : public false_type { };
   1063 
   1064   template<typename _Tp>
   1065     struct __is_copy_constructible_impl<_Tp, true>
   1066     : public is_constructible<_Tp, const _Tp&>
   1067     { };
   1068 
   1069   /// is_copy_constructible
   1070   template<typename _Tp>
   1071     struct is_copy_constructible
   1072     : public __is_copy_constructible_impl<_Tp>
   1073     { };
   1074 
   1075   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1076     struct __is_move_constructible_impl;
   1077 
   1078   template<typename _Tp>
   1079     struct __is_move_constructible_impl<_Tp, false>
   1080     : public false_type { };
   1081 
   1082   template<typename _Tp>
   1083     struct __is_move_constructible_impl<_Tp, true>
   1084     : public is_constructible<_Tp, _Tp&&>
   1085     { };
   1086 
   1087   /// is_move_constructible
   1088   template<typename _Tp>
   1089     struct is_move_constructible
   1090     : public __is_move_constructible_impl<_Tp>
   1091     { };
   1092 
   1093   template<typename _Tp>
   1094     struct __is_nt_default_constructible_atom
   1095     : public integral_constant<bool, noexcept(_Tp())>
   1096     { };
   1097 
   1098   template<typename _Tp, bool = is_array<_Tp>::value>
   1099     struct __is_nt_default_constructible_impl;
   1100 
   1101   template<typename _Tp>
   1102     struct __is_nt_default_constructible_impl<_Tp, true>
   1103     : public __and_<__is_array_known_bounds<_Tp>,
   1104 		    __is_nt_default_constructible_atom<typename
   1105                       remove_all_extents<_Tp>::type>>::type
   1106     { };
   1107 
   1108   template<typename _Tp>
   1109     struct __is_nt_default_constructible_impl<_Tp, false>
   1110     : public __is_nt_default_constructible_atom<_Tp>
   1111     { };
   1112 
   1113   /// is_nothrow_default_constructible
   1114   template<typename _Tp>
   1115     struct is_nothrow_default_constructible
   1116     : public __and_<is_default_constructible<_Tp>,
   1117                     __is_nt_default_constructible_impl<_Tp>>::type
   1118     { };
   1119 
   1120   template<typename _Tp, typename... _Args>
   1121     struct __is_nt_constructible_impl
   1122     : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
   1123     { };
   1124 
   1125   template<typename _Tp, typename _Arg>
   1126     struct __is_nt_constructible_impl<_Tp, _Arg>
   1127     : public integral_constant<bool,
   1128                                noexcept(static_cast<_Tp>(declval<_Arg>()))>
   1129     { };
   1130 
   1131   template<typename _Tp>
   1132     struct __is_nt_constructible_impl<_Tp>
   1133     : public is_nothrow_default_constructible<_Tp>
   1134     { };
   1135 
   1136   /// is_nothrow_constructible
   1137   template<typename _Tp, typename... _Args>
   1138     struct is_nothrow_constructible
   1139     : public __and_<is_constructible<_Tp, _Args...>,
   1140 		    __is_nt_constructible_impl<_Tp, _Args...>>::type
   1141     { };
   1142 
   1143   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1144     struct __is_nothrow_copy_constructible_impl;
   1145 
   1146   template<typename _Tp>
   1147     struct __is_nothrow_copy_constructible_impl<_Tp, false>
   1148     : public false_type { };
   1149 
   1150   template<typename _Tp>
   1151     struct __is_nothrow_copy_constructible_impl<_Tp, true>
   1152     : public is_nothrow_constructible<_Tp, const _Tp&>
   1153     { };
   1154 
   1155   /// is_nothrow_copy_constructible
   1156   template<typename _Tp>
   1157     struct is_nothrow_copy_constructible
   1158     : public __is_nothrow_copy_constructible_impl<_Tp>
   1159     { };
   1160 
   1161   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1162     struct __is_nothrow_move_constructible_impl;
   1163 
   1164   template<typename _Tp>
   1165     struct __is_nothrow_move_constructible_impl<_Tp, false>
   1166     : public false_type { };
   1167 
   1168   template<typename _Tp>
   1169     struct __is_nothrow_move_constructible_impl<_Tp, true>
   1170     : public is_nothrow_constructible<_Tp, _Tp&&>
   1171     { };
   1172 
   1173   /// is_nothrow_move_constructible
   1174   template<typename _Tp>
   1175     struct is_nothrow_move_constructible
   1176     : public __is_nothrow_move_constructible_impl<_Tp>
   1177     { };
   1178 
   1179   template<typename _Tp, typename _Up>
   1180     class __is_assignable_helper
   1181     {
   1182       template<typename _Tp1, typename _Up1,
   1183 	       typename = decltype(declval<_Tp1>() = declval<_Up1>())>
   1184 	static true_type
   1185 	__test(int);
   1186 
   1187       template<typename, typename>
   1188 	static false_type
   1189 	__test(...);
   1190 
   1191     public:
   1192       typedef decltype(__test<_Tp, _Up>(0)) type;
   1193     };
   1194 
   1195   /// is_assignable
   1196   template<typename _Tp, typename _Up>
   1197     struct is_assignable
   1198       : public __is_assignable_helper<_Tp, _Up>::type
   1199     { };
   1200 
   1201   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1202     struct __is_copy_assignable_impl;
   1203 
   1204   template<typename _Tp>
   1205     struct __is_copy_assignable_impl<_Tp, false>
   1206     : public false_type { };
   1207 
   1208   template<typename _Tp>
   1209     struct __is_copy_assignable_impl<_Tp, true>
   1210     : public is_assignable<_Tp&, const _Tp&>
   1211     { };
   1212 
   1213   /// is_copy_assignable
   1214   template<typename _Tp>
   1215     struct is_copy_assignable
   1216     : public __is_copy_assignable_impl<_Tp>
   1217     { };
   1218 
   1219   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1220     struct __is_move_assignable_impl;
   1221 
   1222   template<typename _Tp>
   1223     struct __is_move_assignable_impl<_Tp, false>
   1224     : public false_type { };
   1225 
   1226   template<typename _Tp>
   1227     struct __is_move_assignable_impl<_Tp, true>
   1228     : public is_assignable<_Tp&, _Tp&&>
   1229     { };
   1230 
   1231   /// is_move_assignable
   1232   template<typename _Tp>
   1233     struct is_move_assignable
   1234     : public __is_move_assignable_impl<_Tp>
   1235     { };
   1236 
   1237   template<typename _Tp, typename _Up>
   1238     struct __is_nt_assignable_impl
   1239     : public integral_constant<bool, noexcept(declval<_Tp>() = declval<_Up>())>
   1240     { };
   1241 
   1242   /// is_nothrow_assignable
   1243   template<typename _Tp, typename _Up>
   1244     struct is_nothrow_assignable
   1245     : public __and_<is_assignable<_Tp, _Up>,
   1246 		    __is_nt_assignable_impl<_Tp, _Up>>::type
   1247     { };
   1248 
   1249   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1250     struct __is_nt_copy_assignable_impl;
   1251 
   1252   template<typename _Tp>
   1253     struct __is_nt_copy_assignable_impl<_Tp, false>
   1254     : public false_type { };
   1255 
   1256   template<typename _Tp>
   1257     struct __is_nt_copy_assignable_impl<_Tp, true>
   1258     : public is_nothrow_assignable<_Tp&, const _Tp&>
   1259     { };
   1260 
   1261   /// is_nothrow_copy_assignable
   1262   template<typename _Tp>
   1263     struct is_nothrow_copy_assignable
   1264     : public __is_nt_copy_assignable_impl<_Tp>
   1265     { };
   1266 
   1267   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1268     struct __is_nt_move_assignable_impl;
   1269 
   1270   template<typename _Tp>
   1271     struct __is_nt_move_assignable_impl<_Tp, false>
   1272     : public false_type { };
   1273 
   1274   template<typename _Tp>
   1275     struct __is_nt_move_assignable_impl<_Tp, true>
   1276     : public is_nothrow_assignable<_Tp&, _Tp&&>
   1277     { };
   1278 
   1279   /// is_nothrow_move_assignable
   1280   template<typename _Tp>
   1281     struct is_nothrow_move_assignable
   1282     : public __is_nt_move_assignable_impl<_Tp>
   1283     { };
   1284 
   1285   /// is_trivially_constructible (still unimplemented)
   1286   
   1287   /// is_trivially_default_constructible (still unimplemented)
   1288 
   1289   /// is_trivially_copy_constructible (still unimplemented)
   1290 
   1291   /// is_trivially_move_constructible (still unimplemented)
   1292 
   1293   /// is_trivially_assignable (still unimplemented)
   1294 
   1295   /// is_trivially_copy_assignable (still unimplemented)
   1296 
   1297   /// is_trivially_move_assignable (still unimplemented)
   1298 
   1299   /// is_trivially_destructible
   1300   template<typename _Tp>
   1301     struct is_trivially_destructible
   1302     : public __and_<is_destructible<_Tp>, integral_constant<bool,
   1303 			      __has_trivial_destructor(_Tp)>>::type
   1304     { };
   1305 
   1306   /// has_trivial_default_constructor (temporary legacy)
   1307   template<typename _Tp>
   1308     struct has_trivial_default_constructor
   1309     : public integral_constant<bool, __has_trivial_constructor(_Tp)>
   1310     { };
   1311 
   1312   /// has_trivial_copy_constructor (temporary legacy)
   1313   template<typename _Tp>
   1314     struct has_trivial_copy_constructor
   1315     : public integral_constant<bool, __has_trivial_copy(_Tp)>
   1316     { };
   1317 
   1318   /// has_trivial_copy_assign (temporary legacy)
   1319   template<typename _Tp>
   1320     struct has_trivial_copy_assign
   1321     : public integral_constant<bool, __has_trivial_assign(_Tp)>
   1322     { };
   1323 
   1324   /// has_virtual_destructor
   1325   template<typename _Tp>
   1326     struct has_virtual_destructor
   1327     : public integral_constant<bool, __has_virtual_destructor(_Tp)>
   1328     { };
   1329 
   1330   
   1331   // type property queries.
   1332 
   1333   /// alignment_of
   1334   template<typename _Tp>
   1335     struct alignment_of
   1336     : public integral_constant<std::size_t, __alignof__(_Tp)> { };
   1337   
   1338   /// rank
   1339   template<typename>
   1340     struct rank
   1341     : public integral_constant<std::size_t, 0> { };
   1342    
   1343   template<typename _Tp, std::size_t _Size>
   1344     struct rank<_Tp[_Size]>
   1345     : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
   1346 
   1347   template<typename _Tp>
   1348     struct rank<_Tp[]>
   1349     : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
   1350 
   1351   /// extent
   1352   template<typename, unsigned _Uint>
   1353     struct extent
   1354     : public integral_constant<std::size_t, 0> { };
   1355   
   1356   template<typename _Tp, unsigned _Uint, std::size_t _Size>
   1357     struct extent<_Tp[_Size], _Uint>
   1358     : public integral_constant<std::size_t,
   1359 			       _Uint == 0 ? _Size : extent<_Tp,
   1360 							   _Uint - 1>::value>
   1361     { };
   1362 
   1363   template<typename _Tp, unsigned _Uint>
   1364     struct extent<_Tp[], _Uint>
   1365     : public integral_constant<std::size_t,
   1366 			       _Uint == 0 ? 0 : extent<_Tp,
   1367 						       _Uint - 1>::value>
   1368     { };
   1369 
   1370 
   1371   // Type relations.
   1372 
   1373   /// is_same
   1374   template<typename, typename>
   1375     struct is_same
   1376     : public false_type { };
   1377 
   1378   template<typename _Tp>
   1379     struct is_same<_Tp, _Tp>
   1380     : public true_type { };
   1381 
   1382   /// is_base_of
   1383   template<typename _Base, typename _Derived>
   1384     struct is_base_of
   1385     : public integral_constant<bool, __is_base_of(_Base, _Derived)>
   1386     { };
   1387 
   1388   template<typename _From, typename _To,
   1389            bool = __or_<is_void<_From>, is_function<_To>,
   1390                         is_array<_To>>::value>
   1391     struct __is_convertible_helper
   1392     { typedef typename is_void<_To>::type type; };
   1393 
   1394   template<typename _From, typename _To>
   1395     class __is_convertible_helper<_From, _To, false>
   1396     {
   1397        template<typename _To1>
   1398 	static void __test_aux(_To1);
   1399 
   1400       template<typename _From1, typename _To1,
   1401 	       typename = decltype(__test_aux<_To1>(std::declval<_From1>()))>
   1402 	static true_type
   1403 	__test(int);
   1404 
   1405       template<typename, typename>
   1406 	static false_type
   1407 	__test(...);
   1408 
   1409     public:
   1410       typedef decltype(__test<_From, _To>(0)) type;
   1411     };
   1412 
   1413 
   1414   /// is_convertible
   1415   template<typename _From, typename _To>
   1416     struct is_convertible
   1417     : public __is_convertible_helper<_From, _To>::type
   1418     { };
   1419 
   1420 
   1421   // Const-volatile modifications.
   1422 
   1423   /// remove_const
   1424   template<typename _Tp>
   1425     struct remove_const
   1426     { typedef _Tp     type; };
   1427 
   1428   template<typename _Tp>
   1429     struct remove_const<_Tp const>
   1430     { typedef _Tp     type; };
   1431   
   1432   /// remove_volatile
   1433   template<typename _Tp>
   1434     struct remove_volatile
   1435     { typedef _Tp     type; };
   1436 
   1437   template<typename _Tp>
   1438     struct remove_volatile<_Tp volatile>
   1439     { typedef _Tp     type; };
   1440   
   1441   /// remove_cv
   1442   template<typename _Tp>
   1443     struct remove_cv
   1444     {
   1445       typedef typename
   1446       remove_const<typename remove_volatile<_Tp>::type>::type     type;
   1447     };
   1448   
   1449   /// add_const
   1450   template<typename _Tp>
   1451     struct add_const
   1452     { typedef _Tp const     type; };
   1453    
   1454   /// add_volatile
   1455   template<typename _Tp>
   1456     struct add_volatile
   1457     { typedef _Tp volatile     type; };
   1458   
   1459   /// add_cv
   1460   template<typename _Tp>
   1461     struct add_cv
   1462     {
   1463       typedef typename
   1464       add_const<typename add_volatile<_Tp>::type>::type     type;
   1465     };
   1466 
   1467 #if __cplusplus > 201103L
   1468 
   1469 #define __cpp_lib_transformation_trait_aliases 201304
   1470 
   1471   /// Alias template for remove_const
   1472   template<typename _Tp>
   1473     using remove_const_t = typename remove_const<_Tp>::type;
   1474 
   1475   /// Alias template for remove_volatile
   1476   template<typename _Tp>
   1477     using remove_volatile_t = typename remove_volatile<_Tp>::type;
   1478 
   1479   /// Alias template for remove_cv
   1480   template<typename _Tp>
   1481     using remove_cv_t = typename remove_cv<_Tp>::type;
   1482 
   1483   /// Alias template for add_const
   1484   template<typename _Tp>
   1485     using add_const_t = typename add_const<_Tp>::type;
   1486 
   1487   /// Alias template for add_volatile
   1488   template<typename _Tp>
   1489     using add_volatile_t = typename add_volatile<_Tp>::type;
   1490 
   1491   /// Alias template for add_cv
   1492   template<typename _Tp>
   1493     using add_cv_t = typename add_cv<_Tp>::type;
   1494 #endif
   1495 
   1496   // Reference transformations.
   1497 
   1498   /// remove_reference
   1499   template<typename _Tp>
   1500     struct remove_reference
   1501     { typedef _Tp   type; };
   1502 
   1503   template<typename _Tp>
   1504     struct remove_reference<_Tp&>
   1505     { typedef _Tp   type; };
   1506 
   1507   template<typename _Tp>
   1508     struct remove_reference<_Tp&&>
   1509     { typedef _Tp   type; };
   1510 
   1511   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1512     struct __add_lvalue_reference_helper
   1513     { typedef _Tp   type; };
   1514 
   1515   template<typename _Tp>
   1516     struct __add_lvalue_reference_helper<_Tp, true>
   1517     { typedef _Tp&   type; };
   1518 
   1519   /// add_lvalue_reference
   1520   template<typename _Tp>
   1521     struct add_lvalue_reference
   1522     : public __add_lvalue_reference_helper<_Tp>
   1523     { };
   1524 
   1525   template<typename _Tp, bool = __is_referenceable<_Tp>::value>
   1526     struct __add_rvalue_reference_helper
   1527     { typedef _Tp   type; };
   1528 
   1529   template<typename _Tp>
   1530     struct __add_rvalue_reference_helper<_Tp, true>
   1531     { typedef _Tp&&   type; };
   1532 
   1533   /// add_rvalue_reference
   1534   template<typename _Tp>
   1535     struct add_rvalue_reference
   1536     : public __add_rvalue_reference_helper<_Tp>
   1537     { };
   1538 
   1539 #if __cplusplus > 201103L
   1540   /// Alias template for remove_reference
   1541   template<typename _Tp>
   1542     using remove_reference_t = typename remove_reference<_Tp>::type;
   1543 
   1544   /// Alias template for add_lvalue_reference
   1545   template<typename _Tp>
   1546     using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
   1547 
   1548   /// Alias template for add_rvalue_reference
   1549   template<typename _Tp>
   1550     using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
   1551 #endif
   1552 
   1553   // Sign modifications.
   1554 
   1555   // Utility for constructing identically cv-qualified types.
   1556   template<typename _Unqualified, bool _IsConst, bool _IsVol>
   1557     struct __cv_selector;
   1558 
   1559   template<typename _Unqualified>
   1560     struct __cv_selector<_Unqualified, false, false>
   1561     { typedef _Unqualified __type; };
   1562 
   1563   template<typename _Unqualified>
   1564     struct __cv_selector<_Unqualified, false, true>
   1565     { typedef volatile _Unqualified __type; };
   1566 
   1567   template<typename _Unqualified>
   1568     struct __cv_selector<_Unqualified, true, false>
   1569     { typedef const _Unqualified __type; };
   1570 
   1571   template<typename _Unqualified>
   1572     struct __cv_selector<_Unqualified, true, true>
   1573     { typedef const volatile _Unqualified __type; };
   1574 
   1575   template<typename _Qualified, typename _Unqualified,
   1576 	   bool _IsConst = is_const<_Qualified>::value,
   1577 	   bool _IsVol = is_volatile<_Qualified>::value>
   1578     class __match_cv_qualifiers
   1579     {
   1580       typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
   1581 
   1582     public:
   1583       typedef typename __match::__type __type; 
   1584     };
   1585 
   1586   // Utility for finding the unsigned versions of signed integral types.
   1587   template<typename _Tp>
   1588     struct __make_unsigned
   1589     { typedef _Tp __type; };
   1590 
   1591   template<>
   1592     struct __make_unsigned<char>
   1593     { typedef unsigned char __type; };
   1594 
   1595   template<>
   1596     struct __make_unsigned<signed char>
   1597     { typedef unsigned char __type; };
   1598 
   1599   template<>
   1600     struct __make_unsigned<short>
   1601     { typedef unsigned short __type; };
   1602 
   1603   template<>
   1604     struct __make_unsigned<int>
   1605     { typedef unsigned int __type; };
   1606 
   1607   template<>
   1608     struct __make_unsigned<long>
   1609     { typedef unsigned long __type; };
   1610 
   1611   template<>
   1612     struct __make_unsigned<long long>
   1613     { typedef unsigned long long __type; };
   1614 
   1615 #if defined(_GLIBCXX_USE_WCHAR_T) && !defined(__WCHAR_UNSIGNED__)
   1616   template<>
   1617     struct __make_unsigned<wchar_t> : __make_unsigned<__WCHAR_TYPE__>
   1618     { };
   1619 #endif
   1620 
   1621 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
   1622   template<>
   1623     struct __make_unsigned<__int128>
   1624     { typedef unsigned __int128 __type; };
   1625 #endif
   1626 
   1627   // Select between integral and enum: not possible to be both.
   1628   template<typename _Tp, 
   1629 	   bool _IsInt = is_integral<_Tp>::value,
   1630 	   bool _IsEnum = is_enum<_Tp>::value>
   1631     class __make_unsigned_selector;
   1632 
   1633   template<typename _Tp>
   1634     class __make_unsigned_selector<_Tp, true, false>
   1635     {
   1636       typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
   1637       typedef typename __unsignedt::__type __unsigned_type;
   1638       typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
   1639 
   1640     public:
   1641       typedef typename __cv_unsigned::__type __type;
   1642     };
   1643 
   1644   template<typename _Tp>
   1645     class __make_unsigned_selector<_Tp, false, true>
   1646     {
   1647       // With -fshort-enums, an enum may be as small as a char.
   1648       typedef unsigned char __smallest;
   1649       static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
   1650       static const bool __b1 = sizeof(_Tp) <= sizeof(unsigned short);
   1651       static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int);
   1652       typedef conditional<__b2, unsigned int, unsigned long> __cond2;
   1653       typedef typename __cond2::type __cond2_type;
   1654       typedef conditional<__b1, unsigned short, __cond2_type> __cond1;
   1655       typedef typename __cond1::type __cond1_type;
   1656 
   1657     public:
   1658       typedef typename conditional<__b0, __smallest, __cond1_type>::type __type;
   1659     };
   1660 
   1661   // Given an integral/enum type, return the corresponding unsigned
   1662   // integer type.
   1663   // Primary template.
   1664   /// make_unsigned
   1665   template<typename _Tp>
   1666     struct make_unsigned 
   1667     { typedef typename __make_unsigned_selector<_Tp>::__type type; };
   1668 
   1669   // Integral, but don't define.
   1670   template<>
   1671     struct make_unsigned<bool>;
   1672 
   1673 
   1674   // Utility for finding the signed versions of unsigned integral types.
   1675   template<typename _Tp>
   1676     struct __make_signed
   1677     { typedef _Tp __type; };
   1678 
   1679   template<>
   1680     struct __make_signed<char>
   1681     { typedef signed char __type; };
   1682 
   1683   template<>
   1684     struct __make_signed<unsigned char>
   1685     { typedef signed char __type; };
   1686 
   1687   template<>
   1688     struct __make_signed<unsigned short>
   1689     { typedef signed short __type; };
   1690 
   1691   template<>
   1692     struct __make_signed<unsigned int>
   1693     { typedef signed int __type; };
   1694 
   1695   template<>
   1696     struct __make_signed<unsigned long>
   1697     { typedef signed long __type; };
   1698 
   1699   template<>
   1700     struct __make_signed<unsigned long long>
   1701     { typedef signed long long __type; };
   1702 
   1703 #if defined(_GLIBCXX_USE_WCHAR_T) && defined(__WCHAR_UNSIGNED__)
   1704   template<>
   1705     struct __make_signed<wchar_t> : __make_signed<__WCHAR_TYPE__>
   1706     { };
   1707 #endif
   1708 
   1709 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
   1710   template<>
   1711     struct __make_signed<char16_t> : __make_signed<uint_least16_t>
   1712     { };
   1713   template<>
   1714     struct __make_signed<char32_t> : __make_signed<uint_least32_t>
   1715     { };
   1716 #endif
   1717 
   1718 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
   1719   template<>
   1720     struct __make_signed<unsigned __int128>
   1721     { typedef __int128 __type; };
   1722 #endif
   1723 
   1724   // Select between integral and enum: not possible to be both.
   1725   template<typename _Tp, 
   1726 	   bool _IsInt = is_integral<_Tp>::value,
   1727 	   bool _IsEnum = is_enum<_Tp>::value>
   1728     class __make_signed_selector;
   1729 
   1730   template<typename _Tp>
   1731     class __make_signed_selector<_Tp, true, false>
   1732     {
   1733       typedef __make_signed<typename remove_cv<_Tp>::type> __signedt;
   1734       typedef typename __signedt::__type __signed_type;
   1735       typedef __match_cv_qualifiers<_Tp, __signed_type> __cv_signed;
   1736 
   1737     public:
   1738       typedef typename __cv_signed::__type __type;
   1739     };
   1740 
   1741   template<typename _Tp>
   1742     class __make_signed_selector<_Tp, false, true>
   1743     {
   1744       // With -fshort-enums, an enum may be as small as a char.
   1745       typedef signed char __smallest;
   1746       static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
   1747       static const bool __b1 = sizeof(_Tp) <= sizeof(signed short);
   1748       static const bool __b2 = sizeof(_Tp) <= sizeof(signed int);
   1749       typedef conditional<__b2, signed int, signed long> __cond2;
   1750       typedef typename __cond2::type __cond2_type;
   1751       typedef conditional<__b1, signed short, __cond2_type> __cond1;
   1752       typedef typename __cond1::type __cond1_type;
   1753 
   1754     public:
   1755       typedef typename conditional<__b0, __smallest, __cond1_type>::type __type;
   1756     };
   1757 
   1758   // Given an integral/enum type, return the corresponding signed
   1759   // integer type.
   1760   // Primary template.
   1761   /// make_signed
   1762   template<typename _Tp>
   1763     struct make_signed 
   1764     { typedef typename __make_signed_selector<_Tp>::__type type; };
   1765 
   1766   // Integral, but don't define.
   1767   template<>
   1768     struct make_signed<bool>;
   1769 
   1770 #if __cplusplus > 201103L
   1771   /// Alias template for make_signed
   1772   template<typename _Tp>
   1773     using make_signed_t = typename make_signed<_Tp>::type;
   1774 
   1775   /// Alias template for make_unsigned
   1776   template<typename _Tp>
   1777     using make_unsigned_t = typename make_unsigned<_Tp>::type;
   1778 #endif
   1779 
   1780   // Array modifications.
   1781 
   1782   /// remove_extent
   1783   template<typename _Tp>
   1784     struct remove_extent
   1785     { typedef _Tp     type; };
   1786 
   1787   template<typename _Tp, std::size_t _Size>
   1788     struct remove_extent<_Tp[_Size]>
   1789     { typedef _Tp     type; };
   1790 
   1791   template<typename _Tp>
   1792     struct remove_extent<_Tp[]>
   1793     { typedef _Tp     type; };
   1794 
   1795   /// remove_all_extents
   1796   template<typename _Tp>
   1797     struct remove_all_extents
   1798     { typedef _Tp     type; };
   1799 
   1800   template<typename _Tp, std::size_t _Size>
   1801     struct remove_all_extents<_Tp[_Size]>
   1802     { typedef typename remove_all_extents<_Tp>::type     type; };
   1803 
   1804   template<typename _Tp>
   1805     struct remove_all_extents<_Tp[]>
   1806     { typedef typename remove_all_extents<_Tp>::type     type; };
   1807 
   1808 #if __cplusplus > 201103L
   1809   /// Alias template for remove_extent
   1810   template<typename _Tp>
   1811     using remove_extent_t = typename remove_extent<_Tp>::type;
   1812 
   1813   /// Alias template for remove_all_extents
   1814   template<typename _Tp>
   1815     using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
   1816 #endif
   1817 
   1818   // Pointer modifications.
   1819 
   1820   template<typename _Tp, typename>
   1821     struct __remove_pointer_helper
   1822     { typedef _Tp     type; };
   1823 
   1824   template<typename _Tp, typename _Up>
   1825     struct __remove_pointer_helper<_Tp, _Up*>
   1826     { typedef _Up     type; };
   1827 
   1828   /// remove_pointer
   1829   template<typename _Tp>
   1830     struct remove_pointer
   1831     : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
   1832     { };
   1833 
   1834   /// add_pointer
   1835   template<typename _Tp, bool = __or_<__is_referenceable<_Tp>,
   1836 				      is_void<_Tp>>::value>
   1837     struct __add_pointer_helper
   1838     { typedef _Tp     type; };
   1839 
   1840   template<typename _Tp>
   1841     struct __add_pointer_helper<_Tp, true>
   1842     { typedef typename remove_reference<_Tp>::type*     type; };
   1843 
   1844   template<typename _Tp>
   1845     struct add_pointer 
   1846     : public __add_pointer_helper<_Tp>
   1847     { };
   1848 
   1849 #if __cplusplus > 201103L
   1850   /// Alias template for remove_pointer
   1851   template<typename _Tp>
   1852     using remove_pointer_t = typename remove_pointer<_Tp>::type;
   1853 
   1854   /// Alias template for add_pointer
   1855   template<typename _Tp>
   1856     using add_pointer_t = typename add_pointer<_Tp>::type;
   1857 #endif
   1858 
   1859   template<std::size_t _Len>
   1860     struct __aligned_storage_msa
   1861     { 
   1862       union __type
   1863       {
   1864 	unsigned char __data[_Len];
   1865 	struct __attribute__((__aligned__)) { } __align; 
   1866       };
   1867     };
   1868 
   1869   /**
   1870    *  @brief Alignment type.
   1871    *
   1872    *  The value of _Align is a default-alignment which shall be the
   1873    *  most stringent alignment requirement for any C++ object type
   1874    *  whose size is no greater than _Len (3.9). The member typedef
   1875    *  type shall be a POD type suitable for use as uninitialized
   1876    *  storage for any object whose size is at most _Len and whose
   1877    *  alignment is a divisor of _Align.
   1878   */
   1879   template<std::size_t _Len, std::size_t _Align =
   1880 	   __alignof__(typename __aligned_storage_msa<_Len>::__type)>
   1881     struct aligned_storage
   1882     { 
   1883       union type
   1884       {
   1885 	unsigned char __data[_Len];
   1886 	struct __attribute__((__aligned__((_Align)))) { } __align; 
   1887       };
   1888     };
   1889 
   1890 
   1891   // Decay trait for arrays and functions, used for perfect forwarding
   1892   // in make_pair, make_tuple, etc.
   1893   template<typename _Up, 
   1894 	   bool _IsArray = is_array<_Up>::value,
   1895 	   bool _IsFunction = is_function<_Up>::value> 
   1896     struct __decay_selector;
   1897 
   1898   // NB: DR 705.
   1899   template<typename _Up> 
   1900     struct __decay_selector<_Up, false, false>
   1901     { typedef typename remove_cv<_Up>::type __type; };
   1902 
   1903   template<typename _Up> 
   1904     struct __decay_selector<_Up, true, false>
   1905     { typedef typename remove_extent<_Up>::type* __type; };
   1906 
   1907   template<typename _Up> 
   1908     struct __decay_selector<_Up, false, true>
   1909     { typedef typename add_pointer<_Up>::type __type; };
   1910 
   1911   /// decay
   1912   template<typename _Tp> 
   1913     class decay 
   1914     { 
   1915       typedef typename remove_reference<_Tp>::type __remove_type;
   1916 
   1917     public:
   1918       typedef typename __decay_selector<__remove_type>::__type type;
   1919     };
   1920 
   1921   template<typename _Tp>
   1922     class reference_wrapper;
   1923 
   1924   // Helper which adds a reference to a type when given a reference_wrapper
   1925   template<typename _Tp>
   1926     struct __strip_reference_wrapper
   1927     {
   1928       typedef _Tp __type;
   1929     };
   1930 
   1931   template<typename _Tp>
   1932     struct __strip_reference_wrapper<reference_wrapper<_Tp> >
   1933     {
   1934       typedef _Tp& __type;
   1935     };
   1936 
   1937   template<typename _Tp>
   1938     struct __decay_and_strip
   1939     {
   1940       typedef typename __strip_reference_wrapper<
   1941 	typename decay<_Tp>::type>::__type __type;
   1942     };
   1943 
   1944 
   1945   // Primary template.
   1946   /// Define a member typedef @c type only if a boolean constant is true.
   1947   template<bool, typename _Tp = void>
   1948     struct enable_if 
   1949     { };
   1950 
   1951   // Partial specialization for true.
   1952   template<typename _Tp>
   1953     struct enable_if<true, _Tp>
   1954     { typedef _Tp type; };
   1955 
   1956   template<typename... _Cond>
   1957     using _Require = typename enable_if<__and_<_Cond...>::value>::type;
   1958 
   1959   // Primary template.
   1960   /// Define a member typedef @c type to one of two argument types.
   1961   template<bool _Cond, typename _Iftrue, typename _Iffalse>
   1962     struct conditional
   1963     { typedef _Iftrue type; };
   1964 
   1965   // Partial specialization for false.
   1966   template<typename _Iftrue, typename _Iffalse>
   1967     struct conditional<false, _Iftrue, _Iffalse>
   1968     { typedef _Iffalse type; };
   1969 
   1970   /// common_type
   1971   template<typename... _Tp>
   1972     struct common_type;
   1973 
   1974   // Sfinae-friendly common_type implementation:
   1975 
   1976   struct __do_common_type_impl
   1977   {
   1978     template<typename _Tp, typename _Up>
   1979       static __success_type<typename decay<decltype
   1980 			    (true ? std::declval<_Tp>()
   1981 			     : std::declval<_Up>())>::type> _S_test(int);
   1982 
   1983     template<typename, typename>
   1984       static __failure_type _S_test(...);
   1985   };
   1986 
   1987   template<typename _Tp, typename _Up>
   1988     struct __common_type_impl
   1989     : private __do_common_type_impl
   1990     {
   1991 #if !defined (__ANDROID__)
   1992       typedef decltype(_S_test<_Tp, _Up>(0)) type;
   1993 #else
   1994       typedef typename decay<decltype(_S_test<_Tp, _Up>(0))>::type type;
   1995 #endif
   1996     };
   1997 
   1998   struct __do_member_type_wrapper
   1999   {
   2000     template<typename _Tp>
   2001       static __success_type<typename _Tp::type> _S_test(int);
   2002 
   2003     template<typename>
   2004       static __failure_type _S_test(...);
   2005   };
   2006 
   2007   template<typename _Tp>
   2008     struct __member_type_wrapper
   2009     : private __do_member_type_wrapper
   2010     {
   2011       typedef decltype(_S_test<_Tp>(0)) type;
   2012     };
   2013 
   2014   template<typename _CTp, typename... _Args>
   2015     struct __expanded_common_type_wrapper
   2016     {
   2017       typedef common_type<typename _CTp::type, _Args...> type;
   2018     };
   2019 
   2020   template<typename... _Args>
   2021     struct __expanded_common_type_wrapper<__failure_type, _Args...>
   2022     { typedef __failure_type type; };
   2023 
   2024   template<typename _Tp>
   2025     struct common_type<_Tp>
   2026     { typedef typename decay<_Tp>::type type; };
   2027 
   2028   template<typename _Tp, typename _Up>
   2029     struct common_type<_Tp, _Up>
   2030     : public __common_type_impl<_Tp, _Up>::type
   2031     { };
   2032 
   2033   template<typename _Tp, typename _Up, typename... _Vp>
   2034     struct common_type<_Tp, _Up, _Vp...>
   2035     : public __expanded_common_type_wrapper<typename __member_type_wrapper<
   2036                common_type<_Tp, _Up>>::type, _Vp...>::type
   2037     { };
   2038 
   2039   /// The underlying type of an enum.
   2040   template<typename _Tp>
   2041     struct underlying_type
   2042     {
   2043       typedef __underlying_type(_Tp) type;
   2044     };
   2045 
   2046   template<typename _Tp>
   2047     struct __declval_protector
   2048     {
   2049       static const bool __stop = false;
   2050       static typename add_rvalue_reference<_Tp>::type __delegate();
   2051     };
   2052 
   2053   template<typename _Tp>
   2054     inline typename add_rvalue_reference<_Tp>::type
   2055     declval() noexcept
   2056     {
   2057       static_assert(__declval_protector<_Tp>::__stop,
   2058 		    "declval() must not be used!");
   2059       return __declval_protector<_Tp>::__delegate();
   2060     }
   2061 
   2062   /// result_of
   2063   template<typename _Signature>
   2064     class result_of;
   2065 
   2066   // Sfinae-friendly result_of implementation:
   2067 
   2068 #define __cpp_lib_result_of_sfinae 201210
   2069 
   2070   // [func.require] paragraph 1 bullet 1:
   2071   struct __result_of_memfun_ref_impl
   2072   {
   2073     template<typename _Fp, typename _Tp1, typename... _Args>
   2074       static __success_type<decltype(
   2075       (std::declval<_Tp1>().*std::declval<_Fp>())(std::declval<_Args>()...)
   2076       )> _S_test(int);
   2077 
   2078     template<typename...>
   2079       static __failure_type _S_test(...);
   2080   };
   2081 
   2082   template<typename _MemPtr, typename _Arg, typename... _Args>
   2083     struct __result_of_memfun_ref
   2084     : private __result_of_memfun_ref_impl
   2085     {
   2086       typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
   2087     };
   2088 
   2089   // [func.require] paragraph 1 bullet 2:
   2090   struct __result_of_memfun_deref_impl
   2091   {
   2092     template<typename _Fp, typename _Tp1, typename... _Args>
   2093       static __success_type<decltype(
   2094       ((*std::declval<_Tp1>()).*std::declval<_Fp>())(std::declval<_Args>()...)
   2095       )> _S_test(int);
   2096 
   2097     template<typename...>
   2098       static __failure_type _S_test(...);
   2099   };
   2100 
   2101   template<typename _MemPtr, typename _Arg, typename... _Args>
   2102     struct __result_of_memfun_deref
   2103     : private __result_of_memfun_deref_impl
   2104     {
   2105       typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
   2106     };
   2107 
   2108   // [func.require] paragraph 1 bullet 3:
   2109   struct __result_of_memobj_ref_impl
   2110   {
   2111     template<typename _Fp, typename _Tp1>
   2112       static __success_type<decltype(
   2113       std::declval<_Tp1>().*std::declval<_Fp>()
   2114       )> _S_test(int);
   2115 
   2116     template<typename, typename>
   2117       static __failure_type _S_test(...);
   2118   };
   2119 
   2120   template<typename _MemPtr, typename _Arg>
   2121     struct __result_of_memobj_ref
   2122     : private __result_of_memobj_ref_impl
   2123     {
   2124       typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
   2125     };
   2126 
   2127   // [func.require] paragraph 1 bullet 4:
   2128   struct __result_of_memobj_deref_impl
   2129   {
   2130     template<typename _Fp, typename _Tp1>
   2131       static __success_type<decltype(
   2132       (*std::declval<_Tp1>()).*std::declval<_Fp>()
   2133       )> _S_test(int);
   2134 
   2135     template<typename, typename>
   2136       static __failure_type _S_test(...);
   2137   };
   2138 
   2139   template<typename _MemPtr, typename _Arg>
   2140     struct __result_of_memobj_deref
   2141     : private __result_of_memobj_deref_impl
   2142     {
   2143       typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
   2144     };
   2145 
   2146   template<typename _MemPtr, typename _Arg>
   2147     struct __result_of_memobj;
   2148 
   2149   template<typename _Res, typename _Class, typename _Arg>
   2150     struct __result_of_memobj<_Res _Class::*, _Arg>
   2151     {
   2152       typedef typename remove_cv<typename remove_reference<
   2153         _Arg>::type>::type _Argval;
   2154       typedef _Res _Class::* _MemPtr;
   2155       typedef typename conditional<__or_<is_same<_Argval, _Class>,
   2156         is_base_of<_Class, _Argval>>::value,
   2157         __result_of_memobj_ref<_MemPtr, _Arg>,
   2158         __result_of_memobj_deref<_MemPtr, _Arg>
   2159       >::type::type type;
   2160     };
   2161 
   2162   template<typename _MemPtr, typename _Arg, typename... _Args>
   2163     struct __result_of_memfun;
   2164 
   2165   template<typename _Res, typename _Class, typename _Arg, typename... _Args>
   2166     struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
   2167     {
   2168       typedef typename remove_cv<typename remove_reference<
   2169         _Arg>::type>::type _Argval;
   2170       typedef _Res _Class::* _MemPtr;
   2171       typedef typename conditional<__or_<is_same<_Argval, _Class>,
   2172         is_base_of<_Class, _Argval>>::value,
   2173         __result_of_memfun_ref<_MemPtr, _Arg, _Args...>,
   2174         __result_of_memfun_deref<_MemPtr, _Arg, _Args...>
   2175       >::type::type type;
   2176     };
   2177 
   2178   template<bool, bool, typename _Functor, typename... _ArgTypes>
   2179     struct __result_of_impl
   2180     {
   2181       typedef __failure_type type;
   2182     };
   2183 
   2184   template<typename _MemPtr, typename _Arg>
   2185     struct __result_of_impl<true, false, _MemPtr, _Arg>
   2186     : public __result_of_memobj<typename decay<_MemPtr>::type, _Arg>
   2187     { };
   2188 
   2189   template<typename _MemPtr, typename _Arg, typename... _Args>
   2190     struct __result_of_impl<false, true, _MemPtr, _Arg, _Args...>
   2191     : public __result_of_memfun<typename decay<_MemPtr>::type, _Arg, _Args...>
   2192     { };
   2193 
   2194   // [func.require] paragraph 1 bullet 5:
   2195   struct __result_of_other_impl
   2196   {
   2197     template<typename _Fn, typename... _Args>
   2198       static __success_type<decltype(
   2199       std::declval<_Fn>()(std::declval<_Args>()...)
   2200       )> _S_test(int);
   2201 
   2202     template<typename...>
   2203       static __failure_type _S_test(...);
   2204   };
   2205 
   2206   template<typename _Functor, typename... _ArgTypes>
   2207     struct __result_of_impl<false, false, _Functor, _ArgTypes...>
   2208     : private __result_of_other_impl
   2209     {
   2210       typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
   2211     };
   2212 
   2213   template<typename _Functor, typename... _ArgTypes>
   2214     struct result_of<_Functor(_ArgTypes...)>
   2215     : public __result_of_impl<
   2216         is_member_object_pointer<
   2217           typename remove_reference<_Functor>::type
   2218         >::value,
   2219         is_member_function_pointer<
   2220           typename remove_reference<_Functor>::type
   2221         >::value,
   2222 	    _Functor, _ArgTypes...
   2223       >::type
   2224     { };
   2225 
   2226 #if __cplusplus > 201103L
   2227   /// Alias template for aligned_storage
   2228   template<size_t _Len, size_t _Align =
   2229 	    __alignof__(typename __aligned_storage_msa<_Len>::__type)>
   2230     using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
   2231 
   2232   /// Alias template for decay
   2233   template<typename _Tp>
   2234     using decay_t = typename decay<_Tp>::type;
   2235 
   2236   /// Alias template for enable_if
   2237   template<bool _Cond, typename _Tp = void>
   2238     using enable_if_t = typename enable_if<_Cond, _Tp>::type;
   2239 
   2240   /// Alias template for conditional
   2241   template<bool _Cond, typename _Iftrue, typename _Iffalse>
   2242     using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;
   2243 
   2244   /// Alias template for common_type
   2245   template<typename... _Tp>
   2246     using common_type_t = typename common_type<_Tp...>::type;
   2247 
   2248   /// Alias template for underlying_type
   2249   template<typename _Tp>
   2250     using underlying_type_t = typename underlying_type<_Tp>::type;
   2251 
   2252   /// Alias template for result_of
   2253   template<typename _Tp>
   2254     using result_of_t = typename result_of<_Tp>::type;
   2255 #endif
   2256 
   2257   /// @} group metaprogramming
   2258 	
   2259   /**
   2260    *  Use SFINAE to determine if the type _Tp has a publicly-accessible
   2261    *  member type _NTYPE.
   2262    */
   2263 #define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE)				\
   2264   template<typename _Tp>						\
   2265     class __has_##_NTYPE##_helper					\
   2266     {									\
   2267       template<typename _Up>						\
   2268 	struct _Wrap_type						\
   2269 	{ };								\
   2270 									\
   2271       template<typename _Up>						\
   2272 	static true_type __test(_Wrap_type<typename _Up::_NTYPE>*);	\
   2273 									\
   2274       template<typename _Up>						\
   2275 	static false_type __test(...);					\
   2276 									\
   2277     public:								\
   2278       typedef decltype(__test<_Tp>(0)) type;				\
   2279     };									\
   2280 									\
   2281   template<typename _Tp>						\
   2282     struct __has_##_NTYPE						\
   2283     : public __has_##_NTYPE##_helper					\
   2284 			<typename remove_cv<_Tp>::type>::type		\
   2285     { };
   2286 
   2287 _GLIBCXX_END_NAMESPACE_VERSION
   2288 } // namespace std
   2289 
   2290 #endif  // C++11
   2291 
   2292 #endif  // _GLIBCXX_TYPE_TRAITS
   2293