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