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