LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/base - safe_conversions.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 12 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 14 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
       3             :  *
       4             :  *  Use of this source code is governed by a BSD-style license
       5             :  *  that can be found in the LICENSE file in the root of the source
       6             :  *  tree. An additional intellectual property rights grant can be found
       7             :  *  in the file PATENTS.  All contributing project authors may
       8             :  *  be found in the AUTHORS file in the root of the source tree.
       9             :  */
      10             : 
      11             : // Borrowed from Chromium's src/base/numerics/safe_conversions.h.
      12             : 
      13             : #ifndef WEBRTC_BASE_SAFE_CONVERSIONS_H_
      14             : #define WEBRTC_BASE_SAFE_CONVERSIONS_H_
      15             : 
      16             : #include <limits>
      17             : 
      18             : #include "webrtc/base/checks.h"
      19             : #include "webrtc/base/safe_conversions_impl.h"
      20             : 
      21             : namespace rtc {
      22             : 
      23             : // Convenience function that returns true if the supplied value is in range
      24             : // for the destination type.
      25             : template <typename Dst, typename Src>
      26           0 : inline bool IsValueInRangeForNumericType(Src value) {
      27           0 :   return internal::RangeCheck<Dst>(value) == internal::TYPE_VALID;
      28             : }
      29             : 
      30             : // checked_cast<> is analogous to static_cast<> for numeric types,
      31             : // except that it CHECKs that the specified numeric conversion will not
      32             : // overflow or underflow. NaN source will always trigger a CHECK.
      33             : template <typename Dst, typename Src>
      34           0 : inline Dst checked_cast(Src value) {
      35           0 :   RTC_CHECK(IsValueInRangeForNumericType<Dst>(value));
      36           0 :   return static_cast<Dst>(value);
      37             : }
      38             : 
      39             : // saturated_cast<> is analogous to static_cast<> for numeric types, except
      40             : // that the specified numeric conversion will saturate rather than overflow or
      41             : // underflow. NaN assignment to an integral will trigger a RTC_CHECK condition.
      42             : template <typename Dst, typename Src>
      43           0 : inline Dst saturated_cast(Src value) {
      44             :   // Optimization for floating point values, which already saturate.
      45             :   if (std::numeric_limits<Dst>::is_iec559)
      46             :     return static_cast<Dst>(value);
      47             : 
      48           0 :   switch (internal::RangeCheck<Dst>(value)) {
      49             :     case internal::TYPE_VALID:
      50           0 :       return static_cast<Dst>(value);
      51             : 
      52             :     case internal::TYPE_UNDERFLOW:
      53           0 :       return std::numeric_limits<Dst>::min();
      54             : 
      55             :     case internal::TYPE_OVERFLOW:
      56           0 :       return std::numeric_limits<Dst>::max();
      57             : 
      58             :     // Should fail only on attempting to assign NaN to a saturated integer.
      59             :     case internal::TYPE_INVALID:
      60           0 :       FATAL();
      61             :       return std::numeric_limits<Dst>::max();
      62             :   }
      63             : 
      64           0 :   FATAL();
      65             :   return static_cast<Dst>(value);
      66             : }
      67             : 
      68             : }  // namespace rtc
      69             : 
      70             : #endif  // WEBRTC_BASE_SAFE_CONVERSIONS_H_

Generated by: LCOV version 1.13