1#ifndef NEFORCE_CORE_TYPEINFO_TYPE_TRAITS_HPP__
2#define NEFORCE_CORE_TYPEINFO_TYPE_TRAITS_HPP__
12NEFORCE_BEGIN_NAMESPACE__
35template <
typename T, T Value>
37 static constexpr T
value = Value;
72template <u
int32_t Value>
80template <u
int64_t Value>
91template <
typename... Types>
103template <
bool Test,
typename T =
void>
117template <
bool Test,
typename T =
void>
128template <
bool Test,
typename T1,
typename T2>
134template <
typename T1,
typename T2>
144template <
bool Test,
typename T1,
typename T2>
158#ifdef NEFORCE_STANDARD_14
174template <
typename T1,
typename T2>
182#ifdef NEFORCE_STANDARD_14
187template <
typename T1,
typename T2>
218template <
typename T,
typename... Types>
221#ifdef NEFORCE_STANDARD_17
222template <
typename T,
typename... Types>
225template <
typename T,
typename... Types>
229template <
typename T,
typename U>
232template <
typename T,
typename U,
typename... Types>
237#ifdef NEFORCE_STANDARD_14
242template <
typename T,
typename... Types>
250template <bool,
typename first,
typename...>
251struct __disjunction_aux {
254template <
typename Curr,
typename Next,
typename... Rest>
255struct __disjunction_aux<false, Curr, Next, Rest...> {
256 using type =
typename __disjunction_aux<static_cast<bool>(Next::value), Next, Rest...>::type;
268template <
typename... Args>
272template <
typename First,
typename... Rest>
273struct disjunction<First, Rest...> : inner::__disjunction_aux<static_cast<bool>(First::value), First, Rest...>
::type {};
276#ifdef NEFORCE_STANDARD_14
281template <
typename... Args>
289template <bool,
typename First,
typename...>
290struct __conjunction_aux {
293template <
typename Curr,
typename Next,
typename... Rest>
294struct __conjunction_aux<true, Curr, Next, Rest...> {
295 using type =
typename __conjunction_aux<static_cast<bool>(Next::value), Next, Rest...>::type;
307template <
typename... Args>
311template <
typename First,
typename... Rest>
312struct conjunction<First, Rest...> : inner::__conjunction_aux<static_cast<bool>(First::value), First, Rest...>
::type {};
315#ifdef NEFORCE_STANDARD_14
320template <
typename... Args>
397 template <
typename wrapper>
406 template <
typename wrapper>
414 template <
typename wrapper>
422 template <
typename wrapper>
423 using bind_cv_t =
const volatile wrapper;
440template <
typename From,
typename To>
459 template <
typename wrapper>
468 template <
typename wrapper>
476 template <
typename wrapper>
494template <
typename From,
typename To>
503template <
typename From,
typename To>
536template <
typename T,
size_t Idx>
566template <
typename T,
size_t Idx>
568 using type =
typename remove_all_extents<T>::type;
573 using type =
typename remove_all_extents<T>::type;
600 template <
typename wrapper>
609 template <
typename wrapper>
617 template <
typename wrapper>
625 template <
typename wrapper>
633 template <
typename wrapper>
651template <
typename From,
typename To>
667template <
typename Ret,
typename... Args>
669 using type = Ret(Args...);
672#define __NEFORCE_EXPAND_REM_FUNC_QULF(QUF) \
673 template <typename Ret, typename... Args> \
674 struct remove_function_qualifiers<Ret(Args...) QUF> { \
675 using type = Ret(Args...); \
680#ifdef NEFORCE_STANDARD_17
683#undef __NEFORCE_EXPAND_REM_FUNC_QULF
708struct __is_void_helper<void> :
true_type {};
720struct is_void : inner::__is_void_helper<remove_cv_t<T>>::type {};
722#ifdef NEFORCE_STANDARD_14
738template <
typename T,
typename Dummy =
void>
758#ifdef NEFORCE_STANDARD_14
773template <
typename T,
typename Dummy =
void>
800#ifdef NEFORCE_STANDARD_14
817#ifdef NEFORCE_STANDARD_20
820 char16_t, char32_t>::value> {
823#ifdef NEFORCE_STANDARD_14
841#ifdef NEFORCE_STANDARD_14
860:
bool_constant<is_any_of<remove_cvref_t<T>, signed char, short, int, long, long long, unsigned char, unsigned short,
861 unsigned int, unsigned long, unsigned long long>::value> {};
863#ifdef NEFORCE_STANDARD_14
883#ifdef NEFORCE_STANDARD_14
901#ifdef NEFORCE_STANDARD_14
921#ifdef NEFORCE_STANDARD_14
933template <typename T, bool = is_integral<T>::value>
934struct __check_sign_aux {
940struct __check_sign_aux<T, false> {
942 static constexpr bool is_unsigned =
false;
955#ifdef NEFORCE_STANDARD_14
972#ifdef NEFORCE_STANDARD_14
996 using type =
const T;
1003template <
typename T>
1013template <
typename T>
1019template <
typename T>
1028template <
typename T>
1030 using type =
volatile T;
1037template <
typename T>
1045template <
typename T>
1047 using type =
const volatile T;
1054template <
typename T>
1066template <
typename T,
typename Dummy =
void>
1073template <
typename T>
1085template <
typename T>
1087 using type =
typename add_reference<T>::lvalue;
1094template <
typename T>
1102template <
typename T>
1104 using type =
typename add_reference<T>::rvalue;
1111template <
typename T>
1121template <
typename T,
typename Dummy =
void>
1127template <
typename T>
1137template <
typename T>
1154template <
typename T>
1157template <typename T>
1166template <typename T>
1174template <typename T>
1192template <typename T>
1196template <
typename T,
size_t Idx>
1199template <
typename T>
1203#ifdef NEFORCE_STANDARD_14
1208template <
typename T>
1221template <
typename T, u
int32_t Idx = 0>
1225template <
typename T,
size_t N>
1228template <
typename T, u
int32_t Idx,
size_t N>
1231template <
typename T, u
int32_t Idx>
1235#ifdef NEFORCE_STANDARD_14
1240template <
typename T, u
int32_t Idx = 0>
1257template <
typename T>
1261template <
template <
typename,
typename...>
class T,
typename First,
typename... Rest>
1271template <
typename Tmp>
1280template <
typename... Types>
1284template <
typename First,
typename... Rest>
1294template <
typename... Types>
1306template <
typename T,
typename Dummy =
void>
1312template <
typename T>
1314 using type =
typename T::difference_type;
1322template <
typename T>
1332template <
typename NewFirst,
typename T>
1336template <
typename NewFirst,
template <
typename,
typename...>
class T,
typename First,
typename... Rest>
1338 using type = T<NewFirst, Rest...>;
1346template <
typename T,
typename U>
1359template <
typename T,
typename U,
typename Dummy =
void>
1365template <
typename T,
typename U>
1367 enable_if_t<
is_same<typename T::template rebind<U>, typename T::template rebind<U>>::value>> {
1368 using type =
typename T::template rebind<U>;
1376template <
typename T,
typename U>
1392template <
typename T>
1396template <
typename T,
size_t Idx>
1400#ifdef NEFORCE_STANDARD_14
1405template <
typename T>
1415template <
typename T>
1419template <
typename T>
1423#ifdef NEFORCE_STANDARD_14
1428template <
typename T>
1439template <
typename T>
1442#ifdef NEFORCE_STANDARD_14
1447template <
typename T>
1457template <
typename T>
1461template <
typename T>
1465#ifdef NEFORCE_STANDARD_14
1470template <
typename T>
1479template <
typename T>
1483template <
typename T>
1487#ifdef NEFORCE_STANDARD_14
1492template <
typename T>
1504template <
typename T>
1507#ifdef NEFORCE_STANDARD_14
1512template <
typename T>
1522template <
typename T>
1525#ifdef NEFORCE_STANDARD_14
1530template <
typename T>
1542template <
typename T>
1546template <
typename T>
1549template <
typename T>
1552template <
typename T>
1555template <
typename T>
1559#ifdef NEFORCE_STANDARD_14
1564template <
typename T>
1574template <
typename T>
1577#ifdef NEFORCE_STANDARD_14
1582template <
typename T>
1594template <
typename T>
1597#ifdef NEFORCE_STANDARD_14
1602template <
typename T>
1612template <
typename T>
1615#ifdef NEFORCE_STANDARD_14
1620template <
typename T>
1630template <
typename T>
1633#ifdef NEFORCE_STANDARD_14
1638template <
typename T>
1650template <
typename T>
1653#ifdef NEFORCE_STANDARD_14
1658template <
typename T>
1670template <
typename T>
1673#ifdef NEFORCE_STANDARD_14
1678template <
typename T>
1688template <
typename T>
1692template <
typename T>
1696#ifdef NEFORCE_STANDARD_14
1701template <
typename T>
1711template <
typename T>
1715template <
typename T>
1719#ifdef NEFORCE_STANDARD_14
1724template <
typename T>
1729#ifdef NEFORCE_COMPILER_MSVC
1731# pragma warning(push)
1732# pragma warning(disable : 4180)
1743template <
typename T>
1745 !is_reference<remove_function_qualifiers_t<T>>::value> {};
1747#ifdef NEFORCE_STANDARD_14
1752template <
typename T>
1756#ifdef NEFORCE_COMPILER_MSVC
1757# pragma warning(pop)
1773template <
typename T>
1775:
bool_constant<!(is_void<T>::value || is_reference<T>::value || is_function<T>::value || is_const<T>::value) &&
1776 (sizeof(T) > 0)> {};
1778#ifdef NEFORCE_STANDARD_14
1783template <
typename T>
1796template <
typename T>
1799#ifdef NEFORCE_STANDARD_14
1804template <
typename T>
1818template <
typename T>
1820:
bool_constant<(is_pointer<remove_cvref_t<T>>::value && is_character<remove_pointer_t<remove_cvref_t<T>>>::value) ||
1821 (is_bounded_array<remove_cvref_t<T>>::value &&
1822 is_character<remove_all_extents_t<remove_cvref_t<T>>>::value)> {};
1824#ifdef NEFORCE_STANDARD_14
1829template <
typename T>
1839template <
typename T>
1843#ifdef NEFORCE_COMPILER_CLANG
1844template <
typename T>
1847NEFORCE_BEGIN_INNER__
1849struct __is_member_function_pointer_aux :
false_type {};
1850template <
typename T,
typename C>
1851struct __is_member_function_pointer_aux<T C::*> :
is_function<T> {};
1854template <
typename T>
1859#ifdef NEFORCE_STANDARD_14
1864template <
typename T>
1874template <
typename T>
1878#ifdef NEFORCE_COMPILER_CLANG
1879template <
typename T>
1882template <
typename T>
1884template <
typename T,
typename C>
1889#ifdef NEFORCE_STANDARD_14
1894template <
typename T>
1904template <
typename T>
1908#ifdef NEFORCE_COMPILER_CLANG
1909template <
typename T>
1912template <
typename T>
1917#ifdef NEFORCE_STANDARD_14
1922template <
typename T>
1939template <
typename T>
1942 disjunction<is_arithmetic<T>, is_enum<T>, is_pointer<T>, is_member_pointer<T>, is_null_pointer<T>>::value> {};
1944#ifdef NEFORCE_STANDARD_14
1949template <
typename T>
1964template <
typename T>
1967#ifdef NEFORCE_STANDARD_14
1972template <
typename T>
1984template <
typename T>
1987#ifdef NEFORCE_STANDARD_14
1992template <
typename T>
2004template <
typename T>
2007#ifdef NEFORCE_STANDARD_14
2012template <
typename T>
2024template <
typename T>
2027#ifdef NEFORCE_STANDARD_14
2032template <
typename T>
2038NEFORCE_BEGIN_INNER__
2039template <typename T, bool = is_enum<T>::value>
2040struct __underlying_type_aux {
2041 using type = __underlying_type(T);
2043template <
typename T>
2044struct __underlying_type_aux<T, false> {};
2055template <
typename T>
2062template <
typename T>
2077template <
typename T>
2080#ifdef NEFORCE_STANDARD_14
2085template <
typename T>
2097template <
typename T>
2100#ifdef NEFORCE_STANDARD_14
2105template <
typename T>
2122template <
typename T>
2125#ifdef NEFORCE_STANDARD_14
2130template <
typename T>
2147template <
typename T>
2151#ifdef NEFORCE_COMPILER_MSVC
2152template <
typename T>
2155template <
typename T>
2160#ifdef NEFORCE_STANDARD_14
2165template <
typename T>
2170#ifdef NEFORCE_COMPILER_MSVC
2181template <
typename T1,
typename T2>
2182struct is_layout_compatible :
bool_constant<__is_layout_compatible(T1, T2)> {};
2188# ifdef NEFORCE_STANDARD_14
2189template <
typename T1,
typename T2>
2190NEFORCE_INLINE17
constexpr bool is_layout_compatible_v = is_layout_compatible<T1, T2>::value;
2202template <
typename Base,
typename Derived>
2203struct is_pointer_interconvertible_base_of :
bool_constant<__is_pointer_interconvertible_base_of(Base, Derived)> {};
2205# ifdef NEFORCE_STANDARD_14
2210template <
typename Base,
typename Derived>
2211NEFORCE_INLINE17
constexpr bool is_pointer_interconvertible_base_of_v =
2212 is_pointer_interconvertible_base_of<Base, Derived>::value;
2223template <
typename Base,
typename Derived>
2226#ifdef NEFORCE_STANDARD_14
2231template <
typename Base,
typename Derived>
2236#ifdef NEFORCE_STANDARD_20
2246template <
typename T,
typename Mem>
2248 return __builtin_is_pointer_interconvertible_with_class(mp);
2263template <
typename S1,
typename S2,
typename M1,
typename M2>
2265 return __builtin_is_corresponding_member(m1, m2);
2287template <
typename T>
2290#ifdef NEFORCE_STANDARD_14
2295template <
typename T>
2307template <
typename T>
2310#ifdef NEFORCE_STANDARD_14
2315template <
typename T>
2325template <
typename T>
2328#ifdef NEFORCE_STANDARD_14
2333template <
typename T>
2344template <
typename T,
typename... Args>
2347#ifdef NEFORCE_STANDARD_14
2352template <
typename T,
typename... Args>
2362template <
typename T>
2365#ifdef NEFORCE_STANDARD_14
2370template <
typename T>
2380template <
typename T>
2383#ifdef NEFORCE_STANDARD_14
2388template <
typename T>
2394NEFORCE_BEGIN_INNER__
2395template <
typename T>
2396void __implicitly_default_construct_aux(
const T&)
noexcept;
2408template <
typename T,
typename Dummy =
void>
2412template <
typename T>
2417#ifdef NEFORCE_STANDARD_14
2422template <
typename T>
2432template <
typename T>
2435#ifdef NEFORCE_STANDARD_14
2440template <
typename T>
2451template <
typename To,
typename From>
2454#ifdef NEFORCE_STANDARD_14
2459template <
typename To,
typename From>
2471template <
typename T>
2473:
bool_constant<is_assignable<add_lvalue_reference_t<T>, add_lvalue_reference_t<const T>>::value> {};
2475#ifdef NEFORCE_STANDARD_14
2480template <
typename T>
2492template <
typename T>
2495#ifdef NEFORCE_STANDARD_14
2500template <
typename T>
2515template <
typename T>
2519#ifdef NEFORCE_COMPILER_MSVC
2520template <
typename T>
2523NEFORCE_BEGIN_INNER__
2524template <
typename T>
2525struct __destructible_aux {
2527 template <typename T1, typename = decltype(declval<T1&>().~T1())>
2533 using type =
decltype(__test<T>(0));
2536template <
typename T,
bool = disjunction<is_
void<T>, is_unbounded_array<T>, is_function<T>>::value,
2537 bool = disjunction<is_reference<T>, is_scalar<T>>::value>
2538struct __is_destructible_dispatch;
2540template <
typename T>
2541struct __is_destructible_dispatch<T, false, false> : __destructible_aux<remove_all_extents_t<T>>::type {};
2543template <
typename T>
2544struct __is_destructible_dispatch<T, true, false> :
false_type {};
2546template <
typename T>
2547struct __is_destructible_dispatch<T, false, true> :
true_type {};
2551template <
typename T>
2552struct is_destructible : inner::__is_destructible_dispatch<T>::type {};
2556#ifdef NEFORCE_STANDARD_14
2561template <
typename T>
2574template <
typename T,
typename... Args>
2577#ifdef NEFORCE_STANDARD_14
2582template <
typename T,
typename... Args>
2592template <
typename T>
2594:
bool_constant<is_trivially_constructible<T, add_lvalue_reference_t<const T>>::value> {};
2596#ifdef NEFORCE_STANDARD_14
2601template <
typename T>
2611template <
typename T>
2614#ifdef NEFORCE_STANDARD_14
2619template <
typename T>
2629template <
typename T>
2632#ifdef NEFORCE_STANDARD_14
2637template <
typename T>
2648template <
typename To,
typename From>
2651#ifdef NEFORCE_STANDARD_14
2656template <
typename To,
typename From>
2666template <
typename T>
2668:
bool_constant<is_trivially_assignable<add_lvalue_reference_t<T>, add_lvalue_reference_t<const T>>::value> {};
2670#ifdef NEFORCE_STANDARD_14
2675template <
typename T>
2685template <
typename T>
2688#ifdef NEFORCE_STANDARD_14
2693template <
typename T>
2705template <
typename T>
2707#if defined(NEFORCE_COMPILER_MSVC) || defined(NEFORCE_COMPILER_CLANG)
2715#ifdef NEFORCE_STANDARD_14
2720template <
typename T>
2731template <
typename T,
typename... Args>
2739template <
typename T>
2743#ifdef NEFORCE_COMPILER_MSVC
2744template <
typename T,
typename... Args>
2747NEFORCE_BEGIN_INNER__
2748template <typename T, bool = is_array<T>::value>
2749struct __is_nothrow_default_constructible_dispatch;
2751template <
typename T>
2752struct __is_nothrow_default_constructible_dispatch<T, true>
2753:
conjunction<is_bounded_array<T>, bool_constant<noexcept(remove_all_extents_t<T>())>> {};
2755template <
typename T>
2756struct __is_nothrow_default_constructible_dispatch<T, false> :
bool_constant<noexcept(T())> {};
2760template <
typename T>
2762:
conjunction<is_default_constructible<T>, inner::__is_nothrow_default_constructible_dispatch<T>> {};
2764NEFORCE_BEGIN_INNER__
2766template <
typename T,
typename... Args>
2767struct __is_nothrow_constructible_dispatch :
bool_constant<noexcept(T(_NEFORCE declval<Args>()...))> {};
2769template <
typename T>
2774template <
typename T,
typename... Args>
2776:
conjunction<is_constructible<T, Args...>, inner::__is_nothrow_constructible_dispatch<T, Args...>> {};
2780#ifdef NEFORCE_STANDARD_14
2785template <
typename T,
typename... Args>
2795template <
typename T>
2797:
bool_constant<is_nothrow_constructible<T, add_lvalue_reference_t<const T>>::value> {};
2799#ifdef NEFORCE_STANDARD_14
2804template <
typename T>
2810#ifdef NEFORCE_COMPILER_MSVC
2811template <
typename T>
2817#ifdef NEFORCE_STANDARD_14
2822template <
typename T>
2832template <
typename T>
2835#ifdef NEFORCE_STANDARD_14
2840template <
typename T>
2851template <
typename To,
typename From>
2855template <
typename To,
typename From>
2859#ifdef NEFORCE_STANDARD_14
2864template <
typename To,
typename From>
2874template <
typename T>
2876:
bool_constant<is_nothrow_assignable<add_lvalue_reference_t<T>, add_lvalue_reference_t<const T>>::value> {};
2878#ifdef NEFORCE_STANDARD_14
2883template <
typename T>
2893template <
typename T>
2896#ifdef NEFORCE_STANDARD_14
2901template <
typename T>
2906#ifndef NEFORCE_COMPILER_MSVC
2908NEFORCE_BEGIN_INNER__
2909template <
typename T>
2910struct __is_nothrow_destructible_aux {
2912 template <
typename T1>
2919 using type =
decltype(__test<T>(0));
2922template <
typename T,
bool = disjunction<is_
void<T>, is_unbounded_array<T>, is_function<T>>::value,
2923 bool = disjunction<is_reference<T>, is_scalar<T>>::value>
2924struct __is_nothrow_destructible_dispatch;
2926template <
typename T>
2927struct __is_nothrow_destructible_dispatch<T, false, false>
2928: __is_nothrow_destructible_aux<remove_all_extents_t<T>>::type {};
2930template <
typename T>
2931struct __is_nothrow_destructible_dispatch<T, true, false> :
false_type {};
2933template <
typename T>
2934struct __is_nothrow_destructible_dispatch<T, false, true> :
true_type {};
2945template <
typename T>
2949template <
typename T>
2951#ifdef NEFORCE_COMPILER_MSVC
2955 inner::__is_nothrow_destructible_dispatch<T>::type {
2960#ifdef NEFORCE_STANDARD_14
2965template <
typename T>
2978template <
typename T>
2981#ifdef NEFORCE_STANDARD_14
2986template <
typename T>
3006template <
typename T>
3008 return static_cast<T&&
>(x);
3020template <
typename T>
3023 return static_cast<T&&
>(x);
3034template <
typename T>
3047template <
typename T>
3051 return _NEFORCE
move(x);
3062template <
typename T>
3064 return __builtin_addressof(x);
3072template <
typename T>
3076template <
typename T,
typename U>
3077constexpr size_t offset_of(U T::* member) {
3078 return reinterpret_cast<size_t>(&(
reinterpret_cast<T
const volatile*
>(
nullptr)->*member));
3090#if !defined(NEFORCE_COMPILER_MSVC) && !defined(NEFORCE_COMPILER_CLANG)
3092NEFORCE_BEGIN_INNER__
3093template <
typename From,
typename To,
bool = disjunction_v<is_
void<From>, is_function<To>, is_array<To>>>
3094struct __is_convertible_helper {
3095 using type =
typename is_void<To>::type;
3098template <
typename From,
typename To>
3099struct __is_convertible_helper<From, To, false> {
3101 template <typename From1, typename To1, typename = decltype(_NEFORCE declvoid<To1>(_NEFORCE
declval<From1>()))>
3104 template <
typename,
typename>
3108 using type =
decltype(__test<From, To>(0));
3120template <
typename From,
typename To>
3122#if defined(NEFORCE_COMPILER_MSVC)
3125#elif defined(NEFORCE_COMPILER_CLANG)
3129 inner::__is_convertible_helper<From, To>::type {
3133#ifdef NEFORCE_STANDARD_14
3138template <
typename From,
typename To>
3142#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
3149template <
typename From,
typename To>
3162template <
typename ToElement,
typename FromElement>
3165#ifdef NEFORCE_STANDARD_14
3170template <
typename ToElement,
typename FromElement>
3183template <typename From, typename To, bool IsConvertible = is_convertible<From, To>::value,
3188template <
typename From,
typename To,
bool IsVo
id>
3191template <
typename From,
typename To>
3195#ifdef NEFORCE_STANDARD_14
3200template <
typename From,
typename To>
3212template <
typename Iterator,
typename Ptr,
bool IsPtr = is_po
inter<remove_cvref_t<Iterator>>::value>
3216template <
typename Iterator,
typename Ptr>
3218:
bool_constant<noexcept(_NEFORCE declcopy<Ptr>(_NEFORCE declval<Iterator>().operator->()))> {};
3221#ifdef NEFORCE_STANDARD_14
3226template <
typename Iterator,
typename Ptr>
3239NEFORCE_BEGIN_INNER__
3241struct __sign_byte_aux;
3244struct __sign_byte_aux<1> {
3246 using signed_t =
signed char;
3248 using unsigned_t =
unsigned char;
3251struct __sign_byte_aux<2> {
3253 using signed_t =
signed short;
3255 using unsigned_t =
unsigned short;
3258struct __sign_byte_aux<4> {
3259#ifdef NEFORCE_PLATFORM_WINDOWS
3260 template <
typename T>
3263 template <
typename T>
3266#elif defined(NEFORCE_PLATFORM_LINUX)
3268 using signed_t =
signed int;
3270 using unsigned_t =
unsigned int;
3274struct __sign_byte_aux<8> {
3275#ifdef NEFORCE_PLATFORM_WINDOWS
3277 using signed_t =
signed long long;
3279 using unsigned_t =
unsigned long long;
3280#elif defined(NEFORCE_PLATFORM_LINUX)
3281 template <
typename T>
3285 template <
typename T>
3287 unsigned long long>;
3291template <
typename T>
3292using __set_signed_byte =
typename __sign_byte_aux<
sizeof(T)>::template signed_t<T>;
3293template <
typename T>
3294using __set_unsigned_byte =
typename __sign_byte_aux<
sizeof(T)>::template unsigned_t<T>;
3296template <
typename T>
3299 "make signed only support non-bool && integral-like types");
3314template <
typename T>
3316 using type =
typename inner::__set_sign<T>::signed_type;
3323template <
typename T>
3333template <
typename T>
3335 using type =
typename inner::__set_sign<T>::unsigned_type;
3342template <
typename T>
3347NEFORCE_BEGIN_INNER__
3348template <
size_t Size,
bool IsSigned>
3349struct __make_integer_impl;
3351template <
size_t Size>
3352struct __make_integer_impl<Size, true> {
3353 using type =
typename __sign_byte_aux<Size>::template signed_t<int>;
3356template <
size_t Size>
3357struct __make_integer_impl<Size, false> {
3358 using type =
typename __sign_byte_aux<Size>::template unsigned_t<int>;
3369template <
size_t Size,
bool IsSigned = true>
3371 using type =
typename inner::__make_integer_impl<Size, IsSigned>::type;
3378template <
size_t Size,
bool IsSigned = true>
3387template <
size_t... Values>
3391template <
size_t Value>
3394template <
size_t First,
size_t Second,
size_t... Rest>
3395struct max_value<First, Second, Rest...> :
max_value<(First > Second ? First : Second), Rest...> {};
3398#ifdef NEFORCE_STANDARD_14
3399template <
size_t... Values>
3400NEFORCE_INLINE17
constexpr size_t max_value_v =
max_value<Values...>::value;
3416template <
typename T>
3419#ifdef NEFORCE_STANDARD_14
3424template <
typename T>
3435template <
size_t Len,
size_t Align = alignof(_NEFORCE max_align_t)>
3437 static_assert((Align & (Align - 1)) == 0,
"Alignment must be power of two");
3452template <
size_t Len,
size_t Align = alignof(_NEFORCE max_align_t)>
3464template <
size_t Len,
typename... Types>
3467 static constexpr size_t required_alignment =
max_value<
alignof(Types)...>::value;
3468 static constexpr size_t required_size =
max_value<
sizeof(Types)...>::value;
3469 static constexpr size_t storage_size = (Len > required_size) ? Len : required_size;
3471 static_assert((required_alignment & (required_alignment - 1)) == 0,
"Alignment must be power of two");
3487 struct alignas(alignment_value)
type {
3501 template <
typename T>
3511template <
size_t Len,
typename... Types>
3514#ifdef NEFORCE_STANDARD_14
3519template <
size_t Len,
typename... Types>
3541template <
typename T>
3545 using check_func_t =
3557template <
typename T>
3562NEFORCE_BEGIN_INNER__
3563template <
typename Default,
typename,
template <
typename...>
class,
typename...>
3566 using type = Default;
3568template <
typename Default,
template <
typename...>
class Op,
typename... Args>
3569struct __detector<Default,
void_t<Op<Args...>>, Op, Args...> {
3571 using type = Op<Args...>;
3583template <
typename Default,
template <
typename...>
class Op,
typename... Args>
3590template <
typename Default,
template <
typename...>
class Op,
typename... Args>
3605template <
typename T1,
typename T2>
3610NEFORCE_BEGIN_INNER__
3611template <
typename,
typename,
typename =
void>
3612struct __oper_decay_aux {};
3613template <
typename T1,
typename T2>
3625template <
typename... Types>
3632template <
typename... Types>
3639template <
typename T1>
3640struct common_type<T1> : common_type<T1, T1> {};
3642template <
typename T1,
typename T2>
3643struct common_type<T1, T2> : inner::__oper_decay_aux<T1, T2> {};
3645template <
typename T1,
typename T2,
typename... Rest>
3646struct common_type<T1, T2, Rest...> : common_type<common_type_t<T1, T2>, Rest...> {};
3650#ifdef NEFORCE_STANDARD_20
3657template <
typename... Types>
3664template <
typename... Types>
3672template <
typename T>
3673struct common_reference<T> {
3678NEFORCE_BEGIN_INNER__
3680template <
typename T1,
typename T2>
3681struct __common_reference_base_aux : common_type<T1, T2> {};
3683template <
typename T1,
typename T2>
3685struct __common_reference_base_aux<T1, T2> {
3689template <
typename,
typename,
template <
typename>
typename,
template <
typename>
typename>
3690struct __basic_common_reference {};
3692template <
typename T1>
3693struct __add_qualifier_aux {
3694 template <
typename T2>
3698template <
typename T1,
typename T2>
3699using qualifier_extract =
typename __basic_common_reference<remove_cvref_t<T1>,
remove_cvref_t<T2>,
3700 __add_qualifier_aux<T1>::template apply_t,
3701 __add_qualifier_aux<T2>::template apply_t>::type;
3703template <
typename T1,
typename T2>
3704struct __common_ref_qualify_aux : __common_reference_base_aux<T1, T2> {};
3706template <
typename T1,
typename T2>
3707 requires requires {
typename qualifier_extract<T1, T2>; }
3708struct __common_ref_qualify_aux<T1, T2> {
3709 using type = qualifier_extract<T1, T2>;
3712template <
typename T1,
typename T2>
3713struct __common_reference_ptr_aux : __common_ref_qualify_aux<T1, T2> {};
3715template <
typename T1,
typename T2>
3719template <
typename,
typename>
3720struct __common_reference_aux {};
3722template <
typename T1,
typename T2>
3723 requires requires {
typename __common_lvalue_aux<T1, T2>; }
3724struct __common_reference_aux<T1&, T2&> {
3725 using type = __common_lvalue_aux<T1, T2>;
3728template <
typename T1,
typename T2>
3730struct __common_reference_aux<T1&&, T2&> {
3731 using type = __common_lvalue_aux<const T1, T2>;
3734template <
typename T1,
typename T2>
3736struct __common_reference_aux<T1&, T2&&> {
3737 using type = __common_lvalue_aux<const T2, T1>;
3740template <
typename T1,
typename T2>
3743template <
typename T1,
typename T2>
3745struct __common_reference_aux<T1&&, T2&&> {
3746 using type = __common_rvalue_aux<T1, T2>;
3749template <
typename T1,
typename T2>
3750using __common_reference_aux_t =
typename __common_reference_aux<T1, T2>::type;
3752template <
typename T1,
typename T2>
3755struct __common_reference_ptr_aux<T1, T2> {
3756 using type = __common_reference_aux_t<T1, T2>;
3762template <
typename T1,
typename T2>
3763struct common_reference<T1, T2> : inner::__common_reference_ptr_aux<T1, T2> {};
3765template <
typename T1,
typename T2,
typename T3,
typename... Rest>
3766struct common_reference<T1, T2, T3, Rest...> {};
3768template <
typename T1,
typename T2,
typename T3,
typename... Rest>
3770struct common_reference<T1, T2, T3, Rest...> : common_reference<common_reference_t<T1, T2>, T3, Rest...> {};
3784template <
typename T,
template <
typename...>
class Template>
3788template <
template <
typename...>
class Template,
typename... Args>
3792#ifdef NEFORCE_STANDARD_17
3797template <
typename T,
template <
typename...>
class Template>
3806template <
typename T,
template <
typename...>
class Template>
3824struct is_nothrow_swappable;
3833template <
typename T>
3844template <
typename T,
size_t Size>
3861template <
typename T,
typename U = T>
3873template <
typename T1,
typename T2,
typename Dummy =
void>
3877template <
typename T1,
typename T2>
3891template <
typename T1,
typename T2>
3900template <
typename T>
3903#ifdef NEFORCE_STANDARD_14
3908template <
typename T>
3919template <
typename T1,
typename T2>
3921:
bool_constant<noexcept(_NEFORCE swap(_NEFORCE declval<T1>(), _NEFORCE declval<T2>())) &&
3922 noexcept(_NEFORCE swap(_NEFORCE declval<T2>(), _NEFORCE declval<T1>()))> {};
3931template <
typename T1,
typename T2>
3933:
bool_constant<conjunction<is_swappable_with<T1, T2>, is_nothrow_swappable_from<T1, T2>>::value> {};
3941template <
typename T>
3943:
bool_constant<is_nothrow_swappable_with<add_lvalue_reference_t<T>, add_lvalue_reference_t<T>>::value> {};
3945#ifdef NEFORCE_STANDARD_14
3950template <
typename T>
3965template <
typename T,
typename Dummy =
void>
3969template <
typename T>
3985template <
typename T>
3987:
bool_constant<conjunction<is_trivially_destructible<T>, is_trivially_move_constructible<T>,
3988 is_trivially_move_assignable<T>, negation<is_ADL_swappable<T>>>::value> {};
3990#ifdef NEFORCE_STANDARD_14
3995template <
typename T>
4001template <
typename T>
4004 T tmp = _NEFORCE
move(lhs);
4005 lhs = _NEFORCE
move(rhs);
4006 rhs = _NEFORCE
move(tmp);
4010template <
typename T,
size_t Size>
4011NEFORCE_CONSTEXPR14 enable_if_t<is_swappable<T>::value>
swap(T (&lhs)[Size],
4017 T* last1 = first1 + Size;
4019 for (; first1 != last1; ++first1, ++first2) {
4020 _NEFORCE
swap(*first1, *first2);
4025template <
typename T,
typename U>
4028 T old_val = _NEFORCE
move(val);
4043#ifdef NEFORCE_STANDARD_20
4053template <
typename T>
4055 typename T::first_type;
4056 typename T::second_type;
4073template <
typename Alloc,
typename Dummy =
void>
4077template <
typename Alloc>
4078struct is_allocator<Alloc,
void_t<typename Alloc::value_type, decltype(declval<Alloc&>().allocate(size_t{}))>>
4082#ifdef NEFORCE_STANDARD_14
4087template <
typename Alloc>
4093NEFORCE_BEGIN_INNER__
4094template <
typename T>
4095struct __has_valid_begin_end {
4097 template <
typename U>
4098 static auto __test(
int)
4102 template <
typename U>
4106 static constexpr bool value =
decltype(__test<T>(0))::value;
4117template <
typename Iterator>
4120 template <
typename U>
4123 template <
typename U>
4127 static constexpr bool value =
decltype(__test<Iterator>(0))::value;
4130#ifdef NEFORCE_STANDARD_14
4135template <
typename Iterator>
4145template <
typename Iterator>
4148 template <
typename U>
4151 template <
typename U>
4155 static constexpr bool value =
decltype(__test<Iterator>(0))::value;
4158#ifdef NEFORCE_STANDARD_14
4163template <
typename Iterator>
4177template <
typename Container>
4179 is_incrementible<decltype(declval<Container>().begin())>::value> {};
4181#ifdef NEFORCE_STANDARD_14
4186template <
typename T>
4192NEFORCE_BEGIN_INNER__
4193template <
typename T>
4194struct __has_first_and_second {
4196 template <
typename U>
4199 template <
typename U>
4203 static constexpr bool value =
decltype(__test<T>(0))::value;
4217template <
typename Map>
4220 inner::__has_first_and_second<decltype(*declval<decltype(declval<Map>().begin())>())>::value> {};
4222#ifdef NEFORCE_STANDARD_14
4227template <
typename Map>
4233NEFORCE_BEGIN_INNER__
4234template <
typename Alloc,
typename T,
typename... Args>
4235struct __has_construct_impl {
4237 template <typename Alloc1, typename = decltype(_NEFORCE declval<Alloc1*>()->construct(_NEFORCE
declval<T*>(),
4245 using type =
decltype(__test<Alloc>(0));
4257template <
typename Alloc,
typename T,
typename... Args>
4260#ifdef NEFORCE_STANDARD_14
4265template <
typename Alloc,
typename T,
typename... Args>
4271NEFORCE_BEGIN_INNER__
4272template <
typename T>
4273struct __has_base_impl {
4275 template <
typename U>
4278 template <
typename U>
4282 static constexpr bool value =
decltype(__test<T>(0))::value;
4292template <
typename T>
4295#ifdef NEFORCE_STANDARD_14
4300template <
typename T>
4322template <
typename T>
4328#define __NEFORCE_INITIALIZE_BASIC_FUNCTION(OPT) \
4330 NEFORCE_ALWAYS_INLINE constexpr OPT initialize() noexcept { \
4331 return static_cast<OPT>(0); \
4335#undef __NEFORCE_INITIALIZE_BASIC_FUNCTION
4341NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr add_const_t< T > & as_const(T &val) noexcept
将值转换为const引用
typename add_volatile< T >::type add_volatile_t
add_volatile的便捷别名
typename add_pointer< T >::type add_pointer_t
add_pointer的便捷别名
typename add_const< T >::type add_const_t
add_const的便捷别名
typename add_cv< T >::type add_cv_t
add_cv的类型别名
typename add_reference< T >::lvalue add_lvalue_reference_t
add_lvalue_reference的便捷别名
typename add_reference< T >::rvalue add_rvalue_reference_t
add_rvalue_reference的便捷别名
constexpr size_t aligned_union_v
获取aligned_union的对齐要求值
typename aligned_union< Len, Types... >::type aligned_union_t
aligned_union的便捷别名
typename aligned_storage< Len, Align >::type aligned_storage_t
aligned_storage的便捷别名
constexpr size_t alignment_of_v
alignment_of的便捷变量模板
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr remove_reference_t< T > && move(T &&x) noexcept
无条件转换为右值引用
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_NODISCARD constexpr conditional_t<!is_nothrow_move_constructible< T >::value &&is_copy_constructible< T >::value, const T &, T && > move_if_noexcept(T &x) noexcept
在安全的情况下执行移动操作
NEFORCE_INLINE17 constexpr size_t rank_v
rank的便捷变量模板
NEFORCE_INLINE17 constexpr size_t extent_v
extent的便捷变量模板
typename unpackage< T >::type unpackage_t
unpackage的便捷别名
NEFORCE_INLINE17 constexpr bool is_floating_point_v
is_floating_point的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_packaged_v
is_packaged的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_character_v
is_character的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_unpackaged_v
is_unpackaged的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_integral_v
is_integral的便捷变量模板
unpackage_t< remove_cvref_t< T > > unpack_remove_cvref_t
同时解包并移除cv和引用限定符
NEFORCE_INLINE17 constexpr bool is_signed_v
is_signed的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_arithmetic_v
is_arithmetic的便捷变量模板
typename package< T >::type package_t
package的便捷别名
NEFORCE_INLINE17 constexpr bool is_unsigned_v
is_unsigned的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_boolean_v
is_boolean的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_void_v
is_void的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_standard_integral_v
is_standard_integral的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_compound_v
is_compound的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_bounded_array_v
is_bounded_array的便捷变量模板
typename underlying_type< T >::type underlying_type_t
underlying_type的便捷别名
NEFORCE_INLINE17 constexpr bool is_polymorphic_v
is_polymorphic的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_base_of_v
is_base_of的便捷变量模板
constexpr bool is_pointer_interconvertible_with_class(Mem T::*mp) noexcept
判断成员指针是否指向类对象的起始位置
NEFORCE_INLINE17 constexpr bool is_member_object_pointer_v
is_member_object_pointer的便捷变量模板
constexpr bool is_corresponding_member(M1 S1::*m1, M2 S2::*m2) noexcept
判断两个成员指针是否指向对应位置的成员
NEFORCE_INLINE17 constexpr bool is_standard_layout_v
is_standard_layout的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_reference_v
is_reference的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_unbounded_array_v
is_unbounded_array的便捷变量模板
constexpr bool is_cstring_v
is_cstring的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_member_pointer_v
is_member_pointer的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_aggregate_v
is_aggregate的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_const_v
is_const的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_enum_v
is_enum的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_integral_like_v
is_integral_like的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_allocable_v
is_allocable的便捷变量模板
NEFORCE_INLINE17 constexpr bool has_unique_object_representations_v
has_unique_object_representations的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_lvalue_reference_v
is_lvalue_reference的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_final_v
is_final的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_pod_v
is_pod的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_volatile_v
is_volatile的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_null_pointer_v
is_null_pointer的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_fundamental_v
is_fundamental的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_member_function_pointer_v
is_member_function_pointer的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_class_v
is_class的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_rvalue_reference_v
is_rvalue_reference的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_scalar_v
is_scalar的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_union_v
is_union的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_array_v
is_array的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_abstract_v
is_abstract的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_empty_v
is_empty的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_pointer_v
is_pointer的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_function_v
is_function的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_convertible_v
is_nothrow_convertible的便捷变量模板
is_convertible< FromElement(*)[], ToElement(*)[]> is_array_convertible
判断数组元素类型FromElement是否可以转换为ToElement
NEFORCE_INLINE17 constexpr bool is_nothrow_arrow_v
is_nothrow_arrow的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_convertible_v
is_convertible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_array_convertible_v
is_array_convertible的便捷变量模板
unsigned char byte_t
字节类型,定义为无符号字符
typename remove_all_extents< T >::type remove_all_extents_t
remove_all_extents的便捷别名
copy_ref_t< From, copy_cv_t< From, To > > copy_cvref_t
同时复制cv和引用限定符
typename remove_pointer< From >::template bind_pointer_t< To > copy_pointer_t
复制指针限定符
typename remove_function_qualifiers< T >::type remove_function_qualifiers_t
remove_function_qualifiers的便捷别名
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
typename remove_cv< From >::template bind_cv_t< To > copy_cv_t
复制cv限定符
typename remove_volatile< T >::type remove_volatile_t
remove_volatile的便捷别名
typename remove_reference< T >::type remove_reference_t
remove_reference的便捷别名
typename remove_const< T >::type remove_const_t
remove_const的便捷别名
typename remove_pointer< T >::type remove_pointer_t
remove_pointer的便捷别名
typename remove_cv< T >::type remove_cv_t
remove_cv的便捷别名
typename remove_reference< From >::template bind_ref_t< To > copy_ref_t
复制引用限定符
typename remove_extent< T >::type remove_extent_t
remove_extent的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
typename make_integer< Size, IsSigned >::type make_integer_t
make_integer的便捷别名
typename make_unsigned< T >::type make_unsigned_t
make_unsigned的便捷别名
typename make_signed< T >::type make_signed_t
make_signed的便捷别名
NEFORCE_CONSTEXPR14 T exchange(T &val, U &&new_val) noexcept(is_nothrow_move_constructible_v< T > &&is_nothrow_assignable_v< T &, U >)
将新值赋给对象并返回旧值
NEFORCE_INLINE17 constexpr bool is_trivially_swappable_v
is_trivially_swappable的便捷变量模板
void swap()=delete
删除无参数的swap重载
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_swappable_v
is_swappable的便捷变量模板
typename get_first_para< Types... >::type get_first_para_t
get_first_para的便捷别名
typename get_ptr_difference< T >::type get_ptr_difference_t
get_ptr_difference的便捷别名
typename replace_first_para< T, U >::type replace_first_para_t
replace_first_para的便捷别名
typename get_first_temp_para< Tmp >::type get_first_temp_para_t
get_first_temp_para的便捷别名
typename get_rebind_type< T, U >::type get_rebind_type_t
get_rebind_type的便捷别名
NEFORCE_INLINE17 constexpr bool is_maplike_v
is_maplike的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_iterable_v
is_iterable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_allocator_v
is_allocator的便捷变量模板
NEFORCE_INLINE17 constexpr bool has_base_v
has_base的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_decrementible_v
is_decrementible的便捷变量模板
NEFORCE_INLINE17 constexpr bool has_construct_v
has_construct的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_incrementible_v
iis_incrementible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_specialization_v
is_specialization的便捷变量模板
typename common_type< Types... >::type common_type_t
common_type的便捷别名
decltype(true ? _NEFORCE declval< T1 >() :_NEFORCE declval< T2 >()) common_ternary_operator_t
三目运算符的公共类型推导
typename decay< T >::type decay_t
decay的便捷别名
typename detected_or< Default, Op, Args... >::type detected_or_t
detected_or的便捷别名,返回检测到的类型或默认类型
typename common_reference< Types... >::type common_reference_t
common_reference的便捷别名
inner::__detector< Default, void, Op, Args... > detected_or
检测Op<Args...>是否有效,如果无效则使用Default类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
#define NEFORCE_MACRO_RANGES_CV_REF_NOEXCEPT(MAC)
cv、引用和noexcept限定符列表宏
#define NEFORCE_MACRO_RANGES_CV(MAC)
cv限定符列表宏
#define NEFORCE_MACRO_RANGES_CV_REF(MAC)
cv和引用限定符列表宏
#define NEFORCE_MACRO_RANGE_ARITHMETIC(MAC)
所有算术类型列表宏
NEFORCE_INLINE17 constexpr bool is_nothrow_default_constructible_v
is_nothrow_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool has_virtual_destructor_v
has_virtual_destructor的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_assignable_v
is_nothrow_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_constructible_v
is_nothrow_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_copy_assignable_v
is_nothrow_copy_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_copy_constructible_v
is_copy_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_location_invariant_v
is_location_invariant的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_assignable_v
is_trivially_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_default_constructible_v
is_trivially_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_assignable_v
is_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_constructible_v
is_trivially_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_destructible_v
is_trivially_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_destructible_v
is_nothrow_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_move_assignable_v
is_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_copyable_v
is_trivially_copyable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_copy_constructible_v
is_trivially_copy_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_default_constructible_v
is_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_destructible_v
is_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_constructible_v
is_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_move_constructible_v
is_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_move_constructible_v
is_trivially_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_copy_assignable_v
is_trivially_copy_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivially_move_assignable_v
is_trivially_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_trivial_v
is_trivial的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_implicitly_default_constructible_v
is_implicitly_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_copy_constructible_v
is_nothrow_copy_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_copy_assignable_v
is_copy_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool disjunction_v
disjunction的便捷变量模板
integral_constant< uint64_t, Value > uint64_constant
64位无符号整数常量包装器
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
NEFORCE_INLINE17 constexpr bool negation_v
negation的便捷变量模板
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
integral_constant< uint32_t, Value > uint32_constant
32位无符号整数常量包装器
NEFORCE_INLINE17 constexpr bool is_any_of_v
is_any_of的便捷变量模板
bool_constant< true > true_type
表示true的类型
typename type_identity< T >::type type_identity_t
type_identity的便捷别名
bool_constant< false > false_type
表示false的类型
integral_constant< bool, Value > bool_constant
布尔常量包装器
NEFORCE_INLINE17 constexpr bool conjunction_v
conjunction的便捷变量模板
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
void swap(unique_ptr< T, Deleter > &lhs, unique_ptr< T, Deleter > &rhs) noexcept
交换两个unique_ptr
byte_t data[storage_size]
原始存储数据
static constexpr bool is_storable() noexcept
检查指定类型是否可以安全存储在aligned_union中
static constexpr size_t size_value
存储的实际大小
static constexpr size_t alignment_value
存储的对齐要求
integral_constant< T, Value > type
自身类型
NEFORCE_NODISCARD constexpr value_type operator()() const noexcept
static constexpr bool value
wrapper bind_cv_t
将原类型的cv限定符应用到其他类型
wrapper bind_pointer_t
将原类型的指针限定符应用到其他类型
wrapper bind_ref_t
将原类型的引用限定符应用到其他类型