/* | |
* Copyright (c) 2001-2003 Joel de Guzman | |
* | |
* Use, modification and distribution is subject to the Boost Software | |
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
* http://www.boost.org/LICENSE_1_0.txt) | |
*/ | |
#ifndef _BOOST_UBLAS_NUMERICTYPE_DEDUCTION_ | |
#define _BOOST_UBLAS_NUMERICTYPE_DEDUCTION_ | |
// See original in boost-sandbox/boost/utility/type_deduction.hpp for comments | |
#include <boost/mpl/vector/vector20.hpp> | |
#include <boost/mpl/at.hpp> | |
#include <boost/mpl/or.hpp> | |
#include <boost/mpl/identity.hpp> | |
#include <boost/type_traits/remove_cv.hpp> | |
#include <boost/type_traits/is_same.hpp> | |
#include <boost/utility/enable_if.hpp> | |
namespace boost { namespace numeric { namespace ublas { | |
struct error_cant_deduce_type {}; | |
namespace type_deduction_detail | |
{ | |
typedef char(&bool_value_type)[1]; | |
typedef char(&float_value_type)[2]; | |
typedef char(&double_value_type)[3]; | |
typedef char(&long_double_value_type)[4]; | |
typedef char(&char_value_type)[5]; | |
typedef char(&schar_value_type)[6]; | |
typedef char(&uchar_value_type)[7]; | |
typedef char(&short_value_type)[8]; | |
typedef char(&ushort_value_type)[9]; | |
typedef char(&int_value_type)[10]; | |
typedef char(&uint_value_type)[11]; | |
typedef char(&long_value_type)[12]; | |
typedef char(&ulong_value_type)[13]; | |
typedef char(&x_value_type)[14]; | |
typedef char(&y_value_type)[15]; | |
typedef char(&cant_deduce_type)[16]; | |
template <typename T, typename PlainT = typename remove_cv<T>::type> | |
struct is_basic | |
: mpl::or_< | |
typename mpl::or_< | |
is_same<PlainT, bool> | |
, is_same<PlainT, float> | |
, is_same<PlainT, double> | |
, is_same<PlainT, long double> | |
> ::type, | |
typename mpl::or_< | |
is_same<PlainT, char> | |
, is_same<PlainT, signed char> | |
, is_same<PlainT, unsigned char> | |
, is_same<PlainT, short> | |
, is_same<PlainT, unsigned short> | |
> ::type, | |
typename mpl::or_< | |
is_same<PlainT, int> | |
, is_same<PlainT, unsigned int> | |
, is_same<PlainT, long> | |
, is_same<PlainT, unsigned long> | |
> ::type | |
> {}; | |
struct asymmetric; | |
template <typename X, typename Y> | |
cant_deduce_type | |
test(...); // The black hole !!! | |
template <typename X, typename Y> | |
bool_value_type | |
test(bool const&); | |
template <typename X, typename Y> | |
float_value_type | |
test(float const&); | |
template <typename X, typename Y> | |
double_value_type | |
test(double const&); | |
template <typename X, typename Y> | |
long_double_value_type | |
test(long double const&); | |
template <typename X, typename Y> | |
char_value_type | |
test(char const&); | |
template <typename X, typename Y> | |
schar_value_type | |
test(signed char const&); | |
template <typename X, typename Y> | |
uchar_value_type | |
test(unsigned char const&); | |
template <typename X, typename Y> | |
short_value_type | |
test(short const&); | |
template <typename X, typename Y> | |
ushort_value_type | |
test(unsigned short const&); | |
template <typename X, typename Y> | |
int_value_type | |
test(int const&); | |
template <typename X, typename Y> | |
uint_value_type | |
test(unsigned int const&); | |
template <typename X, typename Y> | |
long_value_type | |
test(long const&); | |
template <typename X, typename Y> | |
ulong_value_type | |
test(unsigned long const&); | |
template <typename X, typename Y> | |
typename disable_if< | |
is_basic<X>, x_value_type | |
>::type | |
test(X const&); | |
template <typename X, typename Y> | |
typename disable_if< | |
mpl::or_< | |
is_basic<Y> | |
, is_same<Y, asymmetric> | |
, is_same<const X, const Y> | |
> | |
, y_value_type | |
>::type | |
test(Y const&); | |
template <typename X, typename Y> | |
struct base_result_of | |
{ | |
typedef typename remove_cv<X>::type x_type; | |
typedef typename remove_cv<Y>::type y_type; | |
typedef mpl::vector16< | |
mpl::identity<bool> | |
, mpl::identity<float> | |
, mpl::identity<double> | |
, mpl::identity<long double> | |
, mpl::identity<char> | |
, mpl::identity<signed char> | |
, mpl::identity<unsigned char> | |
, mpl::identity<short> | |
, mpl::identity<unsigned short> | |
, mpl::identity<int> | |
, mpl::identity<unsigned int> | |
, mpl::identity<long> | |
, mpl::identity<unsigned long> | |
, mpl::identity<x_type> | |
, mpl::identity<y_type> | |
, mpl::identity<error_cant_deduce_type> | |
> | |
types; | |
}; | |
}}} } // namespace boost::numeric::ublas ::type_deduction_detail | |
#endif |