diff --git a/octa/type_traits.h b/octa/type_traits.h index 15589d1..f122faa 100644 --- a/octa/type_traits.h +++ b/octa/type_traits.h @@ -24,142 +24,150 @@ namespace detail { template struct CommonTypeBase; } - template struct __OctaAddLr; - template struct __OctaAddRr; - template struct __OctaAddConst; - template struct IsReference; - template struct __OctaRemoveReference; - template struct __OctaRemoveAllExtents; - template struct IsTriviallyDefaultConstructible; +template struct __OctaAddConst; +template struct IsReference; +template struct __OctaRemoveReference; +template struct __OctaRemoveAllExtents; +template struct IsTriviallyDefaultConstructible; - template - using RemoveCv = typename octa::detail::RemoveCv<_T>::Type; +template +using RemoveCv = typename octa::detail::RemoveCv<_T>::Type; - template - using AddLvalueReference = typename __OctaAddLr<_T>::Type; +template +using AddLvalueReference = typename octa::detail::AddLr<_T>::Type; - template - using AddRvalueReference = typename __OctaAddRr<_T>::Type; +template +using AddRvalueReference = typename octa::detail::AddRr<_T>::Type; - template - using AddConst = typename __OctaAddConst<_T>::Type; +template +using AddConst = typename __OctaAddConst<_T>::Type; - template - using RemoveReference = typename __OctaRemoveReference<_T>::Type; +template +using RemoveReference = typename __OctaRemoveReference<_T>::Type; - template - using RemoveAllExtents = typename __OctaRemoveAllExtents<_T>::Type; +template +using RemoveAllExtents = typename __OctaRemoveAllExtents<_T>::Type; namespace detail { template octa::AddRvalueReference<_T> declval_in(); } - /* integral constant */ +/* integral constant */ - template - struct IntegralConstant { - static constexpr _T value = __val; +template +struct IntegralConstant { + static constexpr _T value = val; - typedef _T Value; - typedef IntegralConstant<_T, __val> Type; + typedef _T Value; + typedef IntegralConstant<_T, val> Type; - constexpr operator Value() const { return value; } - constexpr Value operator()() const { return value; } - }; + constexpr operator Value() const { return value; } + constexpr Value operator()() const { return value; } +}; - typedef IntegralConstant True; - typedef IntegralConstant False; +typedef IntegralConstant True; +typedef IntegralConstant False; - template constexpr _T IntegralConstant<_T, val>::value; +template constexpr _T IntegralConstant<_T, val>::value; - /* is void */ +/* is void */ - template struct __OctaIsVoid : False {}; - template< > struct __OctaIsVoid: True {}; +namespace detail { + template struct IsVoidBase : False {}; + template< > struct IsVoidBase: True {}; +} template - struct IsVoid: __OctaIsVoid> {}; + struct IsVoid: octa::detail::IsVoidBase> {}; - /* is null pointer */ +/* is null pointer */ - template struct __OctaIsNullPointer : False {}; - template< > struct __OctaIsNullPointer: True {}; +namespace detail { + template struct IsNullPointerBase : False {}; + template< > struct IsNullPointerBase: True {}; +} - template struct IsNullPointer: - __OctaIsNullPointer> {}; +template struct IsNullPointer: + octa::detail::IsNullPointerBase> {}; - /* is integer */ +/* is integer */ - template struct __OctaIsIntegral: False {}; +namespace detail { + template struct IsIntegralBase: False {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral: True {}; - template<> struct __OctaIsIntegral< wchar_t>: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase: True {}; + template<> struct IsIntegralBase< wchar_t>: True {}; +} - template - struct IsIntegral: __OctaIsIntegral> {}; +template +struct IsIntegral: octa::detail::IsIntegralBase> {}; - /* is floating point */ +/* is floating point */ - template struct __OctaIsFloatingPoint: False {}; +namespace detail { + template struct IsFloatingPointBase: False {}; - template<> struct __OctaIsFloatingPoint: True {}; - template<> struct __OctaIsFloatingPoint: True {}; - template<> struct __OctaIsFloatingPoint: True {}; + template<> struct IsFloatingPointBase: True {}; + template<> struct IsFloatingPointBase: True {}; + template<> struct IsFloatingPointBase: True {}; +} - template - struct IsFloatingPoint: __OctaIsFloatingPoint> {}; +template +struct IsFloatingPoint: octa::detail::IsFloatingPointBase> {}; - /* is array */ +/* is array */ - template struct IsArray : False {}; - template struct IsArray<_T[] >: True {}; - template struct IsArray<_T[_N]>: True {}; +template struct IsArray : False {}; +template struct IsArray<_T[] >: True {}; +template struct IsArray<_T[_N]>: True {}; - /* is pointer */ +/* is pointer */ - template struct __OctaIsPointer : False {}; - template struct __OctaIsPointer<_T *>: True {}; +namespace detail { + template struct IsPointerBase : False {}; + template struct IsPointerBase<_T *>: True {}; +} - template - struct IsPointer: __OctaIsPointer> {}; +template +struct IsPointer: octa::detail::IsPointerBase> {}; - /* is lvalue reference */ +/* is lvalue reference */ - template struct IsLvalueReference : False {}; - template struct IsLvalueReference<_T &>: True {}; +template struct IsLvalueReference : False {}; +template struct IsLvalueReference<_T &>: True {}; - /* is rvalue reference */ +/* is rvalue reference */ - template struct IsRvalueReference : False {}; - template struct IsRvalueReference<_T &&>: True {}; +template struct IsRvalueReference : False {}; +template struct IsRvalueReference<_T &&>: True {}; - /* is enum */ +/* is enum */ - template struct IsEnum: IntegralConstant {}; +template struct IsEnum: IntegralConstant {}; - /* is union */ +/* is union */ - template struct IsUnion: IntegralConstant {}; +template struct IsUnion: IntegralConstant {}; - /* is class */ +/* is class */ - template struct IsClass: IntegralConstant {}; +template struct IsClass: IntegralConstant {}; - /* is function */ +/* is function */ namespace detail { struct FunctionTestDummy {}; @@ -185,149 +193,155 @@ namespace detail { template struct IsFunction: octa::detail::IsFunctionBase<_T> {}; - /* is arithmetic */ +/* is arithmetic */ - template struct IsArithmetic: IntegralConstant::value || IsFloatingPoint<_T>::value) - > {}; +template struct IsArithmetic: IntegralConstant::value || IsFloatingPoint<_T>::value) +> {}; - /* is fundamental */ +/* is fundamental */ - template struct IsFundamental: IntegralConstant::value || IsVoid<_T>::value || IsNullPointer<_T>::value) - > {}; +template struct IsFundamental: IntegralConstant::value || IsVoid<_T>::value || IsNullPointer<_T>::value) +> {}; - /* is compound */ +/* is compound */ - template struct IsCompound: IntegralConstant::value - > {}; +template struct IsCompound: IntegralConstant::value +> {}; - /* is pointer to member */ +/* is pointer to member */ +namespace detail { template - struct __OctaIsMemberPointer: False {}; + struct IsMemberPointerBase: False {}; template - struct __OctaIsMemberPointer<_T _U::*>: True {}; + struct IsMemberPointerBase<_T _U::*>: True {}; +} - template - struct IsMemberPointer: __OctaIsMemberPointer> {}; +template +struct IsMemberPointer: octa::detail::IsMemberPointerBase> {}; - /* is pointer to member object */ +/* is pointer to member object */ +namespace detail { template - struct __OctaIsMemberObjectPointer: False {}; + struct IsMemberObjectPointerBase: False {}; template - struct __OctaIsMemberObjectPointer<_T _U::*>: IntegralConstant::value + struct IsMemberObjectPointerBase<_T _U::*>: IntegralConstant::value > {}; +} - template struct IsMemberObjectPointer: - __OctaIsMemberObjectPointer> {}; +template struct IsMemberObjectPointer: + octa::detail::IsMemberObjectPointerBase> {}; - /* is pointer to member function */ +/* is pointer to member function */ +namespace detail { template - struct __OctaIsMemberFunctionPointer: False {}; + struct IsMemberFunctionPointerBase: False {}; template - struct __OctaIsMemberFunctionPointer<_T _U::*>: IntegralConstant::value + struct IsMemberFunctionPointerBase<_T _U::*>: IntegralConstant::value > {}; +} - template struct IsMemberFunctionPointer: - __OctaIsMemberFunctionPointer> {}; +template struct IsMemberFunctionPointer: + octa::detail::IsMemberFunctionPointerBase> {}; - /* is reference */ +/* is reference */ - template struct IsReference: IntegralConstant::value || IsRvalueReference<_T>::value) - > {}; +template struct IsReference: IntegralConstant::value || IsRvalueReference<_T>::value) +> {}; - /* is object */ +/* is object */ - template struct IsObject: IntegralConstant::value && !IsVoid<_T>::value && !IsReference<_T>::value) - > {}; +template struct IsObject: IntegralConstant::value && !IsVoid<_T>::value && !IsReference<_T>::value) +> {}; - /* is scalar */ +/* is scalar */ - template struct IsScalar: IntegralConstant::value || IsPointer<_T>::value || IsEnum<_T>::value - || IsNullPointer <_T>::value || IsArithmetic<_T>::value) - > {}; +template struct IsScalar: IntegralConstant::value || IsPointer<_T>::value || IsEnum<_T>::value + || IsNullPointer <_T>::value || IsArithmetic<_T>::value) +> {}; - /* is abstract */ +/* is abstract */ - template - struct IsAbstract: IntegralConstant {}; +template +struct IsAbstract: IntegralConstant {}; - /* is const */ +/* is const */ - template struct IsConst : False {}; - template struct IsConst: True {}; +template struct IsConst : False {}; +template struct IsConst: True {}; - /* is volatile */ +/* is volatile */ - template struct IsVolatile : False {}; - template struct IsVolatile: True {}; +template struct IsVolatile : False {}; +template struct IsVolatile: True {}; - /* is empty */ +/* is empty */ - template - struct IsEmpty: IntegralConstant {}; +template +struct IsEmpty: IntegralConstant {}; - /* is POD */ +/* is POD */ - template struct IsPod: IntegralConstant {}; +template struct IsPod: IntegralConstant {}; - /* is polymorphic */ +/* is polymorphic */ - template - struct IsPolymorphic: IntegralConstant {}; +template +struct IsPolymorphic: IntegralConstant {}; - /* is signed */ +/* is signed */ - template - struct IsSigned: IntegralConstant {}; +template +struct IsSigned: IntegralConstant {}; - /* is unsigned */ +/* is unsigned */ - template - struct IsUnsigned: IntegralConstant {}; +template +struct IsUnsigned: IntegralConstant {}; - /* is standard layout */ +/* is standard layout */ - template - struct IsStandardLayout: IntegralConstant {}; +template +struct IsStandardLayout: IntegralConstant {}; - /* is literal type */ +/* is literal type */ - template - struct IsLiteralType: IntegralConstant {}; +template +struct IsLiteralType: IntegralConstant {}; - /* is trivially copyable */ +/* is trivially copyable */ - template - struct IsTriviallyCopyable: IntegralConstant>::value - > {}; +template +struct IsTriviallyCopyable: IntegralConstant>::value +> {}; - /* is trivial */ +/* is trivial */ - template - struct IsTrivial: IntegralConstant {}; +template +struct IsTrivial: IntegralConstant {}; - /* has virtual destructor */ +/* has virtual destructor */ - template - struct HasVirtualDestructor: IntegralConstant {}; +template +struct HasVirtualDestructor: IntegralConstant {}; - /* is constructible */ +/* is constructible */ namespace detail { #define OCTA_MOVE(v) static_cast &&>(v) @@ -416,23 +430,23 @@ namespace detail { template struct IsConstructible: octa::detail::Ctible<_T, _A...> {}; - /* is default constructible */ +/* is default constructible */ - template struct IsDefaultConstructible: IsConstructible<_T> {}; +template struct IsDefaultConstructible: IsConstructible<_T> {}; - /* is copy constructible */ +/* is copy constructible */ - template struct IsCopyConstructible: IsConstructible<_T, - AddLvalueReference> - > {}; +template struct IsCopyConstructible: IsConstructible<_T, + AddLvalueReference> +> {}; - /* is move constructible */ +/* is move constructible */ - template struct IsMoveConstructible: IsConstructible<_T, - AddRvalueReference<_T> - > {}; +template struct IsMoveConstructible: IsConstructible<_T, + AddRvalueReference<_T> +> {}; - /* is assignable */ +/* is assignable */ namespace detail { template typename octa::detail::Select2nd< @@ -454,19 +468,19 @@ namespace detail { template struct IsAssignable: octa::detail::IsAssignableBase<_T, _U> {}; - /* is copy assignable */ +/* is copy assignable */ - template struct IsCopyAssignable: IsAssignable< - AddLvalueReference<_T>, - AddLvalueReference> - > {}; +template struct IsCopyAssignable: IsAssignable< + AddLvalueReference<_T>, + AddLvalueReference> +> {}; - /* is move assignable */ +/* is move assignable */ - template struct IsMoveAssignable: IsAssignable< - AddLvalueReference<_T>, - const AddRvalueReference<_T> - > {}; +template struct IsMoveAssignable: IsAssignable< + AddLvalueReference<_T>, + const AddRvalueReference<_T> +> {}; /* is destructible */ @@ -753,39 +767,43 @@ namespace detail { /* add lvalue reference */ - template struct __OctaAddLr { typedef _T &Type; }; - template struct __OctaAddLr<_T &> { typedef _T &Type; }; - template struct __OctaAddLr<_T &&> { typedef _T &Type; }; - template<> struct __OctaAddLr { +namespace detail { + template struct AddLr { typedef _T &Type; }; + template struct AddLr<_T &> { typedef _T &Type; }; + template struct AddLr<_T &&> { typedef _T &Type; }; + template<> struct AddLr { typedef void Type; }; - template<> struct __OctaAddLr { + template<> struct AddLr { typedef const void Type; }; - template<> struct __OctaAddLr { + template<> struct AddLr { typedef volatile void Type; }; - template<> struct __OctaAddLr { + template<> struct AddLr { typedef const volatile void Type; }; +} /* add rvalue reference */ - template struct __OctaAddRr { typedef _T &&Type; }; - template struct __OctaAddRr<_T &> { typedef _T &&Type; }; - template struct __OctaAddRr<_T &&> { typedef _T &&Type; }; - template<> struct __OctaAddRr { +namespace detail { + template struct AddRr { typedef _T &&Type; }; + template struct AddRr<_T &> { typedef _T &&Type; }; + template struct AddRr<_T &&> { typedef _T &&Type; }; + template<> struct AddRr { typedef void Type; }; - template<> struct __OctaAddRr { + template<> struct AddRr { typedef const void Type; }; - template<> struct __OctaAddRr { + template<> struct AddRr { typedef volatile void Type; }; - template<> struct __OctaAddRr { + template<> struct AddRr { typedef const volatile void Type; }; +} /* remove extent */