Home | History | Annotate | Download | only in stl
      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 
     48 template <class _Tp> struct _IsRef {
     49   enum { _Is = ::boost::is_reference<_Tp>::value };
     50   typedef typename __bool2type<_Is>::_Ret _Ret;
     51 };
     52 
     53 template <class _Tp> struct _IsPtr {
     54   enum { is_pointer = ::boost::is_pointer<_Tp>::value };
     55   typedef typename __bool2type<is_pointer>::_Ret _Ret;
     56 };
     57 
     58 template <class _Tp> struct _IsIntegral {
     59   enum { is_integral = ::boost::is_integral<_Tp>::value };
     60   typedef typename __bool2type<is_integral>::_Ret _Ret;
     61 };
     62 
     63 template <class _Tp> struct _IsRational {
     64   enum { is_float = ::boost::is_float<_Tp>::value };
     65   typedef typename __bool2type<is_float>::_Ret _Ret;
     66 };
     67 
     68 template <class _Tp>
     69 struct __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 
     86 template <class _Tp1, class _Tp2>
     87 struct _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 
    103 template <class _Tp1, class _Tp2>
    104 struct _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 
    120 template <class _Tp>
    121 struct _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 
    132 template <class _Tp>
    133 struct _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