diff --git a/AK/StdLibExtraDetails.h b/AK/StdLibExtraDetails.h index e8f6dd6ab5..0f1cc687d8 100644 --- a/AK/StdLibExtraDetails.h +++ b/AK/StdLibExtraDetails.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Ali Mohammad Pur + * Copyright (c) 2021, Daniel Bertalan * * SPDX-License-Identifier: BSD-2-Clause */ @@ -429,6 +430,24 @@ struct __IdentityType { template using IdentityType = typename __IdentityType::Type; +template +struct __AddReference { + using LvalueType = T; + using TvalueType = T; +}; + +template +struct __AddReference> { + using LvalueType = T&; + using RvalueType = T&&; +}; + +template +using AddLvalueReference = typename __AddReference::LvalueType; + +template +using AddRvalueReference = typename __AddReference::RvalueType; + template requires(IsEnum) using UnderlyingType = __underlying_type(T); @@ -447,8 +466,55 @@ inline constexpr bool IsCallableWithArguments = requires(T t) { t(declval( template inline constexpr bool IsConstructible = requires { ::new T(declval()...); }; +template +inline constexpr bool IsTriviallyConstructible = __is_trivially_constructible(T, Args...); + +template +inline constexpr bool IsConvertible = requires { declval()(declval()); }; + +template +inline constexpr bool IsAssignable = requires { declval() = declval(); }; + +template +inline constexpr bool IsTriviallyAssignable = __is_trivially_assignable(T, U); + +template +inline constexpr bool IsDestructible = requires { declval().~T(); }; + +template +#if defined(__clang__) +inline constexpr bool IsTriviallyDestructible = __is_trivially_destructible(T); +#else +inline constexpr bool IsTriviallyDestructible = __has_trivial_destructor(T) && IsDestructible; +#endif + +template +inline constexpr bool IsCopyConstructible = IsConstructible>>; + +template +inline constexpr bool IsTriviallyCopyConstructible = IsTriviallyConstructible>>; + +template +inline constexpr bool IsCopyAssignable = IsAssignable, AddLvalueReference>>; + +template +inline constexpr bool IsTriviallyCopyAssignable = IsTriviallyAssignable, AddLvalueReference>>; + +template +inline constexpr bool IsMoveConstructible = IsConstructible>; + +template +inline constexpr bool IsTriviallyMoveConstructible = IsTriviallyConstructible>; + +template +inline constexpr bool IsMoveAssignable = IsAssignable, AddRvalueReference>; + +template +inline constexpr bool IsTriviallyMoveAssignable = IsTriviallyAssignable, AddRvalueReference>; } using AK::Detail::AddConst; +using AK::Detail::AddLvalueReference; +using AK::Detail::AddRvalueReference; using AK::Detail::Conditional; using AK::Detail::CopyConst; using AK::Detail::declval; @@ -459,24 +525,38 @@ using AK::Detail::IdentityType; using AK::Detail::IndexSequence; using AK::Detail::IntegerSequence; using AK::Detail::IsArithmetic; +using AK::Detail::IsAssignable; using AK::Detail::IsBaseOf; using AK::Detail::IsCallableWithArguments; using AK::Detail::IsClass; using AK::Detail::IsConst; using AK::Detail::IsConstructible; +using AK::Detail::IsConvertible; +using AK::Detail::IsCopyAssignable; +using AK::Detail::IsCopyConstructible; +using AK::Detail::IsDestructible; using AK::Detail::IsEnum; using AK::Detail::IsFloatingPoint; using AK::Detail::IsFunction; using AK::Detail::IsFundamental; using AK::Detail::IsIntegral; using AK::Detail::IsLvalueReference; +using AK::Detail::IsMoveAssignable; +using AK::Detail::IsMoveConstructible; using AK::Detail::IsNullPointer; using AK::Detail::IsPointer; using AK::Detail::IsRvalueReference; using AK::Detail::IsSame; using AK::Detail::IsSigned; using AK::Detail::IsTrivial; +using AK::Detail::IsTriviallyAssignable; +using AK::Detail::IsTriviallyConstructible; using AK::Detail::IsTriviallyCopyable; +using AK::Detail::IsTriviallyCopyAssignable; +using AK::Detail::IsTriviallyCopyConstructible; +using AK::Detail::IsTriviallyDestructible; +using AK::Detail::IsTriviallyMoveAssignable; +using AK::Detail::IsTriviallyMoveConstructible; using AK::Detail::IsUnion; using AK::Detail::IsUnsigned; using AK::Detail::IsVoid;