New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
returntype_deduction.hpp in vendors/XIOS/current/extern/boost/include/boost/numeric/ublas/detail – NEMO

source: vendors/XIOS/current/extern/boost/include/boost/numeric/ublas/detail/returntype_deduction.hpp @ 3428

Last change on this file since 3428 was 3428, checked in by rblod, 12 years ago

importing initial XIOS vendor drop

File size: 4.7 KB
Line 
1/*
2 *  Copyright (c) 2001-2003 Joel de Guzman
3 *
4 *  Use, modification and distribution is subject to the Boost Software
5 *  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 *    http://www.boost.org/LICENSE_1_0.txt)
7 */
8#ifndef _BOOST_UBLAS_NUMERICTYPE_DEDUCTION_
9#define _BOOST_UBLAS_NUMERICTYPE_DEDUCTION_
10
11// See original in boost-sandbox/boost/utility/type_deduction.hpp for comments
12
13#include <boost/mpl/vector/vector20.hpp>
14#include <boost/mpl/at.hpp>
15#include <boost/mpl/or.hpp>
16#include <boost/mpl/identity.hpp>
17#include <boost/type_traits/remove_cv.hpp>
18#include <boost/type_traits/is_same.hpp>
19#include <boost/utility/enable_if.hpp>
20
21namespace boost { namespace numeric { namespace ublas {
22
23struct error_cant_deduce_type {};
24
25  namespace type_deduction_detail
26  {
27    typedef char(&bool_value_type)[1];
28    typedef char(&float_value_type)[2];
29    typedef char(&double_value_type)[3];
30    typedef char(&long_double_value_type)[4];
31    typedef char(&char_value_type)[5];
32    typedef char(&schar_value_type)[6];
33    typedef char(&uchar_value_type)[7];
34    typedef char(&short_value_type)[8];
35    typedef char(&ushort_value_type)[9];
36    typedef char(&int_value_type)[10];
37    typedef char(&uint_value_type)[11];
38    typedef char(&long_value_type)[12];
39    typedef char(&ulong_value_type)[13];
40   
41    typedef char(&x_value_type)[14];
42    typedef char(&y_value_type)[15];
43
44    typedef char(&cant_deduce_type)[16];
45
46    template <typename T, typename PlainT = typename remove_cv<T>::type>
47    struct is_basic
48        : mpl::or_<
49          typename mpl::or_<
50              is_same<PlainT, bool>
51            , is_same<PlainT, float>
52            , is_same<PlainT, double>
53            , is_same<PlainT, long double>
54          > ::type,
55          typename mpl::or_<
56              is_same<PlainT, char>
57            , is_same<PlainT, signed char>
58            , is_same<PlainT, unsigned char>
59            , is_same<PlainT, short>
60            , is_same<PlainT, unsigned short>
61            > ::type,
62          typename mpl::or_<
63              is_same<PlainT, int>
64            , is_same<PlainT, unsigned int>
65            , is_same<PlainT, long>
66            , is_same<PlainT, unsigned long>
67            > ::type
68        > {};
69
70    struct asymmetric;
71
72    template <typename X, typename Y>
73    cant_deduce_type
74    test(...); // The black hole !!!
75
76    template <typename X, typename Y>
77    bool_value_type
78    test(bool const&);
79
80    template <typename X, typename Y>
81    float_value_type
82    test(float const&);
83   
84    template <typename X, typename Y>
85    double_value_type
86    test(double const&);
87
88    template <typename X, typename Y>
89    long_double_value_type
90    test(long double const&);
91
92    template <typename X, typename Y>
93    char_value_type
94    test(char const&);
95
96    template <typename X, typename Y>
97    schar_value_type
98    test(signed char const&);
99
100    template <typename X, typename Y>
101    uchar_value_type
102    test(unsigned char const&);
103
104    template <typename X, typename Y>
105    short_value_type
106    test(short const&);
107
108    template <typename X, typename Y>
109    ushort_value_type
110    test(unsigned short const&);
111
112    template <typename X, typename Y>
113    int_value_type
114    test(int const&);
115
116    template <typename X, typename Y>
117    uint_value_type
118    test(unsigned int const&);
119
120    template <typename X, typename Y>
121    long_value_type
122    test(long const&);
123
124    template <typename X, typename Y>
125    ulong_value_type
126    test(unsigned long const&);
127
128    template <typename X, typename Y>
129    typename disable_if<
130        is_basic<X>, x_value_type
131    >::type
132    test(X const&);
133
134    template <typename X, typename Y>
135    typename disable_if<
136        mpl::or_<
137            is_basic<Y>
138          , is_same<Y, asymmetric>
139          , is_same<const X, const Y>
140        >
141      , y_value_type
142    >::type
143    test(Y const&);
144
145    template <typename X, typename Y>
146    struct base_result_of
147    {
148        typedef typename remove_cv<X>::type x_type;
149        typedef typename remove_cv<Y>::type y_type;
150
151        typedef mpl::vector16<
152            mpl::identity<bool>
153          , mpl::identity<float>
154          , mpl::identity<double>
155          , mpl::identity<long double>
156          , mpl::identity<char>
157          , mpl::identity<signed char>
158          , mpl::identity<unsigned char>
159          , mpl::identity<short>
160          , mpl::identity<unsigned short>
161          , mpl::identity<int>
162          , mpl::identity<unsigned int>
163          , mpl::identity<long>
164          , mpl::identity<unsigned long>
165          , mpl::identity<x_type>
166          , mpl::identity<y_type>
167          , mpl::identity<error_cant_deduce_type>
168        >
169        types;
170    };
171
172}}} } // namespace boost::numeric::ublas ::type_deduction_detail
173
174#endif
Note: See TracBrowser for help on using the repository browser.