/usr/include/boost/safe_numerics
Edit: /usr/include/boost/safe_numerics/checked_float.hpp (5153B)
#ifndef BOOST_NUMERIC_CHECKED_FLOAT_HPP
#define BOOST_NUMERIC_CHECKED_FLOAT_HPP
// Copyright (c) 2017 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)
// contains operation implementation of arithmetic operators
// on built-in floating point types. The default implementation is to just
// invoke the operation with no checking. These are overloaded
// for specific types such as integer, etc.
#include
// std::is_floating_point, make_unsigned
namespace boost {
namespace safe_numerics {
namespace checked {
////////////////////////////////////////////////////
// layer 0 - implement safe operations for floating
template<
typename R,
R Min,
R Max,
typename T,
class F
>
struct heterogeneous_checked_operation<
R,
Min,
Max,
T,
F,
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
>::type
>{
constexpr static checked_result
cast(const T & t) noexcept {
return t;
};
}; // checked_unary_operation
template<
typename R,
R Min,
R Max,
typename T,
class
F
>
struct heterogeneous_checked_operation<
R,
Min,
Max,
T,
F,
typename std::enable_if<
std::is_floating_point::value
&& std::is_integralt::value
>::type
>{
constexpr static checked_result
cast(const T & t) noexcept {
return t;
};
}; // checked_unary_operation
template
struct checked_operation::value
>::type
>{
constexpr static checked_result cast(const T & t) {
return
cast_impl_detail::cast_impl(
t,
std::is_signed(),
std::is_signed()
);
}
constexpr static checked_result add(const T & t, const U & u) {
return t + u;
}
constexpr static checked_result subtract(
const T & t,
const U & u
) {
return t - u;
}
constexpr static checked_result multiply(
const T & t,
const U & u
) noexcept {
return t * u;
}
constexpr static checked_result divide(
const T & t,
const U & u
) noexcept {
return t / u;
}
constexpr static checked_result modulus(
const T & t,
const U & u
) noexcept {
return t % u;
}
constexpr static bool less_than(const T & t, const U & u) noexcept {
return t < u;
}
constexpr static bool greater_than(const T & t, const U & u) noexcept {
return t > u;
}
constexpr static bool equal(const T & t, const U & u) noexcept {
return t < u;
}
}; // checked_binary_operation
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr bool less_than(const T & t, const U & u) noexcept {
return t < u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr bool equal(const T & t, const U & u) noexcept {
return t < u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr checked_result left_shift(const T & t, const U & u) noexcept {
return t << u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr checked_result right_shift(const T & t, const U & u) noexcept {
return t >> u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr checked_result bitwise_or(const T & t, const U & u) noexcept {
return t | u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr checked_result bitwise_xor(const T & t, const U & u) noexcept {
return t ^ u;
}
template
typename std::enable_if<
std::is_floating_point::value
&& std::is_floating_point::value
&& std::is_floating_point::value,
checked_result
>::type
constexpr checked_result bitwise_and(const T & t, const U & u) noexcept {
return t & u;
}
} // checked
} // safe_numerics
} // boost
#endif // BOOST_NUMERIC_CHECKED_DEFAULT_HPP