forked from OctaForge/libostd
IsDestructible and IsNothrowDestructible
parent
8557b0abe1
commit
a80f535b5d
|
@ -294,6 +294,43 @@ namespace octa {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct HasVirtualDestructor: IntegralConstant<bool, __has_virtual_destructor(T)> {};
|
struct HasVirtualDestructor: IntegralConstant<bool, __has_virtual_destructor(T)> {};
|
||||||
|
|
||||||
|
/* is destructible - libc++ used as ref */
|
||||||
|
|
||||||
|
template<typename> struct IsDestructibleApply { typedef int type; };
|
||||||
|
|
||||||
|
template<typename T> struct IsDestructorWellformed {
|
||||||
|
template<typename TT> static char test(typename IsDestructibleApply<
|
||||||
|
decltype(declval<TT &>().~TT())
|
||||||
|
>::type);
|
||||||
|
|
||||||
|
template<typename TT> static int test(...);
|
||||||
|
|
||||||
|
static constexpr bool value = (sizeof(test<T>(12)) == sizeof(char));
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename, bool> struct DestructibleImpl;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct DestructibleImpl<T, false>: IntegralConstant<bool,
|
||||||
|
IsDestructorWellformed<typename RemoveAllExtents<T>::type>::value
|
||||||
|
> {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct DestructibleImpl<T, true>: true_t {};
|
||||||
|
|
||||||
|
template<typename T, bool> struct DestructibleFalse;
|
||||||
|
|
||||||
|
template<typename T> struct DestructibleFalse<T, false>
|
||||||
|
: DestructibleImpl<T, IsReference<T>::value> {};
|
||||||
|
|
||||||
|
template<typename T> struct DestructibleFalse<T, true>: false_t {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsDestructible: DestructibleFalse<T, IsFunction<T>::value> {};
|
||||||
|
|
||||||
|
template<typename T> struct IsDestructible<T[] >: false_t {};
|
||||||
|
template< > struct IsDestructible<void>: false_t {};
|
||||||
|
|
||||||
/* is trivially constructible */
|
/* is trivially constructible */
|
||||||
|
|
||||||
template<typename T, typename ...A>
|
template<typename T, typename ...A>
|
||||||
|
@ -475,6 +512,29 @@ namespace octa {
|
||||||
typename internal::AddRvalueReference<T>::type
|
typename internal::AddRvalueReference<T>::type
|
||||||
> {};
|
> {};
|
||||||
|
|
||||||
|
/* is nothrow destructible */
|
||||||
|
|
||||||
|
template<typename, bool> struct IsNothrowDestructibleBase;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsNothrowDestructibleBase<T, false>: IntegralConstant<bool,
|
||||||
|
noexcept(declval<T>().~T())
|
||||||
|
> {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsNothrowDestructible: IsNothrowDestructibleBase<T,
|
||||||
|
IsDestructible<T>::value
|
||||||
|
> {};
|
||||||
|
|
||||||
|
template<typename T, size_t N>
|
||||||
|
struct IsNothrowDestructible<T[N]>: IsNothrowDestructible<T> {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsNothrowDestructible<T &>: IsNothrowDestructible<T> {};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct IsNothrowDestructible<T &&>: IsNothrowDestructible<T> {};
|
||||||
|
|
||||||
/* is base of */
|
/* is base of */
|
||||||
|
|
||||||
template<typename B, typename D>
|
template<typename B, typename D>
|
||||||
|
|
Loading…
Reference in New Issue