type_traits revision 276792
126997Sgibbs// -*- C++ -*-
226997Sgibbs//===-------------------------- type_traits -------------------------------===//
313177Sgibbs//
426997Sgibbs//                     The LLVM Compiler Infrastructure
526997Sgibbs//
613177Sgibbs// This file is dual licensed under the MIT and the University of Illinois Open
726997Sgibbs// Source Licenses. See LICENSE.TXT for details.
826997Sgibbs//
926997Sgibbs//===----------------------------------------------------------------------===//
1026997Sgibbs
1126997Sgibbs#ifndef _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
1226997Sgibbs#define _LIBCPP_EXPERIMENTAL_TYPE_TRAITS
1326997Sgibbs
1426997Sgibbs/**
1526997Sgibbs    experimental/type_traits synopsis
1626997Sgibbs
1726997Sgibbs// C++1y
1813177Sgibbs#include <type_traits>
1926997Sgibbs
2026997Sgibbsnamespace std {
2126997Sgibbsnamespace experimental {
2226997Sgibbsinline namespace fundamentals_v1 {
2326997Sgibbs
2426997Sgibbs  // See C++14 20.10.4.1, primary type categories
2513177Sgibbs  template <class T> constexpr bool is_void_v
2626997Sgibbs    = is_void<T>::value;
2726997Sgibbs  template <class T> constexpr bool is_null_pointer_v
2826997Sgibbs    = is_null_pointer<T>::value;
2926997Sgibbs  template <class T> constexpr bool is_integral_v
3026997Sgibbs    = is_integral<T>::value;
3126997Sgibbs  template <class T> constexpr bool is_floating_point_v
3226997Sgibbs    = is_floating_point<T>::value;
3326997Sgibbs  template <class T> constexpr bool is_array_v
3426997Sgibbs    = is_array<T>::value;
3526997Sgibbs  template <class T> constexpr bool is_pointer_v
3626997Sgibbs    = is_pointer<T>::value;
3713177Sgibbs  template <class T> constexpr bool is_lvalue_reference_v
3829897Sgibbs    = is_lvalue_reference<T>::value;
3926997Sgibbs  template <class T> constexpr bool is_rvalue_reference_v
404568Sgibbs    = is_rvalue_reference<T>::value;
4123925Sgibbs  template <class T> constexpr bool is_member_object_pointer_v
4223925Sgibbs    = is_member_object_pointer<T>::value;
435647Sgibbs  template <class T> constexpr bool is_member_function_pointer_v
4413177Sgibbs    = is_member_function_pointer<T>::value;
4519164Sgibbs  template <class T> constexpr bool is_enum_v
4619164Sgibbs    = is_enum<T>::value;
4713690Sgibbs  template <class T> constexpr bool is_union_v
4813690Sgibbs    = is_union<T>::value;
4913690Sgibbs  template <class T> constexpr bool is_class_v
5013690Sgibbs    = is_class<T>::value;
5113690Sgibbs  template <class T> constexpr bool is_function_v
5213690Sgibbs    = is_function<T>::value;
5313690Sgibbs
5413690Sgibbs  // See C++14 20.10.4.2, composite type categories
5519164Sgibbs  template <class T> constexpr bool is_reference_v
5619164Sgibbs    = is_reference<T>::value;
5719164Sgibbs  template <class T> constexpr bool is_arithmetic_v
5819164Sgibbs    = is_arithmetic<T>::value;
5919164Sgibbs  template <class T> constexpr bool is_fundamental_v
6013177Sgibbs    = is_fundamental<T>::value;
614568Sgibbs  template <class T> constexpr bool is_object_v
6213177Sgibbs    = is_object<T>::value;
6314449Sgibbs  template <class T> constexpr bool is_scalar_v
6414449Sgibbs    = is_scalar<T>::value;
6513177Sgibbs  template <class T> constexpr bool is_compound_v
6614449Sgibbs    = is_compound<T>::value;
6723925Sgibbs  template <class T> constexpr bool is_member_pointer_v
6823925Sgibbs    = is_member_pointer<T>::value;
6923925Sgibbs
7023925Sgibbs  // See C++14 20.10.4.3, type properties
718104Sgibbs  template <class T> constexpr bool is_const_v
7224662Sgibbs    = is_const<T>::value;
7324662Sgibbs  template <class T> constexpr bool is_volatile_v
7423925Sgibbs    = is_volatile<T>::value;
7523925Sgibbs  template <class T> constexpr bool is_trivial_v
7613177Sgibbs    = is_trivial<T>::value;
7723925Sgibbs  template <class T> constexpr bool is_trivially_copyable_v
7823925Sgibbs    = is_trivially_copyable<T>::value;
7923925Sgibbs  template <class T> constexpr bool is_standard_layout_v
8023925Sgibbs    = is_standard_layout<T>::value;
8113177Sgibbs  template <class T> constexpr bool is_pod_v
8223925Sgibbs    = is_pod<T>::value;
8324662Sgibbs  template <class T> constexpr bool is_literal_type_v
8424662Sgibbs    = is_literal_type<T>::value;
8523925Sgibbs  template <class T> constexpr bool is_empty_v
8623925Sgibbs    = is_empty<T>::value;
8723925Sgibbs  template <class T> constexpr bool is_polymorphic_v
8823925Sgibbs    = is_polymorphic<T>::value;
8919164Sgibbs  template <class T> constexpr bool is_abstract_v
9019164Sgibbs    = is_abstract<T>::value;
9129897Sgibbs  template <class T> constexpr bool is_final_v
924568Sgibbs    = is_final<T>::value;
9313690Sgibbs  template <class T> constexpr bool is_signed_v
9413690Sgibbs    = is_signed<T>::value;
9519164Sgibbs  template <class T> constexpr bool is_unsigned_v
9623925Sgibbs    = is_unsigned<T>::value;
9719164Sgibbs  template <class T, class... Args> constexpr bool is_constructible_v
9813177Sgibbs    = is_constructible<T, Args...>::value;
9923925Sgibbs  template <class T> constexpr bool is_default_constructible_v
10023925Sgibbs    = is_default_constructible<T>::value;
10123925Sgibbs  template <class T> constexpr bool is_copy_constructible_v
10223925Sgibbs    = is_copy_constructible<T>::value;
10319164Sgibbs  template <class T> constexpr bool is_move_constructible_v
10423925Sgibbs    = is_move_constructible<T>::value;
10523925Sgibbs  template <class T, class U> constexpr bool is_assignable_v
10619164Sgibbs    = is_assignable<T, U>::value;
10723925Sgibbs  template <class T> constexpr bool is_copy_assignable_v
10823925Sgibbs    = is_copy_assignable<T>::value;
10919164Sgibbs  template <class T> constexpr bool is_move_assignable_v
11019164Sgibbs    = is_move_assignable<T>::value;
11119164Sgibbs  template <class T> constexpr bool is_destructible_v
11219164Sgibbs    = is_destructible<T>::value;
11323925Sgibbs  template <class T, class... Args> constexpr bool is_trivially_constructible_v
11423925Sgibbs    = is_trivially_constructible<T, Args...>::value;
1154568Sgibbs  template <class T> constexpr bool is_trivially_default_constructible_v
11613177Sgibbs    = is_trivially_default_constructible<T>::value;
11713177Sgibbs  template <class T> constexpr bool is_trivially_copy_constructible_v
11813177Sgibbs    = is_trivially_copy_constructible<T>::value;
11913177Sgibbs  template <class T> constexpr bool is_trivially_move_constructible_v
12013177Sgibbs    = is_trivially_move_constructible<T>::value;
12119921Sgibbs  template <class T, class U> constexpr bool is_trivially_assignable_v
12219164Sgibbs    = is_trivially_assignable<T, U>::value;
12319164Sgibbs  template <class T> constexpr bool is_trivially_copy_assignable_v
12413177Sgibbs    = is_trivially_copy_assignable<T>::value;
1255647Sgibbs  template <class T> constexpr bool is_trivially_move_assignable_v
12623925Sgibbs    = is_trivially_move_assignable<T>::value;
12723925Sgibbs  template <class T> constexpr bool is_trivially_destructible_v
12823925Sgibbs    = is_trivially_destructible<T>::value;
12923925Sgibbs  template <class T, class... Args> constexpr bool is_nothrow_constructible_v
13023925Sgibbs    = is_nothrow_constructible<T, Args...>::value;
13119164Sgibbs  template <class T> constexpr bool is_nothrow_default_constructible_v
13219164Sgibbs    = is_nothrow_default_constructible<T>::value;
13319164Sgibbs  template <class T> constexpr bool is_nothrow_copy_constructible_v
13419164Sgibbs    = is_nothrow_copy_constructible<T>::value;
13519164Sgibbs  template <class T> constexpr bool is_nothrow_move_constructible_v
13623925Sgibbs    = is_nothrow_move_constructible<T>::value;
13723925Sgibbs  template <class T, class U> constexpr bool is_nothrow_assignable_v
13819164Sgibbs    = is_nothrow_assignable<T, U>::value;
13919164Sgibbs  template <class T> constexpr bool is_nothrow_copy_assignable_v
14019164Sgibbs    = is_nothrow_copy_assignable<T>::value;
14119164Sgibbs  template <class T> constexpr bool is_nothrow_move_assignable_v
14219164Sgibbs    = is_nothrow_move_assignable<T>::value;
14323925Sgibbs  template <class T> constexpr bool is_nothrow_destructible_v
14423925Sgibbs    = is_nothrow_destructible<T>::value;
14519164Sgibbs  template <class T> constexpr bool has_virtual_destructor_v
14623925Sgibbs    = has_virtual_destructor<T>::value;
14719218Sgibbs
14819218Sgibbs  // See C++14 20.10.5, type property queries
14921947Sgibbs  template <class T> constexpr size_t alignment_of_v
15019218Sgibbs    = alignment_of<T>::value;
15123925Sgibbs  template <class T> constexpr size_t rank_v
15223925Sgibbs    = rank<T>::value;
15319218Sgibbs  template <class T, unsigned I = 0> constexpr size_t extent_v
15419164Sgibbs    = extent<T, I>::value;
15523925Sgibbs
15619164Sgibbs  // See C++14 20.10.6, type relations
15723925Sgibbs  template <class T, class U> constexpr bool is_same_v
15823925Sgibbs    = is_same<T, U>::value;
15923925Sgibbs  template <class Base, class Derived> constexpr bool is_base_of_v
16025005Sgibbs    = is_base_of<Base, Derived>::value;
16119164Sgibbs  template <class From, class To> constexpr bool is_convertible_v
16223925Sgibbs    = is_convertible<From, To>::value;
16323925Sgibbs
16423925Sgibbs  // 3.3.2, Other type transformations
16523925Sgibbs  template <class> class invocation_type; // not defined
16625005Sgibbs  template <class F, class... ArgTypes> class invocation_type<F(ArgTypes...)>;
16719164Sgibbs  template <class> class raw_invocation_type; // not defined
16823925Sgibbs  template <class F, class... ArgTypes> class raw_invocation_type<F(ArgTypes...)>;
16923925Sgibbs
17023925Sgibbs  template <class T>
1714568Sgibbs    using invocation_type_t = typename invocation_type<T>::type;
1725326Sgibbs  template <class T>
17319164Sgibbs    using raw_invocation_type_t = typename raw_invocation_type<T>::type;
17419164Sgibbs
17519164Sgibbs} // namespace fundamentals_v1
17619164Sgibbs} // namespace experimental
17723925Sgibbs} // namespace std
17823925Sgibbs
17923925Sgibbs */
18023925Sgibbs
18123925Sgibbs#include <experimental/__config>
18223925Sgibbs
18323925Sgibbs#if _LIBCPP_STD_VER > 11
18423925Sgibbs
18523925Sgibbs#include <type_traits>
18623925Sgibbs
18723925Sgibbs_LIBCPP_BEGIN_NAMESPACE_LFTS
1888104Sgibbs
18923925Sgibbs#if __has_feature(cxx_variable_templates)
19023991Sgibbs
19123925Sgibbs// C++14 20.10.4.1, primary type categories
19223925Sgibbs
19323925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_void_v
19423925Sgibbs    = is_void<_Tp>::value;
19523991Sgibbs
19623925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_null_pointer_v
19723925Sgibbs    = is_null_pointer<_Tp>::value;
19823925Sgibbs
19923925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_integral_v
20023925Sgibbs    = is_integral<_Tp>::value;
20113177Sgibbs
20223925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_floating_point_v
20323925Sgibbs    = is_floating_point<_Tp>::value;
20413177Sgibbs
20523925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_array_v
20623925Sgibbs    = is_array<_Tp>::value;
20723925Sgibbs
20823925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pointer_v
20923925Sgibbs    = is_pointer<_Tp>::value;
21023925Sgibbs
21123925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_lvalue_reference_v
2124568Sgibbs    = is_lvalue_reference<_Tp>::value;
21313177Sgibbs
21423925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_rvalue_reference_v
21523925Sgibbs    = is_rvalue_reference<_Tp>::value;
21623925Sgibbs
21723925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_object_pointer_v
21823925Sgibbs    = is_member_object_pointer<_Tp>::value;
21923925Sgibbs
22025005Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_function_pointer_v
22123925Sgibbs    = is_member_function_pointer<_Tp>::value;
22223925Sgibbs
22323925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_enum_v
22423925Sgibbs    = is_enum<_Tp>::value;
22525005Sgibbs
22625005Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_union_v
22724914Sgibbs    = is_union<_Tp>::value;
22823925Sgibbs
22923925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_class_v
23013177Sgibbs    = is_class<_Tp>::value;
23113177Sgibbs
23213177Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_function_v
23313177Sgibbs    = is_function<_Tp>::value;
23413177Sgibbs
23513177Sgibbs// C++14 20.10.4.2,  composite type categories
23613177Sgibbs
2378567Sdgtemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_reference_v
23813177Sgibbs    = is_reference<_Tp>::value;
23923925Sgibbs
24023925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_arithmetic_v
24123925Sgibbs    = is_arithmetic<_Tp>::value;
24223925Sgibbs
24323925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_fundamental_v
2444568Sgibbs    = is_fundamental<_Tp>::value;
24513177Sgibbs
24615328Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_object_v
24715328Sgibbs    = is_object<_Tp>::value;
24813177Sgibbs
2496608Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_scalar_v
25023925Sgibbs    = is_scalar<_Tp>::value;
25123925Sgibbs
25223925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_compound_v
25323925Sgibbs    = is_compound<_Tp>::value;
2546608Sgibbs
25518762Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_member_pointer_v
25618762Sgibbs    = is_member_pointer<_Tp>::value;
25718762Sgibbs
25818762Sgibbs// C++14 20.10.4.3, type properties
25918762Sgibbs
26023925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_const_v
26123925Sgibbs    = is_const<_Tp>::value;
2626608Sgibbs
2638104Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_volatile_v
26425005Sgibbs    = is_volatile<_Tp>::value;
26525005Sgibbs
26625005Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivial_v
26725005Sgibbs    = is_trivial<_Tp>::value;
26825005Sgibbs
26925005Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copyable_v
27025005Sgibbs    = is_trivially_copyable<_Tp>::value;
27113177Sgibbs
27222451Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_standard_layout_v
27322451Sgibbs    = is_standard_layout<_Tp>::value;
27423925Sgibbs
27523925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_pod_v
27622451Sgibbs    = is_pod<_Tp>::value;
27723925Sgibbs
27823925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_literal_type_v
27923925Sgibbs    = is_literal_type<_Tp>::value;
28022451Sgibbs
28123925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_empty_v
28223925Sgibbs    = is_empty<_Tp>::value;
28323925Sgibbs
28423925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_polymorphic_v
28523925Sgibbs    = is_polymorphic<_Tp>::value;
28622451Sgibbs
28722451Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_abstract_v
28813177Sgibbs    = is_abstract<_Tp>::value;
28919164Sgibbs
29019164Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_final_v
29113177Sgibbs    = is_final<_Tp>::value;
29219164Sgibbs
29323925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_signed_v
29423925Sgibbs    = is_signed<_Tp>::value;
29523925Sgibbs
29623925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_unsigned_v
29719164Sgibbs    = is_unsigned<_Tp>::value;
29823925Sgibbs
29923925Sgibbstemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_constructible_v
30013177Sgibbs    = is_constructible<_Tp, _Ts...>::value;
30115843Sgibbs
30213177Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_default_constructible_v
30313177Sgibbs    = is_default_constructible<_Tp>::value;
30413177Sgibbs
30513177Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_constructible_v
30613177Sgibbs    = is_copy_constructible<_Tp>::value;
30713177Sgibbs
30813177Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_constructible_v
3094568Sgibbs    = is_move_constructible<_Tp>::value;
31024794Sgibbs
31124794Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_assignable_v
3124568Sgibbs    = is_assignable<_Tp, _Up>::value;
31323925Sgibbs
31423925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_copy_assignable_v
31523925Sgibbs    = is_copy_assignable<_Tp>::value;
3164568Sgibbs
31723925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_move_assignable_v
31823925Sgibbs    = is_move_assignable<_Tp>::value;
31923925Sgibbs
32023925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_destructible_v
32123925Sgibbs    = is_destructible<_Tp>::value;
32223925Sgibbs
3234568Sgibbstemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_trivially_constructible_v
32423925Sgibbs    = is_trivially_constructible<_Tp, _Ts...>::value;
32523925Sgibbs
3264568Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_default_constructible_v
32723925Sgibbs    = is_trivially_default_constructible<_Tp>::value;
32823925Sgibbs
32924794Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_constructible_v
33023925Sgibbs    = is_trivially_copy_constructible<_Tp>::value;
33123925Sgibbs
33223925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_constructible_v
33323925Sgibbs    = is_trivially_move_constructible<_Tp>::value;
33423925Sgibbs
33523925Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_trivially_assignable_v
33623925Sgibbs    = is_trivially_assignable<_Tp, _Up>::value;
33723925Sgibbs
33823925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_copy_assignable_v
33923925Sgibbs    = is_trivially_copy_assignable<_Tp>::value;
34023925Sgibbs
34123925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_move_assignable_v
34223925Sgibbs    = is_trivially_move_assignable<_Tp>::value;
34323925Sgibbs
34423925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_trivially_destructible_v
34523925Sgibbs    = is_trivially_destructible<_Tp>::value;
34623925Sgibbs
3474568Sgibbstemplate <class _Tp, class ..._Ts> _LIBCPP_CONSTEXPR bool is_nothrow_constructible_v
34823925Sgibbs    = is_nothrow_constructible<_Tp, _Ts...>::value;
34923925Sgibbs
3504568Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_default_constructible_v
35113177Sgibbs    = is_nothrow_default_constructible<_Tp>::value;
35213177Sgibbs
35313177Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_constructible_v
35413177Sgibbs    = is_nothrow_copy_constructible<_Tp>::value;
3559928Sgibbs
35623925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_constructible_v
35723925Sgibbs    = is_nothrow_move_constructible<_Tp>::value;
35823925Sgibbs
3594568Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_nothrow_assignable_v
3609928Sgibbs    = is_nothrow_assignable<_Tp, _Up>::value;
36123925Sgibbs
3629928Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_copy_assignable_v
36323925Sgibbs    = is_nothrow_copy_assignable<_Tp>::value;
36419164Sgibbs
36519164Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_move_assignable_v
36619164Sgibbs    = is_nothrow_move_assignable<_Tp>::value;
3675775Sgibbs
36823925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool is_nothrow_destructible_v
3694568Sgibbs    = is_nothrow_destructible<_Tp>::value;
37019164Sgibbs
37119164Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR bool has_virtual_destructor_v
37219164Sgibbs    = has_virtual_destructor<_Tp>::value;
37319164Sgibbs
37419164Sgibbs// C++14 20.10.5, type properties queries
37519164Sgibbs
37623925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR size_t alignment_of_v
37723925Sgibbs    = alignment_of<_Tp>::value;
37819164Sgibbs
37923925Sgibbstemplate <class _Tp> _LIBCPP_CONSTEXPR size_t rank_v
38019164Sgibbs    = rank<_Tp>::value;
38123925Sgibbs
38219164Sgibbstemplate <class _Tp, unsigned _Id = 0> _LIBCPP_CONSTEXPR size_t extent_v
38323925Sgibbs    = extent<_Tp, _Id>::value;
38423925Sgibbs
38519164Sgibbs// C++14 20.10.6, type relations
3869928Sgibbs
38716260Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_same_v
38823925Sgibbs    = is_same<_Tp, _Up>::value;
38916260Sgibbs
39016260Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_base_of_v
39116260Sgibbs    = is_base_of<_Tp, _Up>::value;
39216260Sgibbs
39316260Sgibbstemplate <class _Tp, class _Up> _LIBCPP_CONSTEXPR bool is_convertible_v
39416260Sgibbs    = is_convertible<_Tp, _Up>::value;
39523925Sgibbs
39623925Sgibbs#endif /* __has_feature(cxx_variable_templates) */
39723925Sgibbs
39823925Sgibbs// 3.3.2, Other type transformations
39923925Sgibbs/*
40016260Sgibbstemplate <class>
40116260Sgibbsclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type;
40219164Sgibbs
40323925Sgibbstemplate <class _Fn, class ..._Args>
40423925Sgibbsclass _LIBCPP_TYPE_VIS_ONLY raw_invocation_type<_Fn(_Args...)>;
4059928Sgibbs
40623925Sgibbstemplate <class>
4074568Sgibbsclass _LIBCPP_TYPE_VIS_ONLY invokation_type;
40816260Sgibbs
40923925Sgibbstemplate <class _Fn, class ..._Args>
41016260Sgibbsclass _LIBCPP_TYPE_VIS_ONLY invokation_type<_Fn(_Args...)>;
41122451Sgibbs
41223925Sgibbstemplate <class _Tp>
4137532Sgibbsusing invokation_type_t = typename invokation_type<_Tp>::type;
41413177Sgibbs
41513177Sgibbstemplate <class _Tp>
41613177Sgibbsusing raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
4179928Sgibbs*/
41823925Sgibbs
4194568Sgibbs_LIBCPP_END_NAMESPACE_LFTS
42023925Sgibbs
4214568Sgibbs#endif /* _LIBCPP_STD_VER > 11 */
42223925Sgibbs
42323925Sgibbs#endif /* _LIBCPP_EXPERIMENTAL_TYPE_TRAITS */
42423925Sgibbs