moar traits
parent
292c5a35b7
commit
0500e52295
|
@ -6,6 +6,8 @@
|
||||||
#ifndef OCTA_TRAITS_H
|
#ifndef OCTA_TRAITS_H
|
||||||
#define OCTA_TRAITS_H
|
#define OCTA_TRAITS_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "octa/types.h"
|
#include "octa/types.h"
|
||||||
|
|
||||||
namespace octa {
|
namespace octa {
|
||||||
|
@ -86,9 +88,8 @@ namespace octa {
|
||||||
|
|
||||||
/* is pointer */
|
/* is pointer */
|
||||||
|
|
||||||
template<typename T> struct IsPointerBase: false_t {};
|
template<typename > struct IsPointerBase : false_t {};
|
||||||
|
template<typename T> struct IsPointerBase<T *>: true_t {};
|
||||||
template<> struct IsPointerBase<T *>: true_t {};
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct IsPointer: IsPointerBase<typename RemoveConstVolatile<T>::type> {};
|
struct IsPointer: IsPointerBase<typename RemoveConstVolatile<T>::type> {};
|
||||||
|
@ -101,15 +102,30 @@ namespace octa {
|
||||||
|
|
||||||
/* type equality */
|
/* type equality */
|
||||||
|
|
||||||
template<typename, typename>
|
template<typename, typename> struct IsEqual : false_t {};
|
||||||
struct IsEqual {
|
template<typename T > struct IsEqual<T, T>: true_t {};
|
||||||
static const bool value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T>
|
/* is lvalue reference */
|
||||||
struct IsEqual<T, T> {
|
|
||||||
static const bool value = true;
|
template<typename > struct IsLvalueReference : false_t {};
|
||||||
};
|
template<typename T> struct IsLvalueReference<T &>: true_t {};
|
||||||
|
|
||||||
|
/* is rvalue reference */
|
||||||
|
|
||||||
|
template<typename > struct IsRvalueReference : false_t {};
|
||||||
|
template<typename T> struct IsRvalueReference<T &&>: true_t {};
|
||||||
|
|
||||||
|
/* is reference */
|
||||||
|
|
||||||
|
template<typename T> struct IsReference: IntegralConstant<bool,
|
||||||
|
(IsLvalueReference<T>::value || IsRvalueReference<T>::value)
|
||||||
|
> {};
|
||||||
|
|
||||||
|
/* is array */
|
||||||
|
|
||||||
|
template<typename > struct IsArray : false_t {};
|
||||||
|
template<typename T > struct IsArray<T[] >: true_t {};
|
||||||
|
template<typename T, size_t N> struct IsArray<T[N]>: true_t {};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue