#ifndef BOOST_NUMERIC_NATIVE_HPP #define BOOST_NUMERIC_NATIVE_HPP // 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 // 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 safe_numerics { struct native { public: // arithmetic operators template struct addition_result { using type = decltype( typename base_type::type() + typename base_type::type() ); }; template struct subtraction_result { using type = decltype( typename base_type::type() - typename base_type::type() ); }; template struct multiplication_result { using type = decltype( typename base_type::type() * typename base_type::type() ); }; template struct division_result { using type = decltype( typename base_type::type() / typename base_type::type() ); }; template struct modulus_result { using type = decltype( typename base_type::type() % typename base_type::type() ); }; // note: comparison_result (<, >, ...) is special. // The return value is always a bool. The type returned here is // the intermediate type applied to make the values comparable. template struct comparison_result { using type = decltype( typename base_type::type() + typename base_type::type() ); }; // shift operators template struct left_shift_result { using type = decltype( typename base_type::type() << typename base_type::type() ); }; template struct right_shift_result { using type = decltype( typename base_type::type() >> typename base_type::type() ); }; // bitwise operators template struct bitwise_or_result { using type = decltype( typename base_type::type() | typename base_type::type() ); }; template struct bitwise_and_result { using type = decltype( typename base_type::type() & typename base_type::type() ); }; template struct bitwise_xor_result { using type = decltype( typename base_type::type() ^ typename base_type::type() ); }; }; } // safe_numerics } // boost #endif // BOOST_NUMERIC_NATIVE_HPP