williamr@2: // © Copyright Fernando Luis Cacciola Carballal 2000-2004 williamr@2: // Use, modification, and distribution is subject to the Boost Software williamr@2: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: williamr@2: // See library home page at http://www.boost.org/libs/numeric/conversion williamr@2: // williamr@2: // Contact the author at: fernando_cacciola@hotmail.com williamr@2: // williamr@2: #ifndef BOOST_NUMERIC_CONVERSION_DETAIL_META_FLC_12NOV2002_HPP williamr@2: #define BOOST_NUMERIC_CONVERSION_DETAIL_META_FLC_12NOV2002_HPP williamr@2: williamr@2: #include "boost/type_traits/remove_cv.hpp" williamr@2: williamr@2: #include "boost/mpl/if.hpp" williamr@2: #include "boost/mpl/eval_if.hpp" williamr@2: #include "boost/mpl/equal_to.hpp" williamr@2: #include "boost/mpl/not.hpp" williamr@2: #include "boost/mpl/and.hpp" williamr@2: #include "boost/mpl/bool.hpp" williamr@2: #include "boost/mpl/identity.hpp" williamr@2: williamr@2: namespace boost { namespace numeric { namespace convdetail williamr@2: { williamr@2: template< class T1, class T2> williamr@2: struct equal_to williamr@2: { williamr@2: #if !defined(__BORLANDC__) williamr@2: williamr@2: enum { x = ( BOOST_MPL_AUX_VALUE_WKND(T1)::value == BOOST_MPL_AUX_VALUE_WKND(T2)::value ) }; williamr@2: williamr@2: BOOST_STATIC_CONSTANT(bool, value = x); williamr@2: williamr@2: typedef mpl::bool_ type; williamr@2: williamr@2: #else williamr@2: williamr@2: BOOST_STATIC_CONSTANT(bool, value = ( williamr@2: BOOST_MPL_AUX_VALUE_WKND(T1)::value williamr@2: == BOOST_MPL_AUX_VALUE_WKND(T2)::value williamr@2: )); williamr@2: williamr@2: typedef mpl::bool_<( williamr@2: BOOST_MPL_AUX_VALUE_WKND(T1)::value williamr@2: == BOOST_MPL_AUX_VALUE_WKND(T2)::value williamr@2: )> type; williamr@2: #endif williamr@2: }; williamr@2: williamr@2: // Metafunction: williamr@2: // williamr@2: // ct_switch4::type williamr@2: // williamr@2: // {Value,Case(X)Val} are Integral Constants (such as: mpl::int_<>) williamr@2: // {Case(X)Type,DefaultType} are arbitrary types. (not metafunctions) williamr@2: // williamr@2: // Returns Case(X)Type if Val==Case(X)Val; DefaultType otherwise. williamr@2: // williamr@2: template williamr@2: struct ct_switch4 williamr@2: { williamr@2: typedef mpl::identity Case0TypeQ ; williamr@2: typedef mpl::identity Case1TypeQ ; williamr@2: williamr@2: typedef equal_to is_case0 ; williamr@2: typedef equal_to is_case1 ; williamr@2: typedef equal_to is_case2 ; williamr@2: williamr@2: typedef mpl::if_ choose_2_3Q ; williamr@2: typedef mpl::eval_if choose_1_2_3Q ; williamr@2: williamr@2: typedef typename williamr@2: mpl::eval_if::type williamr@2: type ; williamr@2: } ; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: // Metafunction: williamr@2: // williamr@2: // for_both::type williamr@2: // williamr@2: // {exp0,expr1} are Boolean Integral Constants williamr@2: // {TT,TF,FT,FF} are aribtrary types. (not metafunctions) williamr@2: // williamr@2: // According to the combined boolean value of 'expr0 && expr1', selects the corresponding type. williamr@2: // williamr@2: template williamr@2: struct for_both williamr@2: { williamr@2: typedef mpl::identity TF_Q ; williamr@2: typedef mpl::identity TT_Q ; williamr@2: williamr@2: typedef typename mpl::not_::type not_expr0 ; williamr@2: typedef typename mpl::not_::type not_expr1 ; williamr@2: williamr@2: typedef typename mpl::and_::type caseTT ; williamr@2: typedef typename mpl::and_::type caseTF ; williamr@2: typedef typename mpl::and_::type caseFT ; williamr@2: williamr@2: typedef mpl::if_ choose_FT_FF_Q ; williamr@2: typedef mpl::eval_if choose_TF_FT_FF_Q ; williamr@2: williamr@2: typedef typename mpl::eval_if::type type ; williamr@2: } ; williamr@2: williamr@2: } } } // namespace boost::numeric::convdetail williamr@2: williamr@2: #endif williamr@2: williamr@2: