|
|
|
| 1 |
|
// type_traits TR1 header |
| 2 |
|
#pragma once |
| 3 |
|
#ifndef _TYPE_TRAITS_ |
| 4 |
|
#define _TYPE_TRAITS_ |
| 5 |
|
#ifndef RC_INVOKED |
| 6 |
|
#include <limits> |
| 7 |
|
#include <xtr1common> |
| 8 |
|
|
| 9 |
|
// COMPILER SUPORT MACROS |
| 10 |
|
|
| 11 |
|
#define _IS_BASE_OF(_Base, _Der) \ |
| 12 |
|
: _Cat_base<__is_base_of(_Base, _Der)> |
| 13 |
|
#define _IS_CONVERTIBLE(_From, _To) \ |
| 14 |
|
: _Cat_base<is_void<_From>::value && is_void<_To>::value \ |
| 15 |
|
|| __is_convertible_to(_From, _To)> |
| 16 |
|
#define _IS_UNION(_Ty) : _Cat_base<__is_union(_Ty)> |
| 17 |
|
#define _IS_CLASS(_Ty) : _Cat_base<__is_class(_Ty)> |
| 18 |
|
#define _IS_ENUM(_Ty) : _Cat_base<__is_enum(_Ty)> |
| 19 |
|
#define _IS_POD(_Ty) : _Cat_base<is_void<_Ty>::value \ |
| 20 |
|
|| is_scalar<_Ty>::value \ |
| 21 |
|
|| __has_trivial_constructor(_Ty) && __is_pod(_Ty)> |
| 22 |
|
#define _IS_EMPTY(_Ty) : _Cat_base<__is_empty(_Ty)> |
| 23 |
|
#define _IS_POLYMORPHIC(_Ty) : _Cat_base<__is_polymorphic(_Ty)> |
| 24 |
|
#define _IS_ABSTRACT(_Ty) : _Cat_base<__is_abstract(_Ty)> |
| 25 |
|
#define _HAS_TRIVIAL_CONSTRUCTOR(_Ty) \ |
| 26 |
|
: _Cat_base<is_pod<_Ty>::value || __has_trivial_constructor(_Ty)> |
| 27 |
|
#define _HAS_TRIVIAL_COPY(_Ty) \ |
| 28 |
|
: _Cat_base<is_pod<_Ty>::value || __has_trivial_copy(_Ty)> |
| 29 |
|
#define _HAS_TRIVIAL_ASSIGN(_Ty) \ |
| 30 |
|
: _Cat_base<is_pod<_Ty>::value || __has_trivial_assign(_Ty)> |
| 31 |
|
#define _HAS_TRIVIAL_DESTRUCTOR(_Ty) \ |
| 32 |
|
: _Cat_base<is_pod<_Ty>::value || __has_trivial_destructor(_Ty)> |
| 33 |
|
#define _HAS_NOTHROW_CONSTRUCTOR(_Ty) \ |
| 34 |
|
: _Cat_base<is_pod<_Ty>::value || __has_nothrow_constructor(_Ty)> |
| 35 |
|
#define _HAS_NOTHROW_COPY(_Ty) \ |
| 36 |
|
: _Cat_base<is_pod<_Ty>::value || __has_nothrow_copy(_Ty)> |
| 37 |
|
#define _HAS_NOTHROW_ASSIGN(_Ty) \ |
| 38 |
|
: _Cat_base<is_pod<_Ty>::value || __has_nothrow_assign(_Ty)> |
| 39 |
|
#define _HAS_VIRTUAL_DESTRUCTOR(_Ty) \ |
| 40 |
|
: _Cat_base<__has_virtual_destructor(_Ty)> |
| 41 |
|
|
| 42 |
|
_STD_BEGIN |
| 43 |
|
namespace tr1 { // TR1 additions |
| 44 |
|
|
| 45 |
|
// TEMPLATE CLASS _Ptr_traits |
| 46 |
|
template<class _Ty> |
| 47 |
|
struct _Ptr_traits |
| 48 |
|
{ // basic definition |
| 49 |
|
}; |
| 50 |
|
|
| 51 |
|
template<class _Ty> |
| 52 |
|
struct _Ptr_traits<_Ty*> |
| 53 |
|
{ // pointer properties |
| 54 |
|
static const bool _Is_const = false; |
| 55 |
|
static const bool _Is_volatile = false; |
| 855 |
|
template<class _Ty, unsigned _Nx, unsigned _Ix> |
| 856 |
|
struct _Extent<_Ty[_Ix], _Nx> |
| 857 |
|
: _Extent<_Ty, _Nx - 1> |
| 858 |
|
{ // determine extent of dimension _Nx of array _Ty |
| 859 |
|
}; |
| 860 |
|
|
| 861 |
|
template<class _Ty, unsigned _Nx> |
| 862 |
|
struct _Extent<_Ty[], _Nx> |
| 863 |
|
: _Extent<_Ty, _Nx - 1> |
| 864 |
|
{ // determine extent of dimension _Nx of array _Ty |
| 865 |
|
}; |
| 866 |
|
|
| 867 |
|
template<class _Ty, unsigned _Nx = 0> |
| 868 |
|
struct extent |
| 869 |
|
: _Extent<_Ty, _Nx> |
| 870 |
|
{ // determine extent of dimension _Nx of array _Ty |
| 871 |
|
}; |
| 872 |
|
|
| 873 |
|
// TEMPLATE CLASS is_same |
| 874 |
|
template<class _Ty1, class _Ty2> |
| 875 |
|
struct is_same |
| 876 |
|
: false_type |
| 877 |
|
{ // determine whether _Ty1 and _Ty2 are the same type |
| 878 |
|
}; |
| 879 |
|
|
| 880 |
|
template<class _Ty1> |
| 881 |
|
struct is_same<_Ty1, _Ty1> |
| 882 |
|
: true_type |
| 883 |
|
{ // determine whether _Ty1 and _Ty2 are the same type |
| 884 |
|
}; |
| 885 |
|
|
| 886 |
|
// TEMPLATE CLASS is_base_of |
| 887 |
|
template<class _Base, class _Der> |
| 888 |
|
struct is_base_of _IS_BASE_OF(_Base, _Der) |
| 889 |
|
{ // determine whether _Base is a base of or the same as _Der |
| 890 |
|
}; |
| 891 |
|
|
| 892 |
|
} // namespace tr1 |
| 893 |
|
|
| 894 |
|
_STD_END |
| 895 |
|
|
| 896 |
|
#endif /* RC_INVOKED */ |
| 897 |
|
#endif /* _TYPE_TRAITS_ */ |
| 898 |
|
|
| 899 |
|
/* |
| 900 |
|
* Copyright (c) 1992-2008 by P.J. Plauger. ALL RIGHTS RESERVED. |
| 901 |
|
* Consult your license regarding permissions and restrictions. |
| 902 |
|
V5.05:0009 */ |
| 903 |
|
|
|
|
|