diff options
author | Tom Sepez <tsepez@chromium.org> | 2015-02-05 09:46:23 -0800 |
---|---|---|
committer | Tom Sepez <tsepez@chromium.org> | 2015-02-05 09:46:23 -0800 |
commit | dabc5d57bf473708295800a7991bc1fafdf76288 (patch) | |
tree | 9dfb8313596dd61e2c600cf02548b191f9753daf /third_party/base/numerics/safe_conversions.h | |
parent | 7061d1af45752617fafa85e2242dc5b2844650b5 (diff) | |
download | pdfium-dabc5d57bf473708295800a7991bc1fafdf76288.tar.xz |
Add namespace and-re-arrange PDFium's local copy of chromium /base.
Any projects DEPS'd into chromium and requiring a /base
subset should have a local copy of that subset in a
separate namespace. This will avoid future naming conflicts.
Re-arrange the directory structure to better identify what
came from chromium's base, and to make drop-in replacement
easier for files that contain hard-coded "base/" in their
#include directives.
R=jam@chromium.org
Review URL: https://codereview.chromium.org/900753002
Diffstat (limited to 'third_party/base/numerics/safe_conversions.h')
-rw-r--r-- | third_party/base/numerics/safe_conversions.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/third_party/base/numerics/safe_conversions.h b/third_party/base/numerics/safe_conversions.h new file mode 100644 index 0000000000..e95608e0a5 --- /dev/null +++ b/third_party/base/numerics/safe_conversions.h @@ -0,0 +1,66 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDFIUM_THIRD_PARTY_BASE_SAFE_CONVERSIONS_H_ +#define PDFIUM_THIRD_PARTY_BASE_SAFE_CONVERSIONS_H_ + +#include <limits> + +#include "../logging.h" +#include "safe_conversions_impl.h" + +namespace pdfium { +namespace base { + +// Convenience function that returns true if the supplied value is in range +// for the destination type. +template <typename Dst, typename Src> +inline bool IsValueInRangeForNumericType(Src value) { + return internal::DstRangeRelationToSrcRange<Dst>(value) == + internal::RANGE_VALID; +} + +// checked_cast<> is analogous to static_cast<> for numeric types, +// except that it CHECKs that the specified numeric conversion will not +// overflow or underflow. NaN source will always trigger a CHECK. +template <typename Dst, typename Src> +inline Dst checked_cast(Src value) { + CHECK(IsValueInRangeForNumericType<Dst>(value)); + return static_cast<Dst>(value); +} + +// saturated_cast<> is analogous to static_cast<> for numeric types, except +// that the specified numeric conversion will saturate rather than overflow or +// underflow. NaN assignment to an integral will trigger a CHECK condition. +template <typename Dst, typename Src> +inline Dst saturated_cast(Src value) { + // Optimization for floating point values, which already saturate. + if (std::numeric_limits<Dst>::is_iec559) + return static_cast<Dst>(value); + + switch (internal::DstRangeRelationToSrcRange<Dst>(value)) { + case internal::RANGE_VALID: + return static_cast<Dst>(value); + + case internal::RANGE_UNDERFLOW: + return std::numeric_limits<Dst>::min(); + + case internal::RANGE_OVERFLOW: + return std::numeric_limits<Dst>::max(); + + // Should fail only on attempting to assign NaN to a saturated integer. + case internal::RANGE_INVALID: + CHECK(false); + return std::numeric_limits<Dst>::max(); + } + + NOTREACHED(); + return static_cast<Dst>(value); +} + +} // namespace base +} // namespace pdfium + +#endif // PDFIUM_THIRD_PARTY_BASE_SAFE_CONVERSIONS_H_ + |