#ifndef BASE_NUMERICS_CLAMPED_MATH_IMPL_H_
#define BASE_NUMERICS_CLAMPED_MATH_IMPL_H_
#include <concepts>
#include <limits>
#include <type_traits>
#include "base/numerics/checked_math.h"
#include "base/numerics/safe_conversions.h"
#include "base/numerics/safe_math_shared_impl.h"
namespace base {
namespace internal {
template <typename T>
requires(std::signed_integral<T>)
constexpr T SaturatedNegWrapper(T value) { … }
template <typename T>
requires(std::unsigned_integral<T>)
constexpr T SaturatedNegWrapper(T value) { … }
template <typename T>
requires(std::floating_point<T>)
constexpr T SaturatedNegWrapper(T value) { … }
template <typename T>
requires(std::integral<T>)
constexpr T SaturatedAbsWrapper(T value) { … }
template <typename T>
requires(std::floating_point<T>)
constexpr T SaturatedAbsWrapper(T value) { … }
template <typename T, typename U>
struct ClampedAddOp { … };
ClampedAddOp<T, U>;
template <typename T, typename U>
struct ClampedSubOp { … };
ClampedSubOp<T, U>;
template <typename T, typename U>
struct ClampedMulOp { … };
ClampedMulOp<T, U>;
template <typename T, typename U>
struct ClampedDivOp { … };
ClampedDivOp<T, U>;
template <typename T, typename U>
struct ClampedModOp { … };
ClampedModOp<T, U>;
template <typename T, typename U>
struct ClampedLshOp { … };
ClampedLshOp<T, U>;
template <typename T, typename U>
struct ClampedRshOp { … };
ClampedRshOp<T, U>;
template <typename T, typename U>
struct ClampedAndOp { … };
ClampedAndOp<T, U>;
template <typename T, typename U>
struct ClampedOrOp { … };
ClampedOrOp<T, U>;
template <typename T, typename U>
struct ClampedXorOp { … };
ClampedXorOp<T, U>;
template <typename T, typename U>
struct ClampedMaxOp { … };
ClampedMaxOp<T, U>;
template <typename T, typename U>
struct ClampedMinOp { … };
ClampedMinOp<T, U>;
#define BASE_FLOAT_ARITHMETIC_OPS …
BASE_FLOAT_ARITHMETIC_OPS
BASE_FLOAT_ARITHMETIC_OPS
BASE_FLOAT_ARITHMETIC_OPS
BASE_FLOAT_ARITHMETIC_OPS
#undef BASE_FLOAT_ARITHMETIC_OPS
}
}
#endif