12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef RTC_BASE_NUMERICS_SAFE_CONVERSIONS_H_
- #define RTC_BASE_NUMERICS_SAFE_CONVERSIONS_H_
- #include <limits>
- #include "rtc_base/checks.h"
- #include "rtc_base/numerics/safe_conversions_impl.h"
- namespace rtc {
- template <typename Dst, typename Src>
- inline constexpr bool IsValueInRangeForNumericType(Src value) {
- return internal::RangeCheck<Dst>(value) == internal::TYPE_VALID;
- }
- template <typename Dst, typename Src>
- inline constexpr Dst checked_cast(Src value) {
- RTC_CHECK(IsValueInRangeForNumericType<Dst>(value));
- return static_cast<Dst>(value);
- }
- template <typename Dst, typename Src>
- inline constexpr Dst dchecked_cast(Src value) {
- RTC_DCHECK(IsValueInRangeForNumericType<Dst>(value));
- return static_cast<Dst>(value);
- }
- template <typename Dst, typename Src>
- inline constexpr Dst saturated_cast(Src value) {
-
- if (std::numeric_limits<Dst>::is_iec559)
- return static_cast<Dst>(value);
- switch (internal::RangeCheck<Dst>(value)) {
- case internal::TYPE_VALID:
- return static_cast<Dst>(value);
- case internal::TYPE_UNDERFLOW:
- return std::numeric_limits<Dst>::min();
- case internal::TYPE_OVERFLOW:
- return std::numeric_limits<Dst>::max();
-
- case internal::TYPE_INVALID:
- FATAL();
- return std::numeric_limits<Dst>::max();
- }
- FATAL();
- return static_cast<Dst>(value);
- }
- }
- #endif
|