#ifndef BOOST_NUMERIC_NATIVE_HPP #define BOOST_NUMERIC_NATIVE_HPP // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif // Copyright (c) 2012 Robert Ramey // // Distributed under 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) #include #include #include "checked.hpp" // policy which creates results types and values equal to that of C++ promotions. // When used in conjunction with a desired exception policy, traps errors but // does not otherwise alter the results produced by the program using it. namespace boost { namespace numeric { struct native { // Standard C++ type promotion for expressions doesn't depend // on the operation being performed so we can just as well // use any operation to determine it. We choose + for this // purpose. template using additive_operator_type = decltype( typename base_type::type() + typename base_type::type() ); template using multiplicative_operator_type = decltype( typename base_type::type() * typename base_type::type() ); // note: right/left shift require integer arguments template using bitwise_shift_operator_type = decltype( typename base_type::type() << typename base_type::type() ); template using bitwise_logic_operator_type = decltype( typename base_type::type() & typename base_type::type() ); template struct addition_result { using type = additive_operator_type; }; template struct subtraction_result { using type = additive_operator_type; }; template struct multiplication_result { using type = multiplicative_operator_type; }; template struct division_result { using type = multiplicative_operator_type; }; // forward to correct divide implementation template checked_result static constexpr divide( const T & t, const U & u ){ return checked::divide(t, u); } template struct modulus_result { using type = multiplicative_operator_type; }; // forward to correct modulus implementation template checked_result static constexpr modulus( const T & t, const U & u ){ return checked::modulus(t, u); } template struct left_shift_result { using type = bitwise_shift_operator_type; }; template struct right_shift_result { using type = bitwise_shift_operator_type; }; template struct bitwise_result { using type = bitwise_logic_operator_type; }; }; } // numeric } // boost #endif // BOOST_NUMERIC_NATIVE_HPP