1/* 2 * 3 * Copyright (c) 2004 4 * Francois Dumont 5 * 6 * This material is provided "as is", with absolutely no warranty expressed 7 * or implied. Any use is at your own risk. 8 * 9 * Permission to use or copy this software for any purpose is hereby granted 10 * without fee, provided the above notices are retained on all copies. 11 * Permission to modify the code and to distribute modified code is granted, 12 * provided the above notices are retained, and a notice that the code was 13 * modified is included with the above copyright notice. 14 * 15 */ 16 17#ifndef _STLP_BOOST_TYPE_TRAITS_H 18#define _STLP_BOOST_TYPE_TRAITS_H 19 20#ifndef BOOST_CONFIG_SUFFIX_HPP 21# ifdef BOOST_CONFIG_HPP 22# undef BOOST_CONFIG_HPP 23# endif 24# include <boost/config.hpp> 25#endif 26 27#include <boost/type_traits/is_integral.hpp> 28#include <boost/type_traits/is_float.hpp> 29#include <boost/type_traits/has_trivial_constructor.hpp> 30#include <boost/type_traits/has_trivial_copy.hpp> 31#include <boost/type_traits/has_trivial_assign.hpp> 32#include <boost/type_traits/has_trivial_destructor.hpp> 33#include <boost/type_traits/is_pod.hpp> 34#include <boost/type_traits/is_pointer.hpp> 35#include <boost/type_traits/is_reference.hpp> 36#include <boost/type_traits/remove_cv.hpp> 37#include <boost/type_traits/is_same.hpp> 38 39/* 40 * This file mostly wraps boost type_traits in the STLport type_traits. 41 * When checking a type traits like trivial assign operator for instance 42 * both the boost value and STLport values has to be taken into account 43 * as we don't know what the user might have prefer, specializing the boost 44 * type traits or the STLport one. 45 */ 46_STLP_BEGIN_NAMESPACE 47 48template <class _Tp> struct _IsRef { 49 enum { _Is = ::boost::is_reference<_Tp>::value }; 50 typedef typename __bool2type<_Is>::_Ret _Ret; 51}; 52 53template <class _Tp> struct _IsPtr { 54 enum { is_pointer = ::boost::is_pointer<_Tp>::value }; 55 typedef typename __bool2type<is_pointer>::_Ret _Ret; 56}; 57 58template <class _Tp> struct _IsIntegral { 59 enum { is_integral = ::boost::is_integral<_Tp>::value }; 60 typedef typename __bool2type<is_integral>::_Ret _Ret; 61}; 62 63template <class _Tp> struct _IsRational { 64 enum { is_float = ::boost::is_float<_Tp>::value }; 65 typedef typename __bool2type<is_float>::_Ret _Ret; 66}; 67 68template <class _Tp> 69struct __type_traits { 70 enum { trivial_constructor = ::boost::has_trivial_constructor<_Tp>::value }; 71 typedef typename __bool2type<trivial_constructor>::_Ret has_trivial_default_constructor; 72 73 enum { trivial_copy = ::boost::has_trivial_copy<_Tp>::value }; 74 typedef typename __bool2type<trivial_copy>::_Ret has_trivial_copy_constructor; 75 76 enum { trivial_assign = ::boost::has_trivial_assign<_Tp>::value }; 77 typedef typename __bool2type<trivial_assign>::_Ret has_trivial_assignment_operator; 78 79 enum { trivial_destructor = ::boost::has_trivial_destructor<_Tp>::value }; 80 typedef typename __bool2type<trivial_destructor>::_Ret has_trivial_destructor; 81 82 enum { pod = ::boost::is_pod<_Tp>::value }; 83 typedef typename __bool2type<pod>::_Ret is_POD_type; 84}; 85 86template <class _Tp1, class _Tp2> 87struct _TrivialCopy { 88 typedef typename ::boost::remove_cv<_Tp1>::type uncv1; 89 typedef typename ::boost::remove_cv<_Tp2>::type uncv2; 90 91 enum { same = ::boost::is_same<uncv1, uncv2>::value }; 92 typedef typename __bool2type<same>::_Ret _Same; 93 94 enum { boost_trivial_assign = ::boost::has_trivial_assign<uncv1>::value }; 95 typedef typename __bool2type<boost_trivial_assign>::_Ret _BoostTrivialAssign; 96 typedef typename __type_traits<uncv1>::has_trivial_assignment_operator _STLPTrivialAssign; 97 typedef typename _Lor2<_BoostTrivialAssign, _STLPTrivialAssign>::_Ret _TrivialAssign; 98 99 typedef typename _Land2<_Same, _TrivialAssign>::_Ret _Type; 100 static _Type _Answer() { return _Type(); } 101}; 102 103template <class _Tp1, class _Tp2> 104struct _TrivialUCopy { 105 typedef typename ::boost::remove_cv<_Tp1>::type uncv1; 106 typedef typename ::boost::remove_cv<_Tp2>::type uncv2; 107 108 enum { same = ::boost::is_same<uncv1, uncv2>::value }; 109 typedef typename __bool2type<same>::_Ret _Same; 110 111 enum { boost_trivial_copy = ::boost::has_trivial_copy<uncv1>::value }; 112 typedef typename __bool2type<boost_trivial_copy>::_Ret _BoostTrivialCopy; 113 typedef typename __type_traits<uncv1>::has_trivial_copy_constructor _STLPTrivialCopy; 114 typedef typename _Lor2<_BoostTrivialCopy, _STLPTrivialCopy>::_Ret _TrivialCopy; 115 116 typedef typename _Land2<_Same, _TrivialCopy>::_Ret _Type; 117 static _Type _Answer() { return _Type(); } 118}; 119 120template <class _Tp> 121struct _DefaultZeroValue { 122 enum { is_integral = ::boost::is_integral<_Tp>::value }; 123 typedef typename __bool2type<is_integral>::_Ret _IsIntegral; 124 enum { is_float = ::boost::is_float<_Tp>::value }; 125 typedef typename __bool2type<is_float>::_Ret _IsFloat; 126 enum { is_pointer = ::boost::is_pointer<_Tp>::value }; 127 typedef typename __bool2type<is_pointer>::_Ret _IsPointer; 128 129 typedef typename _Lor3<_IsIntegral, _IsFloat, _IsPointer>::_Ret _Ret; 130}; 131 132template <class _Tp> 133struct _TrivialInit { 134 typedef typename ::boost::remove_cv<_Tp>::type uncv; 135 136 enum { boost_trivial_constructor = ::boost::has_trivial_constructor<uncv>::value }; 137 typedef typename __bool2type<boost_trivial_constructor>::_Ret _BoostTrivialInit; 138 typedef typename __type_traits<uncv>::has_trivial_default_constructor _STLPTrivialInit; 139 typedef typename _Lor2<_BoostTrivialInit, _STLPTrivialInit>::_Ret _Tr1; 140 141 typedef typename _DefaultZeroValue<_Tp>::_Ret _Tr2; 142 typedef typename _Not<_Tr2>::_Ret _Tr3; 143 144 typedef typename _Land2<_Tr1, _Tr3>::_Ret _Ret; 145 static _Ret _Answer() { return _Ret(); } 146}; 147 148_STLP_END_NAMESPACE 149 150#endif /* _STLP_BOOST_TYPE_TRAITS_H */ 151