Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/numeric/conversion/test/traits_test.cpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 17 years ago

updated boost from 1_33_1 to 1_34_1

File size: 24.4 KB
Line 
1// (C) 2003, Fernando Luis Cacciola Carballal.
2//
3// Distributed under the Boost Software License, Version 1.0. (See
4// accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6//
7//
8#include<iostream>
9#include<iomanip>
10#include<string>
11#include<typeinfo>
12#include<vector>
13#include<algorithm>
14
15#include <boost/cstdint.hpp>
16#include <boost/utility.hpp>
17#include <boost/preprocessor/cat.hpp>
18
19#include <boost/numeric/conversion/conversion_traits.hpp>
20#include <boost/numeric/conversion/int_float_mixture.hpp>
21#include <boost/numeric/conversion/sign_mixture.hpp>
22#include <boost/numeric/conversion/udt_builtin_mixture.hpp>
23#include <boost/numeric/conversion/is_subranged.hpp>
24
25#ifdef __BORLANDC__
26#pragma hdrstop
27#endif
28
29#include "test_helpers.cpp"
30#include "test_helpers2.cpp"
31
32using namespace std ;
33using namespace boost ;
34using namespace numeric;
35using namespace MyUDT ;
36
37// These helpers are used by generate_expected_traits<T,S>.
38// Unlike the similar helpers in the implementation, they are specialized by extension.
39//
40template<class T, class S> struct my_is_subranged ;
41template<class T, class S> struct my_is_trivial   ;
42template<class T, class S> struct my_int_float_mixture ;
43template<class T, class S> struct my_sign_mixture ;
44template<class T, class S> struct my_udt_builtin_mixture ;
45
46// This macro is used to define the properties of each conversion between
47// the builtin arithmetric types
48//
49// It defines the specialization of the helper traits used by 'generate_expected_traits'
50//
51#define DEFINE_CONVERSION(Target,Source,Trivial,Mixture,SignMixture,UdtMixture,SubRanged) \
52                                                          \
53        template<> struct my_is_subranged<Target,Source>  \
54          { typedef mpl::bool_< (SubRanged) > type ; } ; \
55                                                         \
56        template<> struct my_is_trivial<Target,Source>   \
57          { typedef mpl::bool_< (Trivial) > type ; } ;  \
58                                                                                                 \
59        template<> struct my_int_float_mixture<Target,Source>                                    \
60          { typedef mpl::integral_c<boost::numeric::int_float_mixture_enum, (Mixture) > type ; } ;    \
61                                                                                                 \
62        template<> struct my_sign_mixture<Target,Source>                                         \
63          { typedef mpl::integral_c<boost::numeric::sign_mixture_enum, (SignMixture) > type ; } ;     \
64                                                                                                 \
65        template<> struct my_udt_builtin_mixture<Target,Source>                                  \
66          { typedef mpl::integral_c<boost::numeric::udt_builtin_mixture_enum, (UdtMixture) > type ; }
67
68
69#define cSubRanged true
70#define cTrivial   true
71
72// The following test assumes a specific relation between the sizes of the types being used;
73// therefore, use specific fixed-width types instead built-in types directly.
74
75// NOTE --> TARGET,SOURCE
76//
77DEFINE_CONVERSION(boost::uint8_t  , boost::uint8_t,  cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
78DEFINE_CONVERSION(boost::int8_t   , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
79DEFINE_CONVERSION(boost::uint16_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
80DEFINE_CONVERSION(boost::int16_t  , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
81DEFINE_CONVERSION(boost::uint32_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
82DEFINE_CONVERSION(boost::int32_t  , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
83DEFINE_CONVERSION(float           , boost::uint8_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
84DEFINE_CONVERSION(double          , boost::uint8_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
85DEFINE_CONVERSION(long double     , boost::uint8_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
86DEFINE_CONVERSION(MyInt           , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
87DEFINE_CONVERSION(MyFloat         , boost::uint8_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
88
89DEFINE_CONVERSION(boost::uint8_t  , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
90DEFINE_CONVERSION(boost::int8_t   , boost::int8_t,  cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
91DEFINE_CONVERSION(boost::uint16_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
92DEFINE_CONVERSION(boost::int16_t  , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
93DEFINE_CONVERSION(boost::uint32_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
94DEFINE_CONVERSION(boost::int32_t  , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
95DEFINE_CONVERSION(float           , boost::int8_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
96DEFINE_CONVERSION(double          , boost::int8_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
97DEFINE_CONVERSION(long double     , boost::int8_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
98DEFINE_CONVERSION(MyInt           , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
99DEFINE_CONVERSION(MyFloat         , boost::int8_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
100
101DEFINE_CONVERSION(boost::uint8_t  , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin,  cSubRanged );
102DEFINE_CONVERSION(boost::int8_t   , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
103DEFINE_CONVERSION(boost::uint16_t , boost::uint16_t,  cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
104DEFINE_CONVERSION(boost::int16_t  , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
105DEFINE_CONVERSION(boost::uint32_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
106DEFINE_CONVERSION(boost::int32_t  , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
107DEFINE_CONVERSION(float           , boost::uint16_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
108DEFINE_CONVERSION(double          , boost::uint16_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
109DEFINE_CONVERSION(long double     , boost::uint16_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
110DEFINE_CONVERSION(MyInt           , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
111DEFINE_CONVERSION(MyFloat         , boost::uint16_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
112
113DEFINE_CONVERSION(boost::uint8_t  , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
114DEFINE_CONVERSION(boost::int8_t   , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
115DEFINE_CONVERSION(boost::uint16_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
116DEFINE_CONVERSION(boost::int16_t  , boost::int16_t,  cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
117DEFINE_CONVERSION(boost::uint32_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
118DEFINE_CONVERSION(boost::int32_t  , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
119DEFINE_CONVERSION(float           , boost::int16_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
120DEFINE_CONVERSION(double          , boost::int16_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
121DEFINE_CONVERSION(long double     , boost::int16_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
122DEFINE_CONVERSION(MyInt           , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
123DEFINE_CONVERSION(MyFloat         , boost::int16_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
124
125DEFINE_CONVERSION(boost::uint8_t  , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin,  cSubRanged );
126DEFINE_CONVERSION(boost::int8_t   , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
127DEFINE_CONVERSION(boost::uint16_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin,  cSubRanged );
128DEFINE_CONVERSION(boost::int16_t  , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
129DEFINE_CONVERSION(boost::uint32_t , boost::uint32_t,  cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged );
130DEFINE_CONVERSION(boost::int32_t  , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_builtin,  cSubRanged );
131DEFINE_CONVERSION(float           , boost::uint32_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
132DEFINE_CONVERSION(double          , boost::uint32_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
133DEFINE_CONVERSION(long double     , boost::uint32_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_builtin, !cSubRanged );
134DEFINE_CONVERSION(MyInt           , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
135DEFINE_CONVERSION(MyFloat         , boost::uint32_t, !cTrivial, integral_to_float   , unsigned_to_signed  , builtin_to_udt    , !cSubRanged );
136
137DEFINE_CONVERSION(boost::uint8_t  , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
138DEFINE_CONVERSION(boost::int8_t   , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
139DEFINE_CONVERSION(boost::uint16_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
140DEFINE_CONVERSION(boost::int16_t  , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
141DEFINE_CONVERSION(boost::uint32_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
142DEFINE_CONVERSION(boost::int32_t  , boost::int32_t,  cTrivial, integral_to_integral, signed_to_signed  , builtin_to_builtin, !cSubRanged );
143DEFINE_CONVERSION(float           , boost::int32_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
144DEFINE_CONVERSION(double          , boost::int32_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
145DEFINE_CONVERSION(long double     , boost::int32_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
146DEFINE_CONVERSION(MyInt           , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
147DEFINE_CONVERSION(MyFloat         , boost::int32_t, !cTrivial, integral_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
148
149DEFINE_CONVERSION(boost::uint8_t  , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
150DEFINE_CONVERSION(boost::int8_t   , float, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
151DEFINE_CONVERSION(boost::uint16_t , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
152DEFINE_CONVERSION(boost::int16_t  , float, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
153DEFINE_CONVERSION(boost::uint32_t , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
154DEFINE_CONVERSION(boost::int32_t  , float, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
155DEFINE_CONVERSION(float           , float,  cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
156DEFINE_CONVERSION(double          , float, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(float) > sizeof(double) ) );
157DEFINE_CONVERSION(long double     , float, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(float) > sizeof(long double) ) );
158DEFINE_CONVERSION(MyInt           , float, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
159DEFINE_CONVERSION(MyFloat         , float, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
160
161DEFINE_CONVERSION(boost::uint8_t  , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
162DEFINE_CONVERSION(boost::int8_t   , double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
163DEFINE_CONVERSION(boost::uint16_t , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
164DEFINE_CONVERSION(boost::int16_t  , double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
165DEFINE_CONVERSION(boost::uint32_t , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
166DEFINE_CONVERSION(boost::int32_t  , double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
167DEFINE_CONVERSION(float           , double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(double) > sizeof(float) ) );
168DEFINE_CONVERSION(double          , double,  cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
169DEFINE_CONVERSION(long double     , double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(double) > sizeof(long double) ) );
170DEFINE_CONVERSION(MyInt           , double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
171DEFINE_CONVERSION(MyFloat         , double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
172
173DEFINE_CONVERSION(boost::uint8_t  , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
174DEFINE_CONVERSION(boost::int8_t   , long double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
175DEFINE_CONVERSION(boost::uint16_t , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
176DEFINE_CONVERSION(boost::int16_t  , long double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
177DEFINE_CONVERSION(boost::uint32_t , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin,  cSubRanged );
178DEFINE_CONVERSION(boost::int32_t  , long double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_builtin,  cSubRanged );
179DEFINE_CONVERSION(float           , long double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(long double) > sizeof(float) ) );
180DEFINE_CONVERSION(double          , long double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, ( sizeof(long double) > sizeof(double) ) );
181DEFINE_CONVERSION(long double     , long double,  cTrivial, float_to_float   , signed_to_signed  , builtin_to_builtin, !cSubRanged );
182DEFINE_CONVERSION(MyInt           , long double, !cTrivial, float_to_integral, signed_to_signed  , builtin_to_udt    , !cSubRanged );
183DEFINE_CONVERSION(MyFloat         , long double, !cTrivial, float_to_float   , signed_to_signed  , builtin_to_udt    , !cSubRanged );
184
185DEFINE_CONVERSION(boost::uint8_t  , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
186DEFINE_CONVERSION(boost::int8_t   , MyInt, !cTrivial, integral_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
187DEFINE_CONVERSION(boost::uint16_t , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
188DEFINE_CONVERSION(boost::int16_t  , MyInt, !cTrivial, integral_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
189DEFINE_CONVERSION(boost::uint32_t , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
190DEFINE_CONVERSION(boost::int32_t  , MyInt, !cTrivial, integral_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
191DEFINE_CONVERSION(float           , MyInt, !cTrivial, integral_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
192DEFINE_CONVERSION(double          , MyInt, !cTrivial, integral_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
193DEFINE_CONVERSION(long double     , MyInt, !cTrivial, integral_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
194DEFINE_CONVERSION(MyInt           , MyInt,  cTrivial, integral_to_integral, signed_to_signed  , udt_to_udt     ,!cSubRanged );
195DEFINE_CONVERSION(MyFloat         , MyInt, !cTrivial, integral_to_float   , signed_to_signed  , udt_to_udt     ,!cSubRanged );
196
197DEFINE_CONVERSION(boost::uint8_t  , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
198DEFINE_CONVERSION(boost::int8_t   , MyFloat, !cTrivial, float_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
199DEFINE_CONVERSION(boost::uint16_t , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
200DEFINE_CONVERSION(boost::int16_t  , MyFloat, !cTrivial, float_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
201DEFINE_CONVERSION(boost::uint32_t , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged );
202DEFINE_CONVERSION(boost::int32_t  , MyFloat, !cTrivial, float_to_integral, signed_to_signed  , udt_to_builtin , cSubRanged );
203DEFINE_CONVERSION(float           , MyFloat, !cTrivial, float_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
204DEFINE_CONVERSION(double          , MyFloat, !cTrivial, float_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
205DEFINE_CONVERSION(long double     , MyFloat, !cTrivial, float_to_float   , signed_to_signed  , udt_to_builtin , cSubRanged );
206DEFINE_CONVERSION(MyInt           , MyFloat, !cTrivial, float_to_integral, signed_to_signed  , udt_to_udt     ,!cSubRanged );
207DEFINE_CONVERSION(MyFloat         , MyFloat,  cTrivial, float_to_float   , signed_to_signed  , udt_to_udt     ,!cSubRanged );
208
209//
210// The test is performed by comparing each field of
211//   boost::numeric::conversion_traits<T,S>
212// with the fields of
213//   expected_traits<T,S>
214// which is a traits class constructed explicitely for each combination
215// of the built-in arithmetic types.
216//
217template<class T,
218         class S,
219         class Supertype,
220         class Subtype,
221         class Subranged,
222         class Trivial
223        >
224struct expected_traits
225{
226  typedef typename my_int_float_mixture   <T,S>::type int_float_mixture ;
227  typedef typename my_sign_mixture        <T,S>::type sign_mixture ;
228  typedef typename my_udt_builtin_mixture <T,S>::type udt_builtin_mixture ;
229
230  typedef Subranged subranged ;
231  typedef Trivial   trivial   ;
232  typedef Supertype supertype ;
233  typedef Subtype   subtype   ;
234} ;
235
236// This is used by the test engine to generate a expected_traits from T and S.
237//
238template<class T, class S>
239struct generate_expected_traits
240{
241  typedef expected_traits<T, S, T, S, mpl::false_, mpl::true_  > trivial ;
242  typedef expected_traits<T, S, S, T, mpl::true_ , mpl::false_ > subranged ;
243  typedef expected_traits<T, S, T, S, mpl::false_, mpl::false_ > non_subranged ;
244
245  typedef typename my_is_subranged<T,S>::type IsSubranged ;
246  typedef typename my_is_trivial  <T,S>::type IsTrivial   ;
247
248  typedef typename mpl::if_<IsSubranged,subranged,non_subranged>::type non_trivial ;
249
250  typedef typename mpl::if_<IsTrivial,trivial,non_trivial>::type  type ;
251} ;
252
253// This macro generates the code that compares a non-type field
254// in boost::numeric::conversion_traits<> with its corresponding field
255// in expected_traits<>
256//
257
258#define TEST_VALUE_FIELD(Name) \
259        typedef typename traits::Name   BOOST_PP_CAT(t,Name) ; \
260        typedef typename expected::Name BOOST_PP_CAT(x,Name) ; \
261        BOOST_CHECK_MESSAGE ( ( BOOST_PP_CAT(t,Name)::value == BOOST_PP_CAT(x,Name)::value ) , \
262                              "conversion_traits<" << typeid(T).name() << "," << typeid(S).name() \
263                              << ">::" << #Name << " = " << to_string(BOOST_PP_CAT(t,Name)::value) \
264                              << ". Expected: "  << to_string(BOOST_PP_CAT(x,Name)::value) \
265                            ) ;
266
267// This macro generates the code that compares a type field
268// in numeric::conversion_traits<> with its corresponding field
269// in expected_traits<>
270//
271#define TEST_TYPE_FIELD(Name) \
272        typedef typename traits::Name   BOOST_PP_CAT(t,Name) ; \
273        typedef typename expected::Name BOOST_PP_CAT(x,Name) ; \
274        BOOST_CHECK_MESSAGE ( ( typeid(BOOST_PP_CAT(t,Name)) == typeid(BOOST_PP_CAT(x,Name)) ) , \
275                              "conversion_traits<" << typeid(T).name() << "," << typeid(S).name() \
276                              << ">::" << #Name << " = " <<  typeid(BOOST_PP_CAT(t,Name)).name() \
277                              << ". Expected: "  << typeid(BOOST_PP_CAT(x,Name)).name() \
278                            ) ;
279
280//
281// Test core.
282// Compares each field of boost::numeric::conversion_traits<T,S>
283// with the corresponding field of expected_traits<T,S>
284//
285template<class T, class S>
286void test_traits_base(  MATCH_FNTPL_ARG(T),  MATCH_FNTPL_ARG(S) )
287{
288  typedef boost::numeric::conversion_traits<T,S> traits ;
289  typedef typename generate_expected_traits<T,S>::type expected ;
290
291  TEST_VALUE_FIELD(int_float_mixture) ;
292  TEST_VALUE_FIELD(sign_mixture) ;
293  TEST_VALUE_FIELD(udt_builtin_mixture) ;
294  TEST_VALUE_FIELD(subranged) ;
295  TEST_VALUE_FIELD(trivial) ;
296  TEST_TYPE_FIELD (supertype) ;
297  TEST_TYPE_FIELD (subtype) ;
298}
299
300
301template<class S>
302void test_traits_from(  MATCH_FNTPL_ARG(S) )
303{
304  test_traits_base( SET_FNTPL_ARG(boost::uint8_t)  ,SET_FNTPL_ARG(S) );
305  test_traits_base( SET_FNTPL_ARG(boost::int8_t)   ,SET_FNTPL_ARG(S) );
306  test_traits_base( SET_FNTPL_ARG(boost::uint16_t) ,SET_FNTPL_ARG(S) );
307  test_traits_base( SET_FNTPL_ARG(boost::int16_t)  ,SET_FNTPL_ARG(S) );
308  test_traits_base( SET_FNTPL_ARG(boost::uint32_t) ,SET_FNTPL_ARG(S) );
309  test_traits_base( SET_FNTPL_ARG(boost::int32_t)  ,SET_FNTPL_ARG(S) );
310  test_traits_base( SET_FNTPL_ARG(float)           ,SET_FNTPL_ARG(S) );
311  test_traits_base( SET_FNTPL_ARG(double)          ,SET_FNTPL_ARG(S) );
312  test_traits_base( SET_FNTPL_ARG(long double)     ,SET_FNTPL_ARG(S) );
313  test_traits_base( SET_FNTPL_ARG(MyInt)           ,SET_FNTPL_ARG(S) );
314  test_traits_base( SET_FNTPL_ARG(MyFloat)         ,SET_FNTPL_ARG(S) );
315}
316
317void test_traits()
318{
319  test_traits_from( SET_FNTPL_ARG(boost::uint8_t)  );
320  test_traits_from( SET_FNTPL_ARG(boost::int8_t)   );
321  test_traits_from( SET_FNTPL_ARG(boost::uint16_t) );
322  test_traits_from( SET_FNTPL_ARG(boost::int16_t)  );
323  test_traits_from( SET_FNTPL_ARG(boost::uint32_t) );
324  test_traits_from( SET_FNTPL_ARG(boost::int32_t)  );
325  test_traits_from( SET_FNTPL_ARG(float)           );
326  test_traits_from( SET_FNTPL_ARG(double)          );
327  test_traits_from( SET_FNTPL_ARG(long double)     );
328  test_traits_from( SET_FNTPL_ARG(MyInt)           );
329  test_traits_from( SET_FNTPL_ARG(MyFloat)         );
330}
331
332int test_main( int, char * [])
333{
334  std::cout << std::setprecision( std::numeric_limits<long double>::digits10 ) ;
335 
336  test_traits();
337
338  return 0;
339}
340//---------------------------------------------------------------------------
341
Note: See TracBrowser for help on using the repository browser.