libstdc++
type_traits
Go to the documentation of this file.
1 // C++11 <type_traits> -*- C++ -*-
2 
3 // Copyright (C) 2007-2018 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 namespace std _GLIBCXX_VISIBILITY(default)
41 {
42 _GLIBCXX_BEGIN_NAMESPACE_VERSION
43 
44  /**
45  * @defgroup metaprogramming Metaprogramming
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() const noexcept { return value; }
63 #if __cplusplus > 201103L
64 
65 #define __cpp_lib_integral_constant_callable 201304
66 
67  constexpr value_type operator()() const noexcept { return value; }
68 #endif
69  };
70 
71  template<typename _Tp, _Tp __v>
72  constexpr _Tp integral_constant<_Tp, __v>::value;
73 
74  /// The type used as a compile-time boolean with true value.
75  typedef integral_constant<bool, true> true_type;
76 
77  /// The type used as a compile-time boolean with false value.
78  typedef integral_constant<bool, false> false_type;
79 
80  template<bool __v>
81  using __bool_constant = integral_constant<bool, __v>;
82 
83 #if __cplusplus > 201402L
84 # define __cpp_lib_bool_constant 201505
85  template<bool __v>
86  using bool_constant = integral_constant<bool, __v>;
87 #endif
88 
89  // Meta programming helper types.
90 
91  template<bool, typename, typename>
92  struct conditional;
93 
94  template<typename...>
95  struct __or_;
96 
97  template<>
98  struct __or_<>
99  : public false_type
100  { };
101 
102  template<typename _B1>
103  struct __or_<_B1>
104  : public _B1
105  { };
106 
107  template<typename _B1, typename _B2>
108  struct __or_<_B1, _B2>
109  : public conditional<_B1::value, _B1, _B2>::type
110  { };
111 
112  template<typename _B1, typename _B2, typename _B3, typename... _Bn>
113  struct __or_<_B1, _B2, _B3, _Bn...>
114  : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type
115  { };
116 
117  template<typename...>
118  struct __and_;
119 
120  template<>
121  struct __and_<>
122  : public true_type
123  { };
124 
125  template<typename _B1>
126  struct __and_<_B1>
127  : public _B1
128  { };
129 
130  template<typename _B1, typename _B2>
131  struct __and_<_B1, _B2>
132  : public conditional<_B1::value, _B2, _B1>::type
133  { };
134 
135  template<typename _B1, typename _B2, typename _B3, typename... _Bn>
136  struct __and_<_B1, _B2, _B3, _Bn...>
137  : public conditional<_B1::value, __and_<_B2, _B3, _Bn...>, _B1>::type
138  { };
139 
140  template<typename _Pp>
141  struct __not_
142  : public __bool_constant<!bool(_Pp::value)>
143  { };
144 
145 #if __cplusplus >= 201703L
146 
147 #define __cpp_lib_logical_traits 201510
148 
149  template<typename... _Bn>
150  struct conjunction
151  : __and_<_Bn...>
152  { };
153 
154  template<typename... _Bn>
155  struct disjunction
156  : __or_<_Bn...>
157  { };
158 
159  template<typename _Pp>
160  struct negation
161  : __not_<_Pp>
162  { };
163 
164  template<typename... _Bn>
165  inline constexpr bool conjunction_v = conjunction<_Bn...>::value;
166 
167  template<typename... _Bn>
168  inline constexpr bool disjunction_v = disjunction<_Bn...>::value;
169 
170  template<typename _Pp>
171  inline constexpr bool negation_v = negation<_Pp>::value;
172 
173 #endif // C++17
174 
175  // For several sfinae-friendly trait implementations we transport both the
176  // result information (as the member type) and the failure information (no
177  // member type). This is very similar to std::enable_if, but we cannot use
178  // them, because we need to derive from them as an implementation detail.
179 
180  template<typename _Tp>
181  struct __success_type
182  { typedef _Tp type; };
183 
184  struct __failure_type
185  { };
186 
187  // Primary type categories.
188 
189  template<typename>
190  struct remove_cv;
191 
192  template<typename>
193  struct __is_void_helper
194  : public false_type { };
195 
196  template<>
197  struct __is_void_helper<void>
198  : public true_type { };
199 
200  /// is_void
201  template<typename _Tp>
202  struct is_void
203  : public __is_void_helper<typename remove_cv<_Tp>::type>::type
204  { };
205 
206  template<typename>
207  struct __is_integral_helper
208  : public false_type { };
209 
210  template<>
211  struct __is_integral_helper<bool>
212  : public true_type { };
213 
214  template<>
215  struct __is_integral_helper<char>
216  : public true_type { };
217 
218  template<>
219  struct __is_integral_helper<signed char>
220  : public true_type { };
221 
222  template<>
223  struct __is_integral_helper<unsigned char>
224  : public true_type { };
225 
226 #ifdef _GLIBCXX_USE_WCHAR_T
227  template<>
228  struct __is_integral_helper<wchar_t>
229  : public true_type { };
230 #endif
231 
232  template<>
233  struct __is_integral_helper<char16_t>
234  : public true_type { };
235 
236  template<>
237  struct __is_integral_helper<char32_t>
238  : public true_type { };
239 
240  template<>
241  struct __is_integral_helper<short>
242  : public true_type { };
243 
244  template<>
245  struct __is_integral_helper<unsigned short>
246  : public true_type { };
247 
248  template<>
249  struct __is_integral_helper<int>
250  : public true_type { };
251 
252  template<>
253  struct __is_integral_helper<unsigned int>
254  : public true_type { };
255 
256  template<>
257  struct __is_integral_helper<long>
258  : public true_type { };
259 
260  template<>
261  struct __is_integral_helper<unsigned long>
262  : public true_type { };
263 
264  template<>
265  struct __is_integral_helper<long long>
266  : public true_type { };
267 
268  template<>
269  struct __is_integral_helper<unsigned long long>
270  : public true_type { };
271 
272  // Conditionalizing on __STRICT_ANSI__ here will break any port that
273  // uses one of these types for size_t.
274 #if defined(__GLIBCXX_TYPE_INT_N_0)
275  template<>
276  struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_0>
277  : public true_type { };
278 
279  template<>
280  struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_0>
281  : public true_type { };
282 #endif
283 #if defined(__GLIBCXX_TYPE_INT_N_1)
284  template<>
285  struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_1>
286  : public true_type { };
287 
288  template<>
289  struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_1>
290  : public true_type { };
291 #endif
292 #if defined(__GLIBCXX_TYPE_INT_N_2)
293  template<>
294  struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_2>
295  : public true_type { };
296 
297  template<>
298  struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_2>
299  : public true_type { };
300 #endif
301 #if defined(__GLIBCXX_TYPE_INT_N_3)
302  template<>
303  struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_3>
304  : public true_type { };
305 
306  template<>
307  struct __is_integral_helper<unsigned __GLIBCXX_TYPE_INT_N_3>
308  : public true_type { };
309 #endif
310 
311  /// is_integral
312  template<typename _Tp>
313  struct is_integral
314  : public __is_integral_helper<typename remove_cv<_Tp>::type>::type
315  { };
316 
317  template<typename>
318  struct __is_floating_point_helper
319  : public false_type { };
320 
321  template<>
322  struct __is_floating_point_helper<float>
323  : public true_type { };
324 
325  template<>
326  struct __is_floating_point_helper<double>
327  : public true_type { };
328 
329  template<>
330  struct __is_floating_point_helper<long double>
331  : public true_type { };
332 
333 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
334  template<>
335  struct __is_floating_point_helper<__float128>
336  : public true_type { };
337 #endif
338 
339  /// is_floating_point
340  template<typename _Tp>
341  struct is_floating_point
342  : public __is_floating_point_helper<typename remove_cv<_Tp>::type>::type
343  { };
344 
345  /// is_array
346  template<typename>
347  struct is_array
348  : public false_type { };
349 
350  template<typename _Tp, std::size_t _Size>
351  struct is_array<_Tp[_Size]>
352  : public true_type { };
353 
354  template<typename _Tp>
355  struct is_array<_Tp[]>
356  : public true_type { };
357 
358  template<typename>
359  struct __is_pointer_helper
360  : public false_type { };
361 
362  template<typename _Tp>
363  struct __is_pointer_helper<_Tp*>
364  : public true_type { };
365 
366  /// is_pointer
367  template<typename _Tp>
368  struct is_pointer
369  : public __is_pointer_helper<typename remove_cv<_Tp>::type>::type
370  { };
371 
372  /// is_lvalue_reference
373  template<typename>
374  struct is_lvalue_reference
375  : public false_type { };
376 
377  template<typename _Tp>
378  struct is_lvalue_reference<_Tp&>
379  : public true_type { };
380 
381  /// is_rvalue_reference
382  template<typename>
383  struct is_rvalue_reference
384  : public false_type { };
385 
386  template<typename _Tp>
387  struct is_rvalue_reference<_Tp&&>
388  : public true_type { };
389 
390  template<typename>
391  struct is_function;
392 
393  template<typename>
394  struct __is_member_object_pointer_helper
395  : public false_type { };
396 
397  template<typename _Tp, typename _Cp>
398  struct __is_member_object_pointer_helper<_Tp _Cp::*>
399  : public integral_constant<bool, !is_function<_Tp>::value> { };
400 
401  /// is_member_object_pointer
402  template<typename _Tp>
403  struct is_member_object_pointer
404  : public __is_member_object_pointer_helper<
405  typename remove_cv<_Tp>::type>::type
406  { };
407 
408  template<typename>
409  struct __is_member_function_pointer_helper
410  : public false_type { };
411 
412  template<typename _Tp, typename _Cp>
413  struct __is_member_function_pointer_helper<_Tp _Cp::*>
414  : public integral_constant<bool, is_function<_Tp>::value> { };
415 
416  /// is_member_function_pointer
417  template<typename _Tp>
418  struct is_member_function_pointer
419  : public __is_member_function_pointer_helper<
420  typename remove_cv<_Tp>::type>::type
421  { };
422 
423  /// is_enum
424  template<typename _Tp>
425  struct is_enum
426  : public integral_constant<bool, __is_enum(_Tp)>
427  { };
428 
429  /// is_union
430  template<typename _Tp>
431  struct is_union
432  : public integral_constant<bool, __is_union(_Tp)>
433  { };
434 
435  /// is_class
436  template<typename _Tp>
437  struct is_class
438  : public integral_constant<bool, __is_class(_Tp)>
439  { };
440 
441  /// is_function
442  template<typename>
443  struct is_function
444  : public false_type { };
445 
446  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
447  struct is_function<_Res(_ArgTypes...) _GLIBCXX_NOEXCEPT_QUAL>
448  : public true_type { };
449 
450  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
451  struct is_function<_Res(_ArgTypes...) & _GLIBCXX_NOEXCEPT_QUAL>
452  : public true_type { };
453 
454  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
455  struct is_function<_Res(_ArgTypes...) && _GLIBCXX_NOEXCEPT_QUAL>
456  : public true_type { };
457 
458  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
459  struct is_function<_Res(_ArgTypes......) _GLIBCXX_NOEXCEPT_QUAL>
460  : public true_type { };
461 
462  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
463  struct is_function<_Res(_ArgTypes......) & _GLIBCXX_NOEXCEPT_QUAL>
464  : public true_type { };
465 
466  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
467  struct is_function<_Res(_ArgTypes......) && _GLIBCXX_NOEXCEPT_QUAL>
468  : public true_type { };
469 
470  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
471  struct is_function<_Res(_ArgTypes...) const _GLIBCXX_NOEXCEPT_QUAL>
472  : public true_type { };
473 
474  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
475  struct is_function<_Res(_ArgTypes...) const & _GLIBCXX_NOEXCEPT_QUAL>
476  : public true_type { };
477 
478  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
479  struct is_function<_Res(_ArgTypes...) const && _GLIBCXX_NOEXCEPT_QUAL>
480  : public true_type { };
481 
482  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
483  struct is_function<_Res(_ArgTypes......) const _GLIBCXX_NOEXCEPT_QUAL>
484  : public true_type { };
485 
486  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
487  struct is_function<_Res(_ArgTypes......) const & _GLIBCXX_NOEXCEPT_QUAL>
488  : public true_type { };
489 
490  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
491  struct is_function<_Res(_ArgTypes......) const && _GLIBCXX_NOEXCEPT_QUAL>
492  : public true_type { };
493 
494  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
495  struct is_function<_Res(_ArgTypes...) volatile _GLIBCXX_NOEXCEPT_QUAL>
496  : public true_type { };
497 
498  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
499  struct is_function<_Res(_ArgTypes...) volatile & _GLIBCXX_NOEXCEPT_QUAL>
500  : public true_type { };
501 
502  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
503  struct is_function<_Res(_ArgTypes...) volatile && _GLIBCXX_NOEXCEPT_QUAL>
504  : public true_type { };
505 
506  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
507  struct is_function<_Res(_ArgTypes......) volatile _GLIBCXX_NOEXCEPT_QUAL>
508  : public true_type { };
509 
510  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
511  struct is_function<_Res(_ArgTypes......) volatile & _GLIBCXX_NOEXCEPT_QUAL>
512  : public true_type { };
513 
514  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
515  struct is_function<_Res(_ArgTypes......) volatile && _GLIBCXX_NOEXCEPT_QUAL>
516  : public true_type { };
517 
518  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
519  struct is_function<_Res(_ArgTypes...) const volatile _GLIBCXX_NOEXCEPT_QUAL>
520  : public true_type { };
521 
522  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
523  struct is_function<_Res(_ArgTypes...) const volatile & _GLIBCXX_NOEXCEPT_QUAL>
524  : public true_type { };
525 
526  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
527  struct is_function<_Res(_ArgTypes...) const volatile && _GLIBCXX_NOEXCEPT_QUAL>
528  : public true_type { };
529 
530  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
531  struct is_function<_Res(_ArgTypes......) const volatile _GLIBCXX_NOEXCEPT_QUAL>
532  : public true_type { };
533 
534  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
535  struct is_function<_Res(_ArgTypes......) const volatile & _GLIBCXX_NOEXCEPT_QUAL>
536  : public true_type { };
537 
538  template<typename _Res, typename... _ArgTypes _GLIBCXX_NOEXCEPT_PARM>
539  struct is_function<_Res(_ArgTypes......) const volatile && _GLIBCXX_NOEXCEPT_QUAL>
540  : public true_type { };
541 
542 #define __cpp_lib_is_null_pointer 201309
543 
544  template<typename>
545  struct __is_null_pointer_helper
546  : public false_type { };
547 
548  template<>
549  struct __is_null_pointer_helper<std::nullptr_t>
550  : public true_type { };
551 
552  /// is_null_pointer (LWG 2247).
553  template<typename _Tp>
554  struct is_null_pointer
555  : public __is_null_pointer_helper<typename remove_cv<_Tp>::type>::type
556  { };
557 
558  /// __is_nullptr_t (extension).
559  template<typename _Tp>
560  struct __is_nullptr_t
561  : public is_null_pointer<_Tp>
562  { };
563 
564  // Composite type categories.
565 
566  /// is_reference
567  template<typename _Tp>
568  struct is_reference
569  : public __or_<is_lvalue_reference<_Tp>,
570  is_rvalue_reference<_Tp>>::type
571  { };
572 
573  /// is_arithmetic
574  template<typename _Tp>
575  struct is_arithmetic
576  : public __or_<is_integral<_Tp>, is_floating_point<_Tp>>::type
577  { };
578 
579  /// is_fundamental
580  template<typename _Tp>
581  struct is_fundamental
582  : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
583  is_null_pointer<_Tp>>::type
584  { };
585 
586  /// is_object
587  template<typename _Tp>
588  struct is_object
589  : public __not_<__or_<is_function<_Tp>, is_reference<_Tp>,
590  is_void<_Tp>>>::type
591  { };
592 
593  template<typename>
594  struct is_member_pointer;
595 
596  /// is_scalar
597  template<typename _Tp>
598  struct is_scalar
599  : public __or_<is_arithmetic<_Tp>, is_enum<_Tp>, is_pointer<_Tp>,
600  is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type
601  { };
602 
603  /// is_compound
604  template<typename _Tp>
605  struct is_compound
606  : public integral_constant<bool, !is_fundamental<_Tp>::value> { };
607 
608  template<typename _Tp>
609  struct __is_member_pointer_helper
610  : public false_type { };
611 
612  template<typename _Tp, typename _Cp>
613  struct __is_member_pointer_helper<_Tp _Cp::*>
614  : public true_type { };
615 
616  /// is_member_pointer
617  template<typename _Tp>
618  struct is_member_pointer
619  : public __is_member_pointer_helper<typename remove_cv<_Tp>::type>::type
620  { };
621 
622  // Utility to detect referenceable types ([defns.referenceable]).
623 
624  template<typename _Tp>
625  struct __is_referenceable
626  : public __or_<is_object<_Tp>, is_reference<_Tp>>::type
627  { };
628 
629  template<typename _Res, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
630  struct __is_referenceable<_Res(_Args...) _GLIBCXX_NOEXCEPT_QUAL>
631  : public true_type
632  { };
633 
634  template<typename _Res, typename... _Args _GLIBCXX_NOEXCEPT_PARM>
635  struct __is_referenceable<_Res(_Args......) _GLIBCXX_NOEXCEPT_QUAL>
636  : public true_type
637  { };
638 
639  // Type properties.
640 
641  /// is_const
642  template<typename>
643  struct is_const
644  : public false_type { };
645 
646  template<typename _Tp>
647  struct is_const<_Tp const>
648  : public true_type { };
649 
650  /// is_volatile
651  template<typename>
652  struct is_volatile
653  : public false_type { };
654 
655  template<typename _Tp>
656  struct is_volatile<_Tp volatile>
657  : public true_type { };
658 
659  /// is_trivial
660  template<typename _Tp>
661  struct is_trivial
662  : public integral_constant<bool, __is_trivial(_Tp)>
663  { };
664 
665  // is_trivially_copyable
666  template<typename _Tp>
667  struct is_trivially_copyable
668  : public integral_constant<bool, __is_trivially_copyable(_Tp)>
669  { };
670 
671  /// is_standard_layout
672  template<typename _Tp>
673  struct is_standard_layout
674  : public integral_constant<bool, __is_standard_layout(_Tp)>
675  { };
676 
677  /// is_pod
678  // Could use is_standard_layout && is_trivial instead of the builtin.
679  template<typename _Tp>
680  struct is_pod
681  : public integral_constant<bool, __is_pod(_Tp)>
682  { };
683 
684  /// is_literal_type
685  template<typename _Tp>
686  struct is_literal_type
687  : public integral_constant<bool, __is_literal_type(_Tp)>
688  { };
689 
690  /// is_empty
691  template<typename _Tp>
692  struct is_empty
693  : public integral_constant<bool, __is_empty(_Tp)>
694  { };
695 
696  /// is_polymorphic
697  template<typename _Tp>
698  struct is_polymorphic
699  : public integral_constant<bool, __is_polymorphic(_Tp)>
700  { };
701 
702 #if __cplusplus >= 201402L
703 #define __cpp_lib_is_final 201402L
704  /// is_final
705  template<typename _Tp>
706  struct is_final
707  : public integral_constant<bool, __is_final(_Tp)>
708  { };
709 #endif
710 
711  /// is_abstract
712  template<typename _Tp>
713  struct is_abstract
714  : public integral_constant<bool, __is_abstract(_Tp)>
715  { };
716 
717  template<typename _Tp,
718  bool = is_arithmetic<_Tp>::value>
719  struct __is_signed_helper
720  : public false_type { };
721 
722  template<typename _Tp>
723  struct __is_signed_helper<_Tp, true>
724  : public integral_constant<bool, _Tp(-1) < _Tp(0)>
725  { };
726 
727  /// is_signed
728  template<typename _Tp>
729  struct is_signed
730  : public __is_signed_helper<_Tp>::type
731  { };
732 
733  /// is_unsigned
734  template<typename _Tp>
735  struct is_unsigned
736  : public __and_<is_arithmetic<_Tp>, __not_<is_signed<_Tp>>>
737  { };
738 
739 
740  // Destructible and constructible type properties.
741 
742  /**
743  * @brief Utility to simplify expressions used in unevaluated operands
744  * @ingroup utilities
745  */
746 
747  template<typename _Tp, typename _Up = _Tp&&>
748  _Up
749  __declval(int);
750 
751  template<typename _Tp>
752  _Tp
753  __declval(long);
754 
755  template<typename _Tp>
756  auto declval() noexcept -> decltype(__declval<_Tp>(0));
757 
758  template<typename, unsigned = 0>
759  struct extent;
760 
761  template<typename>
762  struct remove_all_extents;
763 
764  template<typename _Tp>
765  struct __is_array_known_bounds
766  : public integral_constant<bool, (extent<_Tp>::value > 0)>
767  { };
768 
769  template<typename _Tp>
770  struct __is_array_unknown_bounds
771  : public __and_<is_array<_Tp>, __not_<extent<_Tp>>>
772  { };
773 
774  // In N3290 is_destructible does not say anything about function
775  // types and abstract types, see LWG 2049. This implementation
776  // describes function types as non-destructible and all complete
777  // object types as destructible, iff the explicit destructor
778  // call expression is wellformed.
779  struct __do_is_destructible_impl
780  {
781  template<typename _Tp, typename = decltype(declval<_Tp&>().~_Tp())>
782  static true_type __test(int);
783 
784  template<typename>
785  static false_type __test(...);
786  };
787 
788  template<typename _Tp>
789  struct __is_destructible_impl
790  : public __do_is_destructible_impl
791  {
792  typedef decltype(__test<_Tp>(0)) type;
793  };
794 
795  template<typename _Tp,
796  bool = __or_<is_void<_Tp>,
797  __is_array_unknown_bounds<_Tp>,
798  is_function<_Tp>>::value,
799  bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
800  struct __is_destructible_safe;
801 
802  template<typename _Tp>
803  struct __is_destructible_safe<_Tp, false, false>
804  : public __is_destructible_impl<typename
805  remove_all_extents<_Tp>::type>::type
806  { };
807 
808  template<typename _Tp>
809  struct __is_destructible_safe<_Tp, true, false>
810  : public false_type { };
811 
812  template<typename _Tp>
813  struct __is_destructible_safe<_Tp, false, true>
814  : public true_type { };
815 
816  /// is_destructible
817  template<typename _Tp>
818  struct is_destructible
819  : public __is_destructible_safe<_Tp>::type
820  { };
821 
822  // is_nothrow_destructible requires that is_destructible is
823  // satisfied as well. We realize that by mimicing the
824  // implementation of is_destructible but refer to noexcept(expr)
825  // instead of decltype(expr).
826  struct __do_is_nt_destructible_impl
827  {
828  template<typename _Tp>
829  static integral_constant<bool, noexcept(declval<_Tp&>().~_Tp())>
830  __test(int);
831 
832  template<typename>
833  static false_type __test(...);
834  };
835 
836  template<typename _Tp>
837  struct __is_nt_destructible_impl
838  : public __do_is_nt_destructible_impl
839  {
840  typedef decltype(__test<_Tp>(0)) type;
841  };
842 
843  template<typename _Tp,
844  bool = __or_<is_void<_Tp>,
845  __is_array_unknown_bounds<_Tp>,
846  is_function<_Tp>>::value,
847  bool = __or_<is_reference<_Tp>, is_scalar<_Tp>>::value>
848  struct __is_nt_destructible_safe;
849 
850  template<typename _Tp>
851  struct __is_nt_destructible_safe<_Tp, false, false>
852  : public __is_nt_destructible_impl<typename
853  remove_all_extents<_Tp>::type>::type
854  { };
855 
856  template<typename _Tp>
857  struct __is_nt_destructible_safe<_Tp, true, false>
858  : public false_type { };
859 
860  template<typename _Tp>
861  struct __is_nt_destructible_safe<_Tp, false, true>
862  : public true_type { };
863 
864  /// is_nothrow_destructible
865  template<typename _Tp>
866  struct is_nothrow_destructible
867  : public __is_nt_destructible_safe<_Tp>::type
868  { };
869 
870  struct __do_is_default_constructible_impl
871  {
872  template<typename _Tp, typename = decltype(_Tp())>
873  static true_type __test(int);
874 
875  template<typename>
876  static false_type __test(...);
877  };
878 
879  template<typename _Tp>
880  struct __is_default_constructible_impl
881  : public __do_is_default_constructible_impl
882  {
883  typedef decltype(__test<_Tp>(0)) type;
884  };
885 
886  template<typename _Tp>
887  struct __is_default_constructible_atom
888  : public __and_<__not_<is_void<_Tp>>,
889  __is_default_constructible_impl<_Tp>>
890  { };
891 
892  template<typename _Tp, bool = is_array<_Tp>::value>
893  struct __is_default_constructible_safe;
894 
895  // The following technique is a workaround for a current core language
896  // restriction, which does not allow for array types to occur in
897  // functional casts of the form T(). Complete arrays can be default-
898  // constructed, if the element type is default-constructible, but
899  // arrays with unknown bounds are not.
900  template<typename _Tp>
901  struct __is_default_constructible_safe<_Tp, true>
902  : public __and_<__is_array_known_bounds<_Tp>,
903  __is_default_constructible_atom<typename
904  remove_all_extents<_Tp>::type>>
905  { };
906 
907  template<typename _Tp>
908  struct __is_default_constructible_safe<_Tp, false>
909  : public __is_default_constructible_atom<_Tp>::type
910  { };
911 
912  /// is_default_constructible
913  template<typename _Tp>
914  struct is_default_constructible
915  : public __is_default_constructible_safe<_Tp>::type
916  { };
917 
918  /// is_constructible
919  template<typename _Tp, typename... _Args>
920  struct is_constructible
921  : public __bool_constant<__is_constructible(_Tp, _Args...)>
922  { };
923 
924  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
925  struct __is_copy_constructible_impl;
926 
927  template<typename _Tp>
928  struct __is_copy_constructible_impl<_Tp, false>
929  : public false_type { };
930 
931  template<typename _Tp>
932  struct __is_copy_constructible_impl<_Tp, true>
933  : public is_constructible<_Tp, const _Tp&>
934  { };
935 
936  /// is_copy_constructible
937  template<typename _Tp>
938  struct is_copy_constructible
939  : public __is_copy_constructible_impl<_Tp>
940  { };
941 
942  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
943  struct __is_move_constructible_impl;
944 
945  template<typename _Tp>
946  struct __is_move_constructible_impl<_Tp, false>
947  : public false_type { };
948 
949  template<typename _Tp>
950  struct __is_move_constructible_impl<_Tp, true>
951  : public is_constructible<_Tp, _Tp&&>
952  { };
953 
954  /// is_move_constructible
955  template<typename _Tp>
956  struct is_move_constructible
957  : public __is_move_constructible_impl<_Tp>
958  { };
959 
960  template<typename _Tp>
961  struct __is_nt_default_constructible_atom
962  : public integral_constant<bool, noexcept(_Tp())>
963  { };
964 
965  template<typename _Tp, bool = is_array<_Tp>::value>
966  struct __is_nt_default_constructible_impl;
967 
968  template<typename _Tp>
969  struct __is_nt_default_constructible_impl<_Tp, true>
970  : public __and_<__is_array_known_bounds<_Tp>,
971  __is_nt_default_constructible_atom<typename
972  remove_all_extents<_Tp>::type>>
973  { };
974 
975  template<typename _Tp>
976  struct __is_nt_default_constructible_impl<_Tp, false>
977  : public __is_nt_default_constructible_atom<_Tp>
978  { };
979 
980  /// is_nothrow_default_constructible
981  template<typename _Tp>
982  struct is_nothrow_default_constructible
983  : public __and_<is_default_constructible<_Tp>,
984  __is_nt_default_constructible_impl<_Tp>>
985  { };
986 
987  template<typename _Tp, typename... _Args>
988  struct __is_nt_constructible_impl
989  : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))>
990  { };
991 
992  template<typename _Tp, typename _Arg>
993  struct __is_nt_constructible_impl<_Tp, _Arg>
994  : public integral_constant<bool,
995  noexcept(static_cast<_Tp>(declval<_Arg>()))>
996  { };
997 
998  template<typename _Tp>
999  struct __is_nt_constructible_impl<_Tp>
1000  : public is_nothrow_default_constructible<_Tp>
1001  { };
1002 
1003  /// is_nothrow_constructible
1004  template<typename _Tp, typename... _Args>
1005  struct is_nothrow_constructible
1006  : public __and_<is_constructible<_Tp, _Args...>,
1007  __is_nt_constructible_impl<_Tp, _Args...>>
1008  { };
1009 
1010  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1011  struct __is_nothrow_copy_constructible_impl;
1012 
1013  template<typename _Tp>
1014  struct __is_nothrow_copy_constructible_impl<_Tp, false>
1015  : public false_type { };
1016 
1017  template<typename _Tp>
1018  struct __is_nothrow_copy_constructible_impl<_Tp, true>
1019  : public is_nothrow_constructible<_Tp, const _Tp&>
1020  { };
1021 
1022  /// is_nothrow_copy_constructible
1023  template<typename _Tp>
1024  struct is_nothrow_copy_constructible
1025  : public __is_nothrow_copy_constructible_impl<_Tp>
1026  { };
1027 
1028  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1029  struct __is_nothrow_move_constructible_impl;
1030 
1031  template<typename _Tp>
1032  struct __is_nothrow_move_constructible_impl<_Tp, false>
1033  : public false_type { };
1034 
1035  template<typename _Tp>
1036  struct __is_nothrow_move_constructible_impl<_Tp, true>
1037  : public is_nothrow_constructible<_Tp, _Tp&&>
1038  { };
1039 
1040  /// is_nothrow_move_constructible
1041  template<typename _Tp>
1042  struct is_nothrow_move_constructible
1043  : public __is_nothrow_move_constructible_impl<_Tp>
1044  { };
1045 
1046  /// is_assignable
1047  template<typename _Tp, typename _Up>
1048  struct is_assignable
1049  : public __bool_constant<__is_assignable(_Tp, _Up)>
1050  { };
1051 
1052  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1053  struct __is_copy_assignable_impl;
1054 
1055  template<typename _Tp>
1056  struct __is_copy_assignable_impl<_Tp, false>
1057  : public false_type { };
1058 
1059  template<typename _Tp>
1060  struct __is_copy_assignable_impl<_Tp, true>
1061  : public is_assignable<_Tp&, const _Tp&>
1062  { };
1063 
1064  /// is_copy_assignable
1065  template<typename _Tp>
1066  struct is_copy_assignable
1067  : public __is_copy_assignable_impl<_Tp>
1068  { };
1069 
1070  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1071  struct __is_move_assignable_impl;
1072 
1073  template<typename _Tp>
1074  struct __is_move_assignable_impl<_Tp, false>
1075  : public false_type { };
1076 
1077  template<typename _Tp>
1078  struct __is_move_assignable_impl<_Tp, true>
1079  : public is_assignable<_Tp&, _Tp&&>
1080  { };
1081 
1082  /// is_move_assignable
1083  template<typename _Tp>
1084  struct is_move_assignable
1085  : public __is_move_assignable_impl<_Tp>
1086  { };
1087 
1088  template<typename _Tp, typename _Up>
1089  struct __is_nt_assignable_impl
1090  : public integral_constant<bool, noexcept(declval<_Tp>() = declval<_Up>())>
1091  { };
1092 
1093  /// is_nothrow_assignable
1094  template<typename _Tp, typename _Up>
1095  struct is_nothrow_assignable
1096  : public __and_<is_assignable<_Tp, _Up>,
1097  __is_nt_assignable_impl<_Tp, _Up>>
1098  { };
1099 
1100  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1101  struct __is_nt_copy_assignable_impl;
1102 
1103  template<typename _Tp>
1104  struct __is_nt_copy_assignable_impl<_Tp, false>
1105  : public false_type { };
1106 
1107  template<typename _Tp>
1108  struct __is_nt_copy_assignable_impl<_Tp, true>
1109  : public is_nothrow_assignable<_Tp&, const _Tp&>
1110  { };
1111 
1112  /// is_nothrow_copy_assignable
1113  template<typename _Tp>
1114  struct is_nothrow_copy_assignable
1115  : public __is_nt_copy_assignable_impl<_Tp>
1116  { };
1117 
1118  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1119  struct __is_nt_move_assignable_impl;
1120 
1121  template<typename _Tp>
1122  struct __is_nt_move_assignable_impl<_Tp, false>
1123  : public false_type { };
1124 
1125  template<typename _Tp>
1126  struct __is_nt_move_assignable_impl<_Tp, true>
1127  : public is_nothrow_assignable<_Tp&, _Tp&&>
1128  { };
1129 
1130  /// is_nothrow_move_assignable
1131  template<typename _Tp>
1132  struct is_nothrow_move_assignable
1133  : public __is_nt_move_assignable_impl<_Tp>
1134  { };
1135 
1136  /// is_trivially_constructible
1137  template<typename _Tp, typename... _Args>
1138  struct is_trivially_constructible
1139  : public __bool_constant<__is_trivially_constructible(_Tp, _Args...)>
1140  { };
1141 
1142  /// is_trivially_default_constructible
1143  template<typename _Tp>
1144  struct is_trivially_default_constructible
1145  : public is_trivially_constructible<_Tp>::type
1146  { };
1147 
1148  struct __do_is_implicitly_default_constructible_impl
1149  {
1150  template <typename _Tp>
1151  static void __helper(const _Tp&);
1152 
1153  template <typename _Tp>
1154  static true_type __test(const _Tp&,
1155  decltype(__helper<const _Tp&>({}))* = 0);
1156 
1157  static false_type __test(...);
1158  };
1159 
1160  template<typename _Tp>
1161  struct __is_implicitly_default_constructible_impl
1162  : public __do_is_implicitly_default_constructible_impl
1163  {
1164  typedef decltype(__test(declval<_Tp>())) type;
1165  };
1166 
1167  template<typename _Tp>
1168  struct __is_implicitly_default_constructible_safe
1169  : public __is_implicitly_default_constructible_impl<_Tp>::type
1170  { };
1171 
1172  template <typename _Tp>
1173  struct __is_implicitly_default_constructible
1174  : public __and_<is_default_constructible<_Tp>,
1175  __is_implicitly_default_constructible_safe<_Tp>>
1176  { };
1177 
1178  /// is_trivially_copy_constructible
1179 
1180  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1181  struct __is_trivially_copy_constructible_impl;
1182 
1183  template<typename _Tp>
1184  struct __is_trivially_copy_constructible_impl<_Tp, false>
1185  : public false_type { };
1186 
1187  template<typename _Tp>
1188  struct __is_trivially_copy_constructible_impl<_Tp, true>
1189  : public __and_<is_copy_constructible<_Tp>,
1190  integral_constant<bool,
1191  __is_trivially_constructible(_Tp, const _Tp&)>>
1192  { };
1193 
1194  template<typename _Tp>
1195  struct is_trivially_copy_constructible
1196  : public __is_trivially_copy_constructible_impl<_Tp>
1197  { };
1198 
1199  /// is_trivially_move_constructible
1200 
1201  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1202  struct __is_trivially_move_constructible_impl;
1203 
1204  template<typename _Tp>
1205  struct __is_trivially_move_constructible_impl<_Tp, false>
1206  : public false_type { };
1207 
1208  template<typename _Tp>
1209  struct __is_trivially_move_constructible_impl<_Tp, true>
1210  : public __and_<is_move_constructible<_Tp>,
1211  integral_constant<bool,
1212  __is_trivially_constructible(_Tp, _Tp&&)>>
1213  { };
1214 
1215  template<typename _Tp>
1216  struct is_trivially_move_constructible
1217  : public __is_trivially_move_constructible_impl<_Tp>
1218  { };
1219 
1220  /// is_trivially_assignable
1221  template<typename _Tp, typename _Up>
1222  struct is_trivially_assignable
1223  : public __bool_constant<__is_trivially_assignable(_Tp, _Up)>
1224  { };
1225 
1226  /// is_trivially_copy_assignable
1227 
1228  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1229  struct __is_trivially_copy_assignable_impl;
1230 
1231  template<typename _Tp>
1232  struct __is_trivially_copy_assignable_impl<_Tp, false>
1233  : public false_type { };
1234 
1235  template<typename _Tp>
1236  struct __is_trivially_copy_assignable_impl<_Tp, true>
1237  : public __and_<is_copy_assignable<_Tp>,
1238  integral_constant<bool,
1239  __is_trivially_assignable(_Tp&, const _Tp&)>>
1240  { };
1241 
1242  template<typename _Tp>
1243  struct is_trivially_copy_assignable
1244  : public __is_trivially_copy_assignable_impl<_Tp>
1245  { };
1246 
1247  /// is_trivially_move_assignable
1248 
1249  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1250  struct __is_trivially_move_assignable_impl;
1251 
1252  template<typename _Tp>
1253  struct __is_trivially_move_assignable_impl<_Tp, false>
1254  : public false_type { };
1255 
1256  template<typename _Tp>
1257  struct __is_trivially_move_assignable_impl<_Tp, true>
1258  : public __and_<is_move_assignable<_Tp>,
1259  integral_constant<bool,
1260  __is_trivially_assignable(_Tp&, _Tp&&)>>
1261  { };
1262 
1263  template<typename _Tp>
1264  struct is_trivially_move_assignable
1265  : public __is_trivially_move_assignable_impl<_Tp>
1266  { };
1267 
1268  /// is_trivially_destructible
1269  template<typename _Tp>
1270  struct is_trivially_destructible
1271  : public __and_<is_destructible<_Tp>, integral_constant<bool,
1272  __has_trivial_destructor(_Tp)>>
1273  { };
1274 
1275 
1276  /// has_virtual_destructor
1277  template<typename _Tp>
1278  struct has_virtual_destructor
1279  : public integral_constant<bool, __has_virtual_destructor(_Tp)>
1280  { };
1281 
1282 
1283  // type property queries.
1284 
1285  /// alignment_of
1286  template<typename _Tp>
1287  struct alignment_of
1288  : public integral_constant<std::size_t, __alignof__(_Tp)> { };
1289 
1290  /// rank
1291  template<typename>
1292  struct rank
1293  : public integral_constant<std::size_t, 0> { };
1294 
1295  template<typename _Tp, std::size_t _Size>
1296  struct rank<_Tp[_Size]>
1297  : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
1298 
1299  template<typename _Tp>
1300  struct rank<_Tp[]>
1301  : public integral_constant<std::size_t, 1 + rank<_Tp>::value> { };
1302 
1303  /// extent
1304  template<typename, unsigned _Uint>
1305  struct extent
1306  : public integral_constant<std::size_t, 0> { };
1307 
1308  template<typename _Tp, unsigned _Uint, std::size_t _Size>
1309  struct extent<_Tp[_Size], _Uint>
1310  : public integral_constant<std::size_t,
1311  _Uint == 0 ? _Size : extent<_Tp,
1312  _Uint - 1>::value>
1313  { };
1314 
1315  template<typename _Tp, unsigned _Uint>
1316  struct extent<_Tp[], _Uint>
1317  : public integral_constant<std::size_t,
1318  _Uint == 0 ? 0 : extent<_Tp,
1319  _Uint - 1>::value>
1320  { };
1321 
1322 
1323  // Type relations.
1324 
1325  /// is_same
1326  template<typename, typename>
1327  struct is_same
1328  : public false_type { };
1329 
1330  template<typename _Tp>
1331  struct is_same<_Tp, _Tp>
1332  : public true_type { };
1333 
1334  /// is_base_of
1335  template<typename _Base, typename _Derived>
1336  struct is_base_of
1337  : public integral_constant<bool, __is_base_of(_Base, _Derived)>
1338  { };
1339 
1340  template<typename _From, typename _To,
1341  bool = __or_<is_void<_From>, is_function<_To>,
1342  is_array<_To>>::value>
1343  struct __is_convertible_helper
1344  { typedef typename is_void<_To>::type type; };
1345 
1346  template<typename _From, typename _To>
1347  class __is_convertible_helper<_From, _To, false>
1348  {
1349  template<typename _To1>
1350  static void __test_aux(_To1);
1351 
1352  template<typename _From1, typename _To1,
1353  typename = decltype(__test_aux<_To1>(std::declval<_From1>()))>
1354  static true_type
1355  __test(int);
1356 
1357  template<typename, typename>
1358  static false_type
1359  __test(...);
1360 
1361  public:
1362  typedef decltype(__test<_From, _To>(0)) type;
1363  };
1364 
1365 
1366  /// is_convertible
1367  template<typename _From, typename _To>
1368  struct is_convertible
1369  : public __is_convertible_helper<_From, _To>::type
1370  { };
1371 
1372 
1373  // Const-volatile modifications.
1374 
1375  /// remove_const
1376  template<typename _Tp>
1377  struct remove_const
1378  { typedef _Tp type; };
1379 
1380  template<typename _Tp>
1381  struct remove_const<_Tp const>
1382  { typedef _Tp type; };
1383 
1384  /// remove_volatile
1385  template<typename _Tp>
1386  struct remove_volatile
1387  { typedef _Tp type; };
1388 
1389  template<typename _Tp>
1390  struct remove_volatile<_Tp volatile>
1391  { typedef _Tp type; };
1392 
1393  /// remove_cv
1394  template<typename _Tp>
1395  struct remove_cv
1396  {
1397  typedef typename
1398  remove_const<typename remove_volatile<_Tp>::type>::type type;
1399  };
1400 
1401  /// add_const
1402  template<typename _Tp>
1403  struct add_const
1404  { typedef _Tp const type; };
1405 
1406  /// add_volatile
1407  template<typename _Tp>
1408  struct add_volatile
1409  { typedef _Tp volatile type; };
1410 
1411  /// add_cv
1412  template<typename _Tp>
1413  struct add_cv
1414  {
1415  typedef typename
1416  add_const<typename add_volatile<_Tp>::type>::type type;
1417  };
1418 
1419 #if __cplusplus > 201103L
1420 
1421 #define __cpp_lib_transformation_trait_aliases 201304
1422 
1423  /// Alias template for remove_const
1424  template<typename _Tp>
1425  using remove_const_t = typename remove_const<_Tp>::type;
1426 
1427  /// Alias template for remove_volatile
1428  template<typename _Tp>
1429  using remove_volatile_t = typename remove_volatile<_Tp>::type;
1430 
1431  /// Alias template for remove_cv
1432  template<typename _Tp>
1433  using remove_cv_t = typename remove_cv<_Tp>::type;
1434 
1435  /// Alias template for add_const
1436  template<typename _Tp>
1437  using add_const_t = typename add_const<_Tp>::type;
1438 
1439  /// Alias template for add_volatile
1440  template<typename _Tp>
1441  using add_volatile_t = typename add_volatile<_Tp>::type;
1442 
1443  /// Alias template for add_cv
1444  template<typename _Tp>
1445  using add_cv_t = typename add_cv<_Tp>::type;
1446 #endif
1447 
1448  // Reference transformations.
1449 
1450  /// remove_reference
1451  template<typename _Tp>
1452  struct remove_reference
1453  { typedef _Tp type; };
1454 
1455  template<typename _Tp>
1456  struct remove_reference<_Tp&>
1457  { typedef _Tp type; };
1458 
1459  template<typename _Tp>
1460  struct remove_reference<_Tp&&>
1461  { typedef _Tp type; };
1462 
1463  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1464  struct __add_lvalue_reference_helper
1465  { typedef _Tp type; };
1466 
1467  template<typename _Tp>
1468  struct __add_lvalue_reference_helper<_Tp, true>
1469  { typedef _Tp& type; };
1470 
1471  /// add_lvalue_reference
1472  template<typename _Tp>
1473  struct add_lvalue_reference
1474  : public __add_lvalue_reference_helper<_Tp>
1475  { };
1476 
1477  template<typename _Tp, bool = __is_referenceable<_Tp>::value>
1478  struct __add_rvalue_reference_helper
1479  { typedef _Tp type; };
1480 
1481  template<typename _Tp>
1482  struct __add_rvalue_reference_helper<_Tp, true>
1483  { typedef _Tp&& type; };
1484 
1485  /// add_rvalue_reference
1486  template<typename _Tp>
1487  struct add_rvalue_reference
1488  : public __add_rvalue_reference_helper<_Tp>
1489  { };
1490 
1491 #if __cplusplus > 201103L
1492  /// Alias template for remove_reference
1493  template<typename _Tp>
1494  using remove_reference_t = typename remove_reference<_Tp>::type;
1495 
1496  /// Alias template for add_lvalue_reference
1497  template<typename _Tp>
1498  using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type;
1499 
1500  /// Alias template for add_rvalue_reference
1501  template<typename _Tp>
1502  using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type;
1503 #endif
1504 
1505  // Sign modifications.
1506 
1507  // Utility for constructing identically cv-qualified types.
1508  template<typename _Unqualified, bool _IsConst, bool _IsVol>
1509  struct __cv_selector;
1510 
1511  template<typename _Unqualified>
1512  struct __cv_selector<_Unqualified, false, false>
1513  { typedef _Unqualified __type; };
1514 
1515  template<typename _Unqualified>
1516  struct __cv_selector<_Unqualified, false, true>
1517  { typedef volatile _Unqualified __type; };
1518 
1519  template<typename _Unqualified>
1520  struct __cv_selector<_Unqualified, true, false>
1521  { typedef const _Unqualified __type; };
1522 
1523  template<typename _Unqualified>
1524  struct __cv_selector<_Unqualified, true, true>
1525  { typedef const volatile _Unqualified __type; };
1526 
1527  template<typename _Qualified, typename _Unqualified,
1528  bool _IsConst = is_const<_Qualified>::value,
1529  bool _IsVol = is_volatile<_Qualified>::value>
1530  class __match_cv_qualifiers
1531  {
1532  typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
1533 
1534  public:
1535  typedef typename __match::__type __type;
1536  };
1537 
1538  // Utility for finding the unsigned versions of signed integral types.
1539  template<typename _Tp>
1540  struct __make_unsigned
1541  { typedef _Tp __type; };
1542 
1543  template<>
1544  struct __make_unsigned<char>
1545  { typedef unsigned char __type; };
1546 
1547  template<>
1548  struct __make_unsigned<signed char>
1549  { typedef unsigned char __type; };
1550 
1551  template<>
1552  struct __make_unsigned<short>
1553  { typedef unsigned short __type; };
1554 
1555  template<>
1556  struct __make_unsigned<int>
1557  { typedef unsigned int __type; };
1558 
1559  template<>
1560  struct __make_unsigned<long>
1561  { typedef unsigned long __type; };
1562 
1563  template<>
1564  struct __make_unsigned<long long>
1565  { typedef unsigned long long __type; };
1566 
1567 #if defined(__GLIBCXX_TYPE_INT_N_0)
1568  template<>
1569  struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0>
1570  { typedef unsigned __GLIBCXX_TYPE_INT_N_0 __type; };
1571 #endif
1572 #if defined(__GLIBCXX_TYPE_INT_N_1)
1573  template<>
1574  struct __make_unsigned<__GLIBCXX_TYPE_INT_N_1>
1575  { typedef unsigned __GLIBCXX_TYPE_INT_N_1 __type; };
1576 #endif
1577 #if defined(__GLIBCXX_TYPE_INT_N_2)
1578  template<>
1579  struct __make_unsigned<__GLIBCXX_TYPE_INT_N_2>
1580  { typedef unsigned __GLIBCXX_TYPE_INT_N_2 __type; };
1581 #endif
1582 #if defined(__GLIBCXX_TYPE_INT_N_3)
1583  template<>
1584  struct __make_unsigned<__GLIBCXX_TYPE_INT_N_3>
1585  { typedef unsigned __GLIBCXX_TYPE_INT_N_3 __type; };
1586 #endif
1587 
1588  // Select between integral and enum: not possible to be both.
1589  template<typename _Tp,
1590  bool _IsInt = is_integral<_Tp>::value,
1591  bool _IsEnum = is_enum<_Tp>::value>
1592  class __make_unsigned_selector;
1593 
1594  template<typename _Tp>
1595  class __make_unsigned_selector<_Tp, true, false>
1596  {
1597  typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
1598  typedef typename __unsignedt::__type __unsigned_type;
1599  typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
1600 
1601  public:
1602  typedef typename __cv_unsigned::__type __type;
1603  };
1604 
1605  template<typename _Tp>
1606  class __make_unsigned_selector<_Tp, false, true>
1607  {
1608  // With -fshort-enums, an enum may be as small as a char.
1609  typedef unsigned char __smallest;
1610  static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
1611  static const bool __b1 = sizeof(_Tp) <= sizeof(unsigned short);
1612  static const bool __b2 = sizeof(_Tp) <= sizeof(unsigned int);
1613  static const bool __b3 = sizeof(_Tp) <= sizeof(unsigned long);
1614  typedef conditional<__b3, unsigned long, unsigned long long> __cond3;
1615  typedef typename __cond3::type __cond3_type;
1616  typedef conditional<__b2, unsigned int, __cond3_type> __cond2;
1617  typedef typename __cond2::type __cond2_type;
1618  typedef conditional<__b1, unsigned short, __cond2_type> __cond1;
1619  typedef typename __cond1::type __cond1_type;
1620 
1621  typedef typename conditional<__b0, __smallest, __cond1_type>::type
1622  __unsigned_type;
1623  typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
1624 
1625  public:
1626  typedef typename __cv_unsigned::__type __type;
1627  };
1628 
1629  // Given an integral/enum type, return the corresponding unsigned
1630  // integer type.
1631  // Primary template.
1632  /// make_unsigned
1633  template<typename _Tp>
1634  struct make_unsigned
1635  { typedef typename __make_unsigned_selector<_Tp>::__type type; };
1636 
1637  // Integral, but don't define.
1638  template<>
1639  struct make_unsigned<bool>;
1640 
1641 
1642  // Utility for finding the signed versions of unsigned integral types.
1643  template<typename _Tp>
1644  struct __make_signed
1645  { typedef _Tp __type; };
1646 
1647  template<>
1648  struct __make_signed<char>
1649  { typedef signed char __type; };
1650 
1651  template<>
1652  struct __make_signed<unsigned char>
1653  { typedef signed char __type; };
1654 
1655  template<>
1656  struct __make_signed<unsigned short>
1657  { typedef signed short __type; };
1658 
1659  template<>
1660  struct __make_signed<unsigned int>
1661  { typedef signed int __type; };
1662 
1663  template<>
1664  struct __make_signed<unsigned long>
1665  { typedef signed long __type; };
1666 
1667  template<>
1668  struct __make_signed<unsigned long long>
1669  { typedef signed long long __type; };
1670 
1671 #if defined(__GLIBCXX_TYPE_INT_N_0)
1672  template<>
1673  struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_0>
1674  { typedef __GLIBCXX_TYPE_INT_N_0 __type; };
1675 #endif
1676 #if defined(__GLIBCXX_TYPE_INT_N_1)
1677  template<>
1678  struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_1>
1679  { typedef __GLIBCXX_TYPE_INT_N_1 __type; };
1680 #endif
1681 #if defined(__GLIBCXX_TYPE_INT_N_2)
1682  template<>
1683  struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_2>
1684  { typedef __GLIBCXX_TYPE_INT_N_2 __type; };
1685 #endif
1686 #if defined(__GLIBCXX_TYPE_INT_N_3)
1687  template<>
1688  struct __make_signed<unsigned __GLIBCXX_TYPE_INT_N_3>
1689  { typedef __GLIBCXX_TYPE_INT_N_3 __type; };
1690 #endif
1691 
1692  // Select between integral and enum: not possible to be both.
1693  template<typename _Tp,
1694  bool _IsInt = is_integral<_Tp>::value,
1695  bool _IsEnum = is_enum<_Tp>::value>
1696  class __make_signed_selector;
1697 
1698  template<typename _Tp>
1699  class __make_signed_selector<_Tp, true, false>
1700  {
1701  typedef __make_signed<typename remove_cv<_Tp>::type> __signedt;
1702  typedef typename __signedt::__type __signed_type;
1703  typedef __match_cv_qualifiers<_Tp, __signed_type> __cv_signed;
1704 
1705  public:
1706  typedef typename __cv_signed::__type __type;
1707  };
1708 
1709  template<typename _Tp>
1710  class __make_signed_selector<_Tp, false, true>
1711  {
1712  typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_type;
1713 
1714  public:
1715  typedef typename __make_signed_selector<__unsigned_type>::__type __type;
1716  };
1717 
1718  // Given an integral/enum type, return the corresponding signed
1719  // integer type.
1720  // Primary template.
1721  /// make_signed
1722  template<typename _Tp>
1723  struct make_signed
1724  { typedef typename __make_signed_selector<_Tp>::__type type; };
1725 
1726  // Integral, but don't define.
1727  template<>
1728  struct make_signed<bool>;
1729 
1730 #if __cplusplus > 201103L
1731  /// Alias template for make_signed
1732  template<typename _Tp>
1733  using make_signed_t = typename make_signed<_Tp>::type;
1734 
1735  /// Alias template for make_unsigned
1736  template<typename _Tp>
1737  using make_unsigned_t = typename make_unsigned<_Tp>::type;
1738 #endif
1739 
1740  // Array modifications.
1741 
1742  /// remove_extent
1743  template<typename _Tp>
1744  struct remove_extent
1745  { typedef _Tp type; };
1746 
1747  template<typename _Tp, std::size_t _Size>
1748  struct remove_extent<_Tp[_Size]>
1749  { typedef _Tp type; };
1750 
1751  template<typename _Tp>
1752  struct remove_extent<_Tp[]>
1753  { typedef _Tp type; };
1754 
1755  /// remove_all_extents
1756  template<typename _Tp>
1757  struct remove_all_extents
1758  { typedef _Tp type; };
1759 
1760  template<typename _Tp, std::size_t _Size>
1761  struct remove_all_extents<_Tp[_Size]>
1762  { typedef typename remove_all_extents<_Tp>::type type; };
1763 
1764  template<typename _Tp>
1765  struct remove_all_extents<_Tp[]>
1766  { typedef typename remove_all_extents<_Tp>::type type; };
1767 
1768 #if __cplusplus > 201103L
1769  /// Alias template for remove_extent
1770  template<typename _Tp>
1771  using remove_extent_t = typename remove_extent<_Tp>::type;
1772 
1773  /// Alias template for remove_all_extents
1774  template<typename _Tp>
1775  using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
1776 #endif
1777 
1778  // Pointer modifications.
1779 
1780  template<typename _Tp, typename>
1781  struct __remove_pointer_helper
1782  { typedef _Tp type; };
1783 
1784  template<typename _Tp, typename _Up>
1785  struct __remove_pointer_helper<_Tp, _Up*>
1786  { typedef _Up type; };
1787 
1788  /// remove_pointer
1789  template<typename _Tp>
1790  struct remove_pointer
1791  : public __remove_pointer_helper<_Tp, typename remove_cv<_Tp>::type>
1792  { };
1793 
1794  /// add_pointer
1795  template<typename _Tp, bool = __or_<__is_referenceable<_Tp>,
1796  is_void<_Tp>>::value>
1797  struct __add_pointer_helper
1798  { typedef _Tp type; };
1799 
1800  template<typename _Tp>
1801  struct __add_pointer_helper<_Tp, true>
1802  { typedef typename remove_reference<_Tp>::type* type; };
1803 
1804  template<typename _Tp>
1805  struct add_pointer
1806  : public __add_pointer_helper<_Tp>
1807  { };
1808 
1809 #if __cplusplus > 201103L
1810  /// Alias template for remove_pointer
1811  template<typename _Tp>
1812  using remove_pointer_t = typename remove_pointer<_Tp>::type;
1813 
1814  /// Alias template for add_pointer
1815  template<typename _Tp>
1816  using add_pointer_t = typename add_pointer<_Tp>::type;
1817 #endif
1818 
1819  template<std::size_t _Len>
1820  struct __aligned_storage_msa
1821  {
1822  union __type
1823  {
1824  unsigned char __data[_Len];
1825  struct __attribute__((__aligned__)) { } __align;
1826  };
1827  };
1828 
1829  /**
1830  * @brief Alignment type.
1831  *
1832  * The value of _Align is a default-alignment which shall be the
1833  * most stringent alignment requirement for any C++ object type
1834  * whose size is no greater than _Len (3.9). The member typedef
1835  * type shall be a POD type suitable for use as uninitialized
1836  * storage for any object whose size is at most _Len and whose
1837  * alignment is a divisor of _Align.
1838  */
1839  template<std::size_t _Len, std::size_t _Align =
1840  __alignof__(typename __aligned_storage_msa<_Len>::__type)>
1841  struct aligned_storage
1842  {
1843  union type
1844  {
1845  unsigned char __data[_Len];
1846  struct __attribute__((__aligned__((_Align)))) { } __align;
1847  };
1848  };
1849 
1850  template <typename... _Types>
1851  struct __strictest_alignment
1852  {
1853  static const size_t _S_alignment = 0;
1854  static const size_t _S_size = 0;
1855  };
1856 
1857  template <typename _Tp, typename... _Types>
1858  struct __strictest_alignment<_Tp, _Types...>
1859  {
1860  static const size_t _S_alignment =
1861  alignof(_Tp) > __strictest_alignment<_Types...>::_S_alignment
1862  ? alignof(_Tp) : __strictest_alignment<_Types...>::_S_alignment;
1863  static const size_t _S_size =
1864  sizeof(_Tp) > __strictest_alignment<_Types...>::_S_size
1865  ? sizeof(_Tp) : __strictest_alignment<_Types...>::_S_size;
1866  };
1867 
1868  /**
1869  * @brief Provide aligned storage for types.
1870  *
1871  * [meta.trans.other]
1872  *
1873  * Provides aligned storage for any of the provided types of at
1874  * least size _Len.
1875  *
1876  * @see aligned_storage
1877  */
1878  template <size_t _Len, typename... _Types>
1879  struct aligned_union
1880  {
1881  private:
1882  static_assert(sizeof...(_Types) != 0, "At least one type is required");
1883 
1884  using __strictest = __strictest_alignment<_Types...>;
1885  static const size_t _S_len = _Len > __strictest::_S_size
1886  ? _Len : __strictest::_S_size;
1887  public:
1888  /// The value of the strictest alignment of _Types.
1889  static const size_t alignment_value = __strictest::_S_alignment;
1890  /// The storage.
1891  typedef typename aligned_storage<_S_len, alignment_value>::type type;
1892  };
1893 
1894  template <size_t _Len, typename... _Types>
1895  const size_t aligned_union<_Len, _Types...>::alignment_value;
1896 
1897  // Decay trait for arrays and functions, used for perfect forwarding
1898  // in make_pair, make_tuple, etc.
1899  template<typename _Up,
1900  bool _IsArray = is_array<_Up>::value,
1901  bool _IsFunction = is_function<_Up>::value>
1902  struct __decay_selector;
1903 
1904  // NB: DR 705.
1905  template<typename _Up>
1906  struct __decay_selector<_Up, false, false>
1907  { typedef typename remove_cv<_Up>::type __type; };
1908 
1909  template<typename _Up>
1910  struct __decay_selector<_Up, true, false>
1911  { typedef typename remove_extent<_Up>::type* __type; };
1912 
1913  template<typename _Up>
1914  struct __decay_selector<_Up, false, true>
1915  { typedef typename add_pointer<_Up>::type __type; };
1916 
1917  /// decay
1918  template<typename _Tp>
1919  class decay
1920  {
1921  typedef typename remove_reference<_Tp>::type __remove_type;
1922 
1923  public:
1924  typedef typename __decay_selector<__remove_type>::__type type;
1925  };
1926 
1927  template<typename _Tp>
1928  class reference_wrapper;
1929 
1930  // Helper which adds a reference to a type when given a reference_wrapper
1931  template<typename _Tp>
1932  struct __strip_reference_wrapper
1933  {
1934  typedef _Tp __type;
1935  };
1936 
1937  template<typename _Tp>
1938  struct __strip_reference_wrapper<reference_wrapper<_Tp> >
1939  {
1940  typedef _Tp& __type;
1941  };
1942 
1943  template<typename _Tp>
1944  struct __decay_and_strip
1945  {
1946  typedef typename __strip_reference_wrapper<
1947  typename decay<_Tp>::type>::__type __type;
1948  };
1949 
1950 
1951  // Primary template.
1952  /// Define a member typedef @c type only if a boolean constant is true.
1953  template<bool, typename _Tp = void>
1954  struct enable_if
1955  { };
1956 
1957  // Partial specialization for true.
1958  template<typename _Tp>
1959  struct enable_if<true, _Tp>
1960  { typedef _Tp type; };
1961 
1962  template<typename... _Cond>
1963  using _Require = typename enable_if<__and_<_Cond...>::value>::type;
1964 
1965  // Primary template.
1966  /// Define a member typedef @c type to one of two argument types.
1967  template<bool _Cond, typename _Iftrue, typename _Iffalse>
1968  struct conditional
1969  { typedef _Iftrue type; };
1970 
1971  // Partial specialization for false.
1972  template<typename _Iftrue, typename _Iffalse>
1973  struct conditional<false, _Iftrue, _Iffalse>
1974  { typedef _Iffalse type; };
1975 
1976  /// common_type
1977  template<typename... _Tp>
1978  struct common_type;
1979 
1980  // Sfinae-friendly common_type implementation:
1981 
1982  struct __do_common_type_impl
1983  {
1984  template<typename _Tp, typename _Up>
1985  static __success_type<typename decay<decltype
1986  (true ? std::declval<_Tp>()
1987  : std::declval<_Up>())>::type> _S_test(int);
1988 
1989  template<typename, typename>
1990  static __failure_type _S_test(...);
1991  };
1992 
1993  template<typename _Tp, typename _Up>
1994  struct __common_type_impl
1995  : private __do_common_type_impl
1996  {
1997  typedef decltype(_S_test<_Tp, _Up>(0)) type;
1998  };
1999 
2000  struct __do_member_type_wrapper
2001  {
2002  template<typename _Tp>
2003  static __success_type<typename _Tp::type> _S_test(int);
2004 
2005  template<typename>
2006  static __failure_type _S_test(...);
2007  };
2008 
2009  template<typename _Tp>
2010  struct __member_type_wrapper
2011  : private __do_member_type_wrapper
2012  {
2013  typedef decltype(_S_test<_Tp>(0)) type;
2014  };
2015 
2016  template<typename _CTp, typename... _Args>
2017  struct __expanded_common_type_wrapper
2018  {
2019  typedef common_type<typename _CTp::type, _Args...> type;
2020  };
2021 
2022  template<typename... _Args>
2023  struct __expanded_common_type_wrapper<__failure_type, _Args...>
2024  { typedef __failure_type type; };
2025 
2026  template<typename _Tp>
2027  struct common_type<_Tp>
2028  { typedef typename decay<_Tp>::type type; };
2029 
2030  template<typename _Tp, typename _Up>
2031  struct common_type<_Tp, _Up>
2032  : public __common_type_impl<_Tp, _Up>::type
2033  { };
2034 
2035  template<typename _Tp, typename _Up, typename... _Vp>
2036  struct common_type<_Tp, _Up, _Vp...>
2037  : public __expanded_common_type_wrapper<typename __member_type_wrapper<
2038  common_type<_Tp, _Up>>::type, _Vp...>::type
2039  { };
2040 
2041  /// The underlying type of an enum.
2042  template<typename _Tp>
2043  struct underlying_type
2044  {
2045  typedef __underlying_type(_Tp) type;
2046  };
2047 
2048  template<typename _Tp>
2049  struct __declval_protector
2050  {
2051  static const bool __stop = false;
2052  };
2053 
2054  template<typename _Tp>
2055  auto declval() noexcept -> decltype(__declval<_Tp>(0))
2056  {
2057  static_assert(__declval_protector<_Tp>::__stop,
2058  "declval() must not be used!");
2059  return __declval<_Tp>(0);
2060  }
2061 
2062  // wchar_t, char16_t and char32_t are integral types but are neither
2063  // signed integer types nor unsigned integer types, so must be
2064  // transformed to the integer type with the smallest rank that has the
2065  // same size and signedness.
2066  // Use the partial specialization for enumeration types to do that,
2067  // which means these explicit specializations must be defined after
2068  // std::conditional has been defined.
2069 
2070 #if defined(_GLIBCXX_USE_WCHAR_T)
2071  template<>
2072  struct __make_unsigned<wchar_t>
2073  {
2074  using __type
2075  = typename __make_unsigned_selector<wchar_t, false, true>::__type;
2076  };
2077 
2078  template<>
2079  struct __make_signed<wchar_t>
2080  {
2081  using __type
2082  = typename __make_signed_selector<wchar_t, false, true>::__type;
2083  };
2084 #endif
2085 
2086  template<>
2087  struct __make_unsigned<char16_t>
2088  {
2089  using __type
2090  = typename __make_unsigned_selector<char16_t, false, true>::__type;
2091  };
2092 
2093  template<>
2094  struct __make_signed<char16_t>
2095  {
2096  using __type
2097  = typename __make_signed_selector<char16_t, false, true>::__type;
2098  };
2099 
2100  template<>
2101  struct __make_unsigned<char32_t>
2102  {
2103  using __type
2104  = typename __make_unsigned_selector<char32_t, false, true>::__type;
2105  };
2106 
2107  template<>
2108  struct __make_signed<char32_t>
2109  {
2110  using __type
2111  = typename __make_signed_selector<char32_t, false, true>::__type;
2112  };
2113 
2114 
2115  /// result_of
2116  template<typename _Signature>
2117  class result_of;
2118 
2119  // Sfinae-friendly result_of implementation:
2120 
2121 #define __cpp_lib_result_of_sfinae 201210
2122 
2123  struct __invoke_memfun_ref { };
2124  struct __invoke_memfun_deref { };
2125  struct __invoke_memobj_ref { };
2126  struct __invoke_memobj_deref { };
2127  struct __invoke_other { };
2128 
2129  // Associate a tag type with a specialization of __success_type.
2130  template<typename _Tp, typename _Tag>
2131  struct __result_of_success : __success_type<_Tp>
2132  { using __invoke_type = _Tag; };
2133 
2134  // [func.require] paragraph 1 bullet 1:
2135  struct __result_of_memfun_ref_impl
2136  {
2137  template<typename _Fp, typename _Tp1, typename... _Args>
2138  static __result_of_success<decltype(
2139  (std::declval<_Tp1>().*std::declval<_Fp>())(std::declval<_Args>()...)
2140  ), __invoke_memfun_ref> _S_test(int);
2141 
2142  template<typename...>
2143  static __failure_type _S_test(...);
2144  };
2145 
2146  template<typename _MemPtr, typename _Arg, typename... _Args>
2147  struct __result_of_memfun_ref
2148  : private __result_of_memfun_ref_impl
2149  {
2150  typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
2151  };
2152 
2153  // [func.require] paragraph 1 bullet 2:
2154  struct __result_of_memfun_deref_impl
2155  {
2156  template<typename _Fp, typename _Tp1, typename... _Args>
2157  static __result_of_success<decltype(
2158  ((*std::declval<_Tp1>()).*std::declval<_Fp>())(std::declval<_Args>()...)
2159  ), __invoke_memfun_deref> _S_test(int);
2160 
2161  template<typename...>
2162  static __failure_type _S_test(...);
2163  };
2164 
2165  template<typename _MemPtr, typename _Arg, typename... _Args>
2166  struct __result_of_memfun_deref
2167  : private __result_of_memfun_deref_impl
2168  {
2169  typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type;
2170  };
2171 
2172  // [func.require] paragraph 1 bullet 3:
2173  struct __result_of_memobj_ref_impl
2174  {
2175  template<typename _Fp, typename _Tp1>
2176  static __result_of_success<decltype(
2177  std::declval<_Tp1>().*std::declval<_Fp>()
2178  ), __invoke_memobj_ref> _S_test(int);
2179 
2180  template<typename, typename>
2181  static __failure_type _S_test(...);
2182  };
2183 
2184  template<typename _MemPtr, typename _Arg>
2185  struct __result_of_memobj_ref
2186  : private __result_of_memobj_ref_impl
2187  {
2188  typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
2189  };
2190 
2191  // [func.require] paragraph 1 bullet 4:
2192  struct __result_of_memobj_deref_impl
2193  {
2194  template<typename _Fp, typename _Tp1>
2195  static __result_of_success<decltype(
2196  (*std::declval<_Tp1>()).*std::declval<_Fp>()
2197  ), __invoke_memobj_deref> _S_test(int);
2198 
2199  template<typename, typename>
2200  static __failure_type _S_test(...);
2201  };
2202 
2203  template<typename _MemPtr, typename _Arg>
2204  struct __result_of_memobj_deref
2205  : private __result_of_memobj_deref_impl
2206  {
2207  typedef decltype(_S_test<_MemPtr, _Arg>(0)) type;
2208  };
2209 
2210  template<typename _MemPtr, typename _Arg>
2211  struct __result_of_memobj;
2212 
2213  template<typename _Res, typename _Class, typename _Arg>
2214  struct __result_of_memobj<_Res _Class::*, _Arg>
2215  {
2216  typedef typename remove_cv<typename remove_reference<
2217  _Arg>::type>::type _Argval;
2218  typedef _Res _Class::* _MemPtr;
2219  typedef typename conditional<__or_<is_same<_Argval, _Class>,
2220  is_base_of<_Class, _Argval>>::value,
2221  __result_of_memobj_ref<_MemPtr, _Arg>,
2222  __result_of_memobj_deref<_MemPtr, _Arg>
2223  >::type::type type;
2224  };
2225 
2226  template<typename _MemPtr, typename _Arg, typename... _Args>
2227  struct __result_of_memfun;
2228 
2229  template<typename _Res, typename _Class, typename _Arg, typename... _Args>
2230  struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
2231  {
2232  typedef typename remove_cv<typename remove_reference<
2233  _Arg>::type>::type _Argval;
2234  typedef _Res _Class::* _MemPtr;
2235  typedef typename conditional<__or_<is_same<_Argval, _Class>,
2236  is_base_of<_Class, _Argval>>::value,
2237  __result_of_memfun_ref<_MemPtr, _Arg, _Args...>,
2238  __result_of_memfun_deref<_MemPtr, _Arg, _Args...>
2239  >::type::type type;
2240  };
2241 
2242  // _GLIBCXX_RESOLVE_LIB_DEFECTS
2243  // 2219. INVOKE-ing a pointer to member with a reference_wrapper
2244  // as the object expression
2245 
2246  // Used by result_of, invoke etc. to unwrap a reference_wrapper.
2247  template<typename _Tp, typename _Up = typename decay<_Tp>::type>
2248  struct __inv_unwrap
2249  {
2250  using type = _Tp;
2251  };
2252 
2253  template<typename _Tp, typename _Up>
2254  struct __inv_unwrap<_Tp, reference_wrapper<_Up>>
2255  {
2256  using type = _Up&;
2257  };
2258 
2259  template<bool, bool, typename _Functor, typename... _ArgTypes>
2260  struct __result_of_impl
2261  {
2262  typedef __failure_type type;
2263  };
2264 
2265  template<typename _MemPtr, typename _Arg>
2266  struct __result_of_impl<true, false, _MemPtr, _Arg>
2267  : public __result_of_memobj<typename decay<_MemPtr>::type,
2268  typename __inv_unwrap<_Arg>::type>
2269  { };
2270 
2271  template<typename _MemPtr, typename _Arg, typename... _Args>
2272  struct __result_of_impl<false, true, _MemPtr, _Arg, _Args...>
2273  : public __result_of_memfun<typename decay<_MemPtr>::type,
2274  typename __inv_unwrap<_Arg>::type, _Args...>
2275  { };
2276 
2277  // [func.require] paragraph 1 bullet 5:
2278  struct __result_of_other_impl
2279  {
2280  template<typename _Fn, typename... _Args>
2281  static __result_of_success<decltype(
2282  std::declval<_Fn>()(std::declval<_Args>()...)
2283  ), __invoke_other> _S_test(int);
2284 
2285  template<typename...>
2286  static __failure_type _S_test(...);
2287  };
2288 
2289  template<typename _Functor, typename... _ArgTypes>
2290  struct __result_of_impl<false, false, _Functor, _ArgTypes...>
2291  : private __result_of_other_impl
2292  {
2293  typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type;
2294  };
2295 
2296  // __invoke_result (std::invoke_result for C++11)
2297  template<typename _Functor, typename... _ArgTypes>
2298  struct __invoke_result
2299  : public __result_of_impl<
2300  is_member_object_pointer<
2301  typename remove_reference<_Functor>::type
2302  >::value,
2303  is_member_function_pointer<
2304  typename remove_reference<_Functor>::type
2305  >::value,
2306  _Functor, _ArgTypes...
2307  >::type
2308  { };
2309 
2310  template<typename _Functor, typename... _ArgTypes>
2311  struct result_of<_Functor(_ArgTypes...)>
2312  : public __invoke_result<_Functor, _ArgTypes...>
2313  { };
2314 
2315 #if __cplusplus > 201103L
2316  /// Alias template for aligned_storage
2317  template<size_t _Len, size_t _Align =
2318  __alignof__(typename __aligned_storage_msa<_Len>::__type)>
2319  using aligned_storage_t = typename aligned_storage<_Len, _Align>::type;
2320 
2321  template <size_t _Len, typename... _Types>
2322  using aligned_union_t = typename aligned_union<_Len, _Types...>::type;
2323 
2324  /// Alias template for decay
2325  template<typename _Tp>
2326  using decay_t = typename decay<_Tp>::type;
2327 
2328  /// Alias template for enable_if
2329  template<bool _Cond, typename _Tp = void>
2330  using enable_if_t = typename enable_if<_Cond, _Tp>::type;
2331 
2332  /// Alias template for conditional
2333  template<bool _Cond, typename _Iftrue, typename _Iffalse>
2334  using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type;
2335 
2336  /// Alias template for common_type
2337  template<typename... _Tp>
2338  using common_type_t = typename common_type<_Tp...>::type;
2339 
2340  /// Alias template for underlying_type
2341  template<typename _Tp>
2342  using underlying_type_t = typename underlying_type<_Tp>::type;
2343 
2344  /// Alias template for result_of
2345  template<typename _Tp>
2346  using result_of_t = typename result_of<_Tp>::type;
2347 #endif
2348 
2349  template<typename...> using __void_t = void;
2350 
2351 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
2352 #define __cpp_lib_void_t 201411
2353  /// A metafunction that always yields void, used for detecting valid types.
2354  template<typename...> using void_t = void;
2355 #endif
2356 
2357  /// Implementation of the detection idiom (negative case).
2358  template<typename _Default, typename _AlwaysVoid,
2359  template<typename...> class _Op, typename... _Args>
2360  struct __detector
2361  {
2362  using value_t = false_type;
2363  using type = _Default;
2364  };
2365 
2366  /// Implementation of the detection idiom (positive case).
2367  template<typename _Default, template<typename...> class _Op,
2368  typename... _Args>
2369  struct __detector<_Default, __void_t<_Op<_Args...>>, _Op, _Args...>
2370  {
2371  using value_t = true_type;
2372  using type = _Op<_Args...>;
2373  };
2374 
2375  // Detect whether _Op<_Args...> is a valid type, use _Default if not.
2376  template<typename _Default, template<typename...> class _Op,
2377  typename... _Args>
2378  using __detected_or = __detector<_Default, void, _Op, _Args...>;
2379 
2380  // _Op<_Args...> if that is a valid type, otherwise _Default.
2381  template<typename _Default, template<typename...> class _Op,
2382  typename... _Args>
2383  using __detected_or_t
2384  = typename __detected_or<_Default, _Op, _Args...>::type;
2385 
2386  /// @} group metaprogramming
2387 
2388  /**
2389  * Use SFINAE to determine if the type _Tp has a publicly-accessible
2390  * member type _NTYPE.
2391  */
2392 #define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \
2393  template<typename _Tp, typename = __void_t<>> \
2394  struct __has_##_NTYPE \
2395  : false_type \
2396  { }; \
2397  template<typename _Tp> \
2398  struct __has_##_NTYPE<_Tp, __void_t<typename _Tp::_NTYPE>> \
2399  : true_type \
2400  { };
2401 
2402  template <typename _Tp>
2403  struct __is_swappable;
2404 
2405  template <typename _Tp>
2406  struct __is_nothrow_swappable;
2407 
2408  template<typename... _Elements>
2409  class tuple;
2410 
2411  template<typename>
2412  struct __is_tuple_like_impl : false_type
2413  { };
2414 
2415  template<typename... _Tps>
2416  struct __is_tuple_like_impl<tuple<_Tps...>> : true_type
2417  { };
2418 
2419  // Internal type trait that allows us to sfinae-protect tuple_cat.
2420  template<typename _Tp>
2421  struct __is_tuple_like
2422  : public __is_tuple_like_impl<typename remove_cv<
2423  typename remove_reference<_Tp>::type>::type>::type
2424  { };
2425 
2426  template<typename _Tp>
2427  inline
2428  typename enable_if<__and_<__not_<__is_tuple_like<_Tp>>,
2429  is_move_constructible<_Tp>,
2430  is_move_assignable<_Tp>>::value>::type
2431  swap(_Tp&, _Tp&)
2432  noexcept(__and_<is_nothrow_move_constructible<_Tp>,
2433  is_nothrow_move_assignable<_Tp>>::value);
2434 
2435  template<typename _Tp, size_t _Nm>
2436  inline
2437  typename enable_if<__is_swappable<_Tp>::value>::type
2438  swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
2439  noexcept(__is_nothrow_swappable<_Tp>::value);
2440 
2441  namespace __swappable_details {
2442  using std::swap;
2443 
2444  struct __do_is_swappable_impl
2445  {
2446  template<typename _Tp, typename
2447  = decltype(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))>
2448  static true_type __test(int);
2449 
2450  template<typename>
2451  static false_type __test(...);
2452  };
2453 
2454  struct __do_is_nothrow_swappable_impl
2455  {
2456  template<typename _Tp>
2457  static __bool_constant<
2458  noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))
2459  > __test(int);
2460 
2461  template<typename>
2462  static false_type __test(...);
2463  };
2464 
2465  } // namespace __swappable_details
2466 
2467  template<typename _Tp>
2468  struct __is_swappable_impl
2469  : public __swappable_details::__do_is_swappable_impl
2470  {
2471  typedef decltype(__test<_Tp>(0)) type;
2472  };
2473 
2474  template<typename _Tp>
2475  struct __is_nothrow_swappable_impl
2476  : public __swappable_details::__do_is_nothrow_swappable_impl
2477  {
2478  typedef decltype(__test<_Tp>(0)) type;
2479  };
2480 
2481  template<typename _Tp>
2482  struct __is_swappable
2483  : public __is_swappable_impl<_Tp>::type
2484  { };
2485 
2486  template<typename _Tp>
2487  struct __is_nothrow_swappable
2488  : public __is_nothrow_swappable_impl<_Tp>::type
2489  { };
2490 
2491 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
2492 #define __cpp_lib_is_swappable 201603
2493  /// Metafunctions used for detecting swappable types: p0185r1
2494 
2495  /// is_swappable
2496  template<typename _Tp>
2497  struct is_swappable
2498  : public __is_swappable_impl<_Tp>::type
2499  { };
2500 
2501  /// is_nothrow_swappable
2502  template<typename _Tp>
2503  struct is_nothrow_swappable
2504  : public __is_nothrow_swappable_impl<_Tp>::type
2505  { };
2506 
2507 #if __cplusplus >= 201402L
2508  /// is_swappable_v
2509  template<typename _Tp>
2510  _GLIBCXX17_INLINE constexpr bool is_swappable_v =
2511  is_swappable<_Tp>::value;
2512 
2513  /// is_nothrow_swappable_v
2514  template<typename _Tp>
2515  _GLIBCXX17_INLINE constexpr bool is_nothrow_swappable_v =
2516  is_nothrow_swappable<_Tp>::value;
2517 #endif // __cplusplus >= 201402L
2518 
2519  namespace __swappable_with_details {
2520  using std::swap;
2521 
2522  struct __do_is_swappable_with_impl
2523  {
2524  template<typename _Tp, typename _Up, typename
2525  = decltype(swap(std::declval<_Tp>(), std::declval<_Up>())),
2526  typename
2527  = decltype(swap(std::declval<_Up>(), std::declval<_Tp>()))>
2528  static true_type __test(int);
2529 
2530  template<typename, typename>
2531  static false_type __test(...);
2532  };
2533 
2534  struct __do_is_nothrow_swappable_with_impl
2535  {
2536  template<typename _Tp, typename _Up>
2537  static __bool_constant<
2538  noexcept(swap(std::declval<_Tp>(), std::declval<_Up>()))
2539  &&
2540  noexcept(swap(std::declval<_Up>(), std::declval<_Tp>()))
2541  > __test(int);
2542 
2543  template<typename, typename>
2544  static false_type __test(...);
2545  };
2546 
2547  } // namespace __swappable_with_details
2548 
2549  template<typename _Tp, typename _Up>
2550  struct __is_swappable_with_impl
2551  : public __swappable_with_details::__do_is_swappable_with_impl
2552  {
2553  typedef decltype(__test<_Tp, _Up>(0)) type;
2554  };
2555 
2556  // Optimization for the homogenous lvalue case, not required:
2557  template<typename _Tp>
2558  struct __is_swappable_with_impl<_Tp&, _Tp&>
2559  : public __swappable_details::__do_is_swappable_impl
2560  {
2561  typedef decltype(__test<_Tp&>(0)) type;
2562  };
2563 
2564  template<typename _Tp, typename _Up>
2565  struct __is_nothrow_swappable_with_impl
2566  : public __swappable_with_details::__do_is_nothrow_swappable_with_impl
2567  {
2568  typedef decltype(__test<_Tp, _Up>(0)) type;
2569  };
2570 
2571  // Optimization for the homogenous lvalue case, not required:
2572  template<typename _Tp>
2573  struct __is_nothrow_swappable_with_impl<_Tp&, _Tp&>
2574  : public __swappable_details::__do_is_nothrow_swappable_impl
2575  {
2576  typedef decltype(__test<_Tp&>(0)) type;
2577  };
2578 
2579  /// is_swappable_with
2580  template<typename _Tp, typename _Up>
2581  struct is_swappable_with
2582  : public __is_swappable_with_impl<_Tp, _Up>::type
2583  { };
2584 
2585  /// is_nothrow_swappable_with
2586  template<typename _Tp, typename _Up>
2587  struct is_nothrow_swappable_with
2588  : public __is_nothrow_swappable_with_impl<_Tp, _Up>::type
2589  { };
2590 
2591 #if __cplusplus >= 201402L
2592  /// is_swappable_with_v
2593  template<typename _Tp, typename _Up>
2594  _GLIBCXX17_INLINE constexpr bool is_swappable_with_v =
2595  is_swappable_with<_Tp, _Up>::value;
2596 
2597  /// is_nothrow_swappable_with_v
2598  template<typename _Tp, typename _Up>
2599  _GLIBCXX17_INLINE constexpr bool is_nothrow_swappable_with_v =
2600  is_nothrow_swappable_with<_Tp, _Up>::value;
2601 #endif // __cplusplus >= 201402L
2602 
2603 #endif// c++1z or gnu++11
2604 
2605  // __is_invocable (std::is_invocable for C++11)
2606 
2607  template<typename _Result, typename _Ret, typename = void>
2608  struct __is_invocable_impl : false_type { };
2609 
2610  template<typename _Result, typename _Ret>
2611  struct __is_invocable_impl<_Result, _Ret, __void_t<typename _Result::type>>
2612  : __or_<is_void<_Ret>, is_convertible<typename _Result::type, _Ret>>::type
2613  { };
2614 
2615  template<typename _Fn, typename... _ArgTypes>
2616  struct __is_invocable
2617  : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>::type
2618  { };
2619 
2620  template<typename _Fn, typename _Tp, typename... _Args>
2621  constexpr bool __call_is_nt(__invoke_memfun_ref)
2622  {
2623  using _Up = typename __inv_unwrap<_Tp>::type;
2624  return noexcept((std::declval<_Up>().*std::declval<_Fn>())(
2625  std::declval<_Args>()...));
2626  }
2627 
2628  template<typename _Fn, typename _Tp, typename... _Args>
2629  constexpr bool __call_is_nt(__invoke_memfun_deref)
2630  {
2631  return noexcept(((*std::declval<_Tp>()).*std::declval<_Fn>())(
2632  std::declval<_Args>()...));
2633  }
2634 
2635  template<typename _Fn, typename _Tp>
2636  constexpr bool __call_is_nt(__invoke_memobj_ref)
2637  {
2638  using _Up = typename __inv_unwrap<_Tp>::type;
2639  return noexcept(std::declval<_Up>().*std::declval<_Fn>());
2640  }
2641 
2642  template<typename _Fn, typename _Tp>
2643  constexpr bool __call_is_nt(__invoke_memobj_deref)
2644  {
2645  return noexcept((*std::declval<_Tp>()).*std::declval<_Fn>());
2646  }
2647 
2648  template<typename _Fn, typename... _Args>
2649  constexpr bool __call_is_nt(__invoke_other)
2650  {
2651  return noexcept(std::declval<_Fn>()(std::declval<_Args>()...));
2652  }
2653 
2654  template<typename _Result, typename _Fn, typename... _Args>
2655  struct __call_is_nothrow
2656  : __bool_constant<
2657  std::__call_is_nt<_Fn, _Args...>(typename _Result::__invoke_type{})
2658  >
2659  { };
2660 
2661  template<typename _Fn, typename... _Args>
2662  using __call_is_nothrow_
2663  = __call_is_nothrow<__invoke_result<_Fn, _Args...>, _Fn, _Args...>;
2664 
2665  // __is_nothrow_invocable (std::is_nothrow_invocable for C++11)
2666  template<typename _Fn, typename... _Args>
2667  struct __is_nothrow_invocable
2668  : __and_<__is_invocable<_Fn, _Args...>,
2669  __call_is_nothrow_<_Fn, _Args...>>::type
2670  { };
2671 
2672  struct __nonesuch {
2673  __nonesuch() = delete;
2674  ~__nonesuch() = delete;
2675  __nonesuch(__nonesuch const&) = delete;
2676  void operator=(__nonesuch const&) = delete;
2677  };
2678 
2679 #if __cplusplus >= 201703L
2680 # define __cpp_lib_is_invocable 201703
2681 
2682  /// std::invoke_result
2683  template<typename _Functor, typename... _ArgTypes>
2684  struct invoke_result
2685  : public __invoke_result<_Functor, _ArgTypes...>
2686  { };
2687 
2688  /// std::invoke_result_t
2689  template<typename _Fn, typename... _Args>
2690  using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
2691 
2692  /// std::is_invocable
2693  template<typename _Fn, typename... _ArgTypes>
2694  struct is_invocable
2695  : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>::type
2696  { };
2697 
2698  /// std::is_invocable_r
2699  template<typename _Ret, typename _Fn, typename... _ArgTypes>
2700  struct is_invocable_r
2701  : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, _Ret>::type
2702  { };
2703 
2704  /// std::is_nothrow_invocable
2705  template<typename _Fn, typename... _ArgTypes>
2706  struct is_nothrow_invocable
2707  : __and_<__is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>,
2708  __call_is_nothrow_<_Fn, _ArgTypes...>>::type
2709  { };
2710 
2711  template<typename _Result, typename _Ret, typename = void>
2712  struct __is_nt_invocable_impl : false_type { };
2713 
2714  template<typename _Result, typename _Ret>
2715  struct __is_nt_invocable_impl<_Result, _Ret,
2716  __void_t<typename _Result::type>>
2717  : __or_<is_void<_Ret>,
2718  __and_<is_convertible<typename _Result::type, _Ret>,
2719  is_nothrow_constructible<_Ret, typename _Result::type>>>
2720  { };
2721 
2722  /// std::is_nothrow_invocable_r
2723  template<typename _Ret, typename _Fn, typename... _ArgTypes>
2724  struct is_nothrow_invocable_r
2725  : __and_<__is_nt_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, _Ret>,
2726  __call_is_nothrow_<_Fn, _ArgTypes...>>::type
2727  { };
2728 
2729  /// std::is_invocable_v
2730  template<typename _Fn, typename... _Args>
2731  inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value;
2732 
2733  /// std::is_nothrow_invocable_v
2734  template<typename _Fn, typename... _Args>
2735  inline constexpr bool is_nothrow_invocable_v
2736  = is_nothrow_invocable<_Fn, _Args...>::value;
2737 
2738  /// std::is_invocable_r_v
2739  template<typename _Fn, typename... _Args>
2740  inline constexpr bool is_invocable_r_v
2741  = is_invocable_r<_Fn, _Args...>::value;
2742 
2743  /// std::is_nothrow_invocable_r_v
2744  template<typename _Fn, typename... _Args>
2745  inline constexpr bool is_nothrow_invocable_r_v
2746  = is_nothrow_invocable_r<_Fn, _Args...>::value;
2747 #endif // C++17
2748 
2749 #if __cplusplus >= 201703L
2750 # define __cpp_lib_type_trait_variable_templates 201510L
2751 template <typename _Tp>
2752  inline constexpr bool is_void_v = is_void<_Tp>::value;
2753 template <typename _Tp>
2754  inline constexpr bool is_null_pointer_v = is_null_pointer<_Tp>::value;
2755 template <typename _Tp>
2756  inline constexpr bool is_integral_v = is_integral<_Tp>::value;
2757 template <typename _Tp>
2758  inline constexpr bool is_floating_point_v = is_floating_point<_Tp>::value;
2759 template <typename _Tp>
2760  inline constexpr bool is_array_v = is_array<_Tp>::value;
2761 template <typename _Tp>
2762  inline constexpr bool is_pointer_v = is_pointer<_Tp>::value;
2763 template <typename _Tp>
2764  inline constexpr bool is_lvalue_reference_v =
2765  is_lvalue_reference<_Tp>::value;
2766 template <typename _Tp>
2767  inline constexpr bool is_rvalue_reference_v =
2768  is_rvalue_reference<_Tp>::value;
2769 template <typename _Tp>
2770  inline constexpr bool is_member_object_pointer_v =
2771  is_member_object_pointer<_Tp>::value;
2772 template <typename _Tp>
2773  inline constexpr bool is_member_function_pointer_v =
2774  is_member_function_pointer<_Tp>::value;
2775 template <typename _Tp>
2776  inline constexpr bool is_enum_v = is_enum<_Tp>::value;
2777 template <typename _Tp>
2778  inline constexpr bool is_union_v = is_union<_Tp>::value;
2779 template <typename _Tp>
2780  inline constexpr bool is_class_v = is_class<_Tp>::value;
2781 template <typename _Tp>
2782  inline constexpr bool is_function_v = is_function<_Tp>::value;
2783 template <typename _Tp>
2784  inline constexpr bool is_reference_v = is_reference<_Tp>::value;
2785 template <typename _Tp>
2786  inline constexpr bool is_arithmetic_v = is_arithmetic<_Tp>::value;
2787 template <typename _Tp>
2788  inline constexpr bool is_fundamental_v = is_fundamental<_Tp>::value;
2789 template <typename _Tp>
2790  inline constexpr bool is_object_v = is_object<_Tp>::value;
2791 template <typename _Tp>
2792  inline constexpr bool is_scalar_v = is_scalar<_Tp>::value;
2793 template <typename _Tp>
2794  inline constexpr bool is_compound_v = is_compound<_Tp>::value;
2795 template <typename _Tp>
2796  inline constexpr bool is_member_pointer_v = is_member_pointer<_Tp>::value;
2797 template <typename _Tp>
2798  inline constexpr bool is_const_v = is_const<_Tp>::value;
2799 template <typename _Tp>
2800  inline constexpr bool is_volatile_v = is_volatile<_Tp>::value;
2801 template <typename _Tp>
2802  inline constexpr bool is_trivial_v = is_trivial<_Tp>::value;
2803 template <typename _Tp>
2804  inline constexpr bool is_trivially_copyable_v =
2805  is_trivially_copyable<_Tp>::value;
2806 template <typename _Tp>
2807  inline constexpr bool is_standard_layout_v = is_standard_layout<_Tp>::value;
2808 template <typename _Tp>
2809  inline constexpr bool is_pod_v = is_pod<_Tp>::value;
2810 template <typename _Tp>
2811  inline constexpr bool is_literal_type_v = is_literal_type<_Tp>::value;
2812 template <typename _Tp>
2813  inline constexpr bool is_empty_v = is_empty<_Tp>::value;
2814 template <typename _Tp>
2815  inline constexpr bool is_polymorphic_v = is_polymorphic<_Tp>::value;
2816 template <typename _Tp>
2817  inline constexpr bool is_abstract_v = is_abstract<_Tp>::value;
2818 template <typename _Tp>
2819  inline constexpr bool is_final_v = is_final<_Tp>::value;
2820 template <typename _Tp>
2821  inline constexpr bool is_signed_v = is_signed<_Tp>::value;
2822 template <typename _Tp>
2823  inline constexpr bool is_unsigned_v = is_unsigned<_Tp>::value;
2824 template <typename _Tp, typename... _Args>
2825  inline constexpr bool is_constructible_v =
2826  is_constructible<_Tp, _Args...>::value;
2827 template <typename _Tp>
2828  inline constexpr bool is_default_constructible_v =
2829  is_default_constructible<_Tp>::value;
2830 template <typename _Tp>
2831  inline constexpr bool is_copy_constructible_v =
2832  is_copy_constructible<_Tp>::value;
2833 template <typename _Tp>
2834  inline constexpr bool is_move_constructible_v =
2835  is_move_constructible<_Tp>::value;
2836 template <typename _Tp, typename _Up>
2837  inline constexpr bool is_assignable_v = is_assignable<_Tp, _Up>::value;
2838 template <typename _Tp>
2839  inline constexpr bool is_copy_assignable_v = is_copy_assignable<_Tp>::value;
2840 template <typename _Tp>
2841  inline constexpr bool is_move_assignable_v = is_move_assignable<_Tp>::value;
2842 template <typename _Tp>
2843  inline constexpr bool is_destructible_v = is_destructible<_Tp>::value;
2844 template <typename _Tp, typename... _Args>
2845  inline constexpr bool is_trivially_constructible_v =
2846  is_trivially_constructible<_Tp, _Args...>::value;
2847 template <typename _Tp>
2848  inline constexpr bool is_trivially_default_constructible_v =
2849  is_trivially_default_constructible<_Tp>::value;
2850 template <typename _Tp>
2851  inline constexpr bool is_trivially_copy_constructible_v =
2852  is_trivially_copy_constructible<_Tp>::value;
2853 template <typename _Tp>
2854  inline constexpr bool is_trivially_move_constructible_v =
2855  is_trivially_move_constructible<_Tp>::value;
2856 template <typename _Tp, typename _Up>
2857  inline constexpr bool is_trivially_assignable_v =
2858  is_trivially_assignable<_Tp, _Up>::value;
2859 template <typename _Tp>
2860  inline constexpr bool is_trivially_copy_assignable_v =
2861  is_trivially_copy_assignable<_Tp>::value;
2862 template <typename _Tp>
2863  inline constexpr bool is_trivially_move_assignable_v =
2864  is_trivially_move_assignable<_Tp>::value;
2865 template <typename _Tp>
2866  inline constexpr bool is_trivially_destructible_v =
2867  is_trivially_destructible<_Tp>::value;
2868 template <typename _Tp, typename... _Args>
2869  inline constexpr bool is_nothrow_constructible_v =
2870  is_nothrow_constructible<_Tp, _Args...>::value;
2871 template <typename _Tp>
2872  inline constexpr bool is_nothrow_default_constructible_v =
2873  is_nothrow_default_constructible<_Tp>::value;
2874 template <typename _Tp>
2875  inline constexpr bool is_nothrow_copy_constructible_v =
2876  is_nothrow_copy_constructible<_Tp>::value;
2877 template <typename _Tp>
2878  inline constexpr bool is_nothrow_move_constructible_v =
2879  is_nothrow_move_constructible<_Tp>::value;
2880 template <typename _Tp, typename _Up>
2881  inline constexpr bool is_nothrow_assignable_v =
2882  is_nothrow_assignable<_Tp, _Up>::value;
2883 template <typename _Tp>
2884  inline constexpr bool is_nothrow_copy_assignable_v =
2885  is_nothrow_copy_assignable<_Tp>::value;
2886 template <typename _Tp>
2887  inline constexpr bool is_nothrow_move_assignable_v =
2888  is_nothrow_move_assignable<_Tp>::value;
2889 template <typename _Tp>
2890  inline constexpr bool is_nothrow_destructible_v =
2891  is_nothrow_destructible<_Tp>::value;
2892 template <typename _Tp>
2893  inline constexpr bool has_virtual_destructor_v =
2894  has_virtual_destructor<_Tp>::value;
2895 template <typename _Tp>
2896  inline constexpr size_t alignment_of_v = alignment_of<_Tp>::value;
2897 template <typename _Tp>
2898  inline constexpr size_t rank_v = rank<_Tp>::value;
2899 template <typename _Tp, unsigned _Idx = 0>
2900  inline constexpr size_t extent_v = extent<_Tp, _Idx>::value;
2901 template <typename _Tp, typename _Up>
2902  inline constexpr bool is_same_v = is_same<_Tp, _Up>::value;
2903 template <typename _Base, typename _Derived>
2904  inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
2905 template <typename _From, typename _To>
2906  inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value;
2907 
2908 #if __GNUC__ >= 7
2909 # define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1
2910 #elif defined(__is_identifier)
2911 // For non-GNU compilers:
2912 # if ! __is_identifier(__has_unique_object_representations)
2913 # define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1
2914 # endif
2915 #endif
2916 
2917 #ifdef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP
2918 # define __cpp_lib_has_unique_object_representations 201606
2919  /// has_unique_object_representations
2920  template<typename _Tp>
2921  struct has_unique_object_representations
2922  : bool_constant<__has_unique_object_representations(
2923  remove_cv_t<remove_all_extents_t<_Tp>>
2924  )>
2925  { };
2926 
2927  template<typename _Tp>
2928  inline constexpr bool has_unique_object_representations_v
2929  = has_unique_object_representations<_Tp>::value;
2930 #endif
2931 #undef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP
2932 
2933 #if __GNUC__ >= 7
2934 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1
2935 #elif defined(__is_identifier)
2936 // For non-GNU compilers:
2937 # if ! __is_identifier(__is_aggregate)
2938 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1
2939 # endif
2940 #endif
2941 
2942 #ifdef _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE
2943 #define __cpp_lib_is_aggregate 201703
2944  /// is_aggregate
2945  template<typename _Tp>
2946  struct is_aggregate
2947  : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> { };
2948 
2949  /// is_aggregate_v
2950  template<typename _Tp>
2951  inline constexpr bool is_aggregate_v = is_aggregate<_Tp>::value;
2952 #endif
2953 #undef _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE
2954 
2955 #endif // C++17
2956 
2957 #if __cplusplus > 201703L
2958  /// Byte order
2959  enum class endian
2960  {
2961  little = __ORDER_LITTLE_ENDIAN__,
2962  big = __ORDER_BIG_ENDIAN__,
2963  native = __BYTE_ORDER__
2964  };
2965 #endif // C++2a
2966 
2967 _GLIBCXX_END_NAMESPACE_VERSION
2968 } // namespace std
2969 
2970 #endif // C++11
2971 
2972 #endif // _GLIBCXX_TYPE_TRAITS