Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: webrtc/base/safe_conversions.h

Issue 2714063002: Introduce dchecked_cast, and start using it (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 // Borrowed from Chromium's src/base/numerics/safe_conversions.h. 11 // Borrowed from Chromium's src/base/numerics/safe_conversions.h.
12 12
13 #ifndef WEBRTC_BASE_SAFE_CONVERSIONS_H_ 13 #ifndef WEBRTC_BASE_SAFE_CONVERSIONS_H_
14 #define WEBRTC_BASE_SAFE_CONVERSIONS_H_ 14 #define WEBRTC_BASE_SAFE_CONVERSIONS_H_
15 15
16 #include <limits> 16 #include <limits>
17 17
18 #include "webrtc/base/checks.h" 18 #include "webrtc/base/checks.h"
19 #include "webrtc/base/safe_conversions_impl.h" 19 #include "webrtc/base/safe_conversions_impl.h"
20 20
21 namespace rtc { 21 namespace rtc {
22 22
23 // Convenience function that returns true if the supplied value is in range 23 // Convenience function that returns true if the supplied value is in range
24 // for the destination type. 24 // for the destination type.
25 template <typename Dst, typename Src> 25 template <typename Dst, typename Src>
26 inline bool IsValueInRangeForNumericType(Src value) { 26 inline bool IsValueInRangeForNumericType(Src value) {
27 return internal::RangeCheck<Dst>(value) == internal::TYPE_VALID; 27 return internal::RangeCheck<Dst>(value) == internal::TYPE_VALID;
28 } 28 }
29 29
30 // checked_cast<> is analogous to static_cast<> for numeric types, 30 // checked_cast<> and dchecked_cast<> are analogous to static_cast<> for
31 // except that it CHECKs that the specified numeric conversion will not 31 // numeric types, except that they [D]CHECK that the specified numeric
32 // overflow or underflow. NaN source will always trigger a CHECK. 32 // conversion will not overflow or underflow. NaN source will always trigger
33 // the [D]CHECK.
33 template <typename Dst, typename Src> 34 template <typename Dst, typename Src>
34 inline Dst checked_cast(Src value) { 35 inline Dst checked_cast(Src value) {
35 RTC_CHECK(IsValueInRangeForNumericType<Dst>(value)); 36 RTC_CHECK(IsValueInRangeForNumericType<Dst>(value));
36 return static_cast<Dst>(value); 37 return static_cast<Dst>(value);
37 } 38 }
39 template <typename Dst, typename Src>
40 inline Dst dchecked_cast(Src value) {
41 RTC_DCHECK(IsValueInRangeForNumericType<Dst>(value));
42 return static_cast<Dst>(value);
43 }
38 44
39 // saturated_cast<> is analogous to static_cast<> for numeric types, except 45 // saturated_cast<> is analogous to static_cast<> for numeric types, except
40 // that the specified numeric conversion will saturate rather than overflow or 46 // that the specified numeric conversion will saturate rather than overflow or
41 // underflow. NaN assignment to an integral will trigger a RTC_CHECK condition. 47 // underflow. NaN assignment to an integral will trigger a RTC_CHECK condition.
42 template <typename Dst, typename Src> 48 template <typename Dst, typename Src>
43 inline Dst saturated_cast(Src value) { 49 inline Dst saturated_cast(Src value) {
44 // Optimization for floating point values, which already saturate. 50 // Optimization for floating point values, which already saturate.
45 if (std::numeric_limits<Dst>::is_iec559) 51 if (std::numeric_limits<Dst>::is_iec559)
46 return static_cast<Dst>(value); 52 return static_cast<Dst>(value);
47 53
(...skipping 13 matching lines...) Expand all
61 return std::numeric_limits<Dst>::max(); 67 return std::numeric_limits<Dst>::max();
62 } 68 }
63 69
64 FATAL(); 70 FATAL();
65 return static_cast<Dst>(value); 71 return static_cast<Dst>(value);
66 } 72 }
67 73
68 } // namespace rtc 74 } // namespace rtc
69 75
70 #endif // WEBRTC_BASE_SAFE_CONVERSIONS_H_ 76 #endif // WEBRTC_BASE_SAFE_CONVERSIONS_H_
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/audio_coding/acm2/acm_receiver.cc » ('j') | webrtc/modules/audio_coding/neteq/neteq_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698