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