/* * 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 #include #include #include #include #include #include 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 ::type> struct is_basic : mpl::or_< typename mpl::or_< is_same , is_same , is_same , is_same > ::type, typename mpl::or_< is_same , is_same , is_same , is_same , is_same > ::type, typename mpl::or_< is_same , is_same , is_same , is_same > ::type > {}; struct asymmetric; template cant_deduce_type test(...); // The black hole !!! template bool_value_type test(bool const&); template float_value_type test(float const&); template double_value_type test(double const&); template long_double_value_type test(long double const&); template char_value_type test(char const&); template schar_value_type test(signed char const&); template uchar_value_type test(unsigned char const&); template short_value_type test(short const&); template ushort_value_type test(unsigned short const&); template int_value_type test(int const&); template uint_value_type test(unsigned int const&); template long_value_type test(long const&); template ulong_value_type test(unsigned long const&); template typename disable_if< is_basic, x_value_type >::type test(X const&); template typename disable_if< mpl::or_< is_basic , is_same , is_same > , y_value_type >::type test(Y const&); template struct base_result_of { typedef typename remove_cv::type x_type; typedef typename remove_cv::type y_type; typedef mpl::vector16< mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity , mpl::identity > types; }; }}} } // namespace boost::numeric::ublas ::type_deduction_detail #endif