1// (c) Copyright Fernando Luis Cacciola Carballal 2000-2004
2// Use, modification, and distribution is subject to the Boost Software
3// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6// See library home page at http://www.boost.org/libs/numeric/conversion
7//
8// Contact the author at: fernando_cacciola@hotmail.com
9//
10#ifndef BOOST_NUMERIC_CONVERSION_DETAIL_CONVERSION_TRAITS_FLC_12NOV2002_HPP
11#define BOOST_NUMERIC_CONVERSION_DETAIL_CONVERSION_TRAITS_FLC_12NOV2002_HPP
12
13#include "boost/type_traits/is_arithmetic.hpp"
14#include "boost/type_traits/is_same.hpp"
15#include "boost/type_traits/remove_cv.hpp"
16
17#include "boost/numeric/conversion/detail/meta.hpp"
18#include "boost/numeric/conversion/detail/int_float_mixture.hpp"
19#include "boost/numeric/conversion/detail/sign_mixture.hpp"
20#include "boost/numeric/conversion/detail/udt_builtin_mixture.hpp"
21#include "boost/numeric/conversion/detail/is_subranged.hpp"
22
23namespace boost { namespace numeric { namespace convdetail
24{
25 //-------------------------------------------------------------------
26 // Implementation of the Conversion Traits for T != S
27 //
28 // This is a VISIBLE base class of the user-level conversion_traits<> class.
29 //-------------------------------------------------------------------
30 template<class T,class S>
31 struct non_trivial_traits_impl
32 {
33 typedef typename get_int_float_mixture <T,S>::type int_float_mixture ;
34 typedef typename get_sign_mixture <T,S>::type sign_mixture ;
35 typedef typename get_udt_builtin_mixture <T,S>::type udt_builtin_mixture ;
36
37 typedef typename get_is_subranged<T,S>::type subranged ;
38
39 typedef mpl::false_ trivial ;
40
41 typedef T target_type ;
42 typedef S source_type ;
43 typedef T result_type ;
44
45 typedef typename mpl::if_< is_arithmetic<S>, S, S const&>::type argument_type ;
46
47 typedef typename mpl::if_<subranged,S,T>::type supertype ;
48 typedef typename mpl::if_<subranged,T,S>::type subtype ;
49 } ;
50
51 //-------------------------------------------------------------------
52 // Implementation of the Conversion Traits for T == S
53 //
54 // This is a VISIBLE base class of the user-level conversion_traits<> class.
55 //-------------------------------------------------------------------
56 template<class N>
57 struct trivial_traits_impl
58 {
59 typedef typename get_int_float_mixture <N,N>::type int_float_mixture ;
60 typedef typename get_sign_mixture <N,N>::type sign_mixture ;
61 typedef typename get_udt_builtin_mixture<N,N>::type udt_builtin_mixture ;
62
63 typedef mpl::false_ subranged ;
64 typedef mpl::true_ trivial ;
65
66 typedef N target_type ;
67 typedef N source_type ;
68 typedef N const& result_type ;
69 typedef N const& argument_type ;
70
71 typedef N supertype ;
72 typedef N subtype ;
73
74 } ;
75
76 //-------------------------------------------------------------------
77 // Top level implementation selector.
78 //-------------------------------------------------------------------
79 template<class T, class S>
80 struct get_conversion_traits
81 {
82 typedef typename remove_cv<T>::type target_type ;
83 typedef typename remove_cv<S>::type source_type ;
84
85 typedef typename is_same<target_type,source_type>::type is_trivial ;
86
87 typedef trivial_traits_impl <target_type> trivial_imp ;
88 typedef non_trivial_traits_impl<target_type,source_type> non_trivial_imp ;
89
90 typedef typename mpl::if_<is_trivial,trivial_imp,non_trivial_imp>::type type ;
91 } ;
92
93} } } // namespace boost::numeric::convdetail
94
95#endif
96
97
98