![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/include/boost/safe_numerics/ |
Upload File : |
#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 <type_traits> #include <limits> // 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<typename T, typename U> struct addition_result { using type = decltype( typename base_type<T>::type() + typename base_type<U>::type() ); }; template<typename T, typename U> struct subtraction_result { using type = decltype( typename base_type<T>::type() - typename base_type<U>::type() ); }; template<typename T, typename U> struct multiplication_result { using type = decltype( typename base_type<T>::type() * typename base_type<U>::type() ); }; template<typename T, typename U> struct division_result { using type = decltype( typename base_type<T>::type() / typename base_type<U>::type() ); }; template<typename T, typename U> struct modulus_result { using type = decltype( typename base_type<T>::type() % typename base_type<U>::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<typename T, typename U> struct comparison_result { using type = decltype( typename base_type<T>::type() + typename base_type<U>::type() ); }; // shift operators template<typename T, typename U> struct left_shift_result { using type = decltype( typename base_type<T>::type() << typename base_type<U>::type() ); }; template<typename T, typename U> struct right_shift_result { using type = decltype( typename base_type<T>::type() >> typename base_type<U>::type() ); }; // bitwise operators template<typename T, typename U> struct bitwise_or_result { using type = decltype( typename base_type<T>::type() | typename base_type<U>::type() ); }; template<typename T, typename U> struct bitwise_and_result { using type = decltype( typename base_type<T>::type() & typename base_type<U>::type() ); }; template<typename T, typename U> struct bitwise_xor_result { using type = decltype( typename base_type<T>::type() ^ typename base_type<U>::type() ); }; }; } // safe_numerics } // boost #endif // BOOST_NUMERIC_NATIVE_HPP