175 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			175 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  *  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 |