1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 namespace WTF {
6
7 template<typename To, typename From>
isInBounds(From value)8 bool isInBounds(From value) {
9 return true;
10 }
11
12 template<typename To, typename From>
safeCast(From value)13 To safeCast(From value) {
14 if (!isInBounds<To>(value))
15 return 0;
16 return static_cast<To>(value);
17 }
18
19 template<typename T, typename OverflowHandler>
20 class Checked {
21 public:
22 template<typename U, typename V>
Checked(const Checked<U,V> & rhs)23 Checked(const Checked<U, V>& rhs){
24 if (rhs.hasOverflowed())
25 this->overflowed();
26 if (!isInBounds<T>(rhs.m_value))
27 this->overflowed();
28 m_value = static_cast<T>(rhs.m_value);
29 }
30
hasOverflowed() const31 bool hasOverflowed() const { return false; }
overflowed()32 void overflowed() { }
33
34 private:
35 T m_value;
36 };
37
38 template<typename To, typename From>
bitwise_cast(From from)39 To bitwise_cast(From from) {
40 static_assert(sizeof(To) == sizeof(From), "msg");
41 return reinterpret_cast<To>(from);
42 }
43
44 } // namespace WTF
45
46 namespace mojo {
47
48 template <typename U>
49 struct ArrayTraits;
50
51 template <typename U>
52 struct ArrayTraits<WTF::Checked<U, int>> {
HasOverflowedmojo::ArrayTraits53 static bool HasOverflowed(WTF::Checked<U, int>& input) {
54 // |hasOverflowed| below should be rewritten to |HasOverflowed|
55 // (because this is a method of WTF::Checked; it doesn't matter
56 // that we are not in WTF namespace *here*).
57 return input.hasOverflowed();
58 }
59 };
60
61 } // namespace mojo
62
63 using WTF::bitwise_cast;
64 using WTF::safeCast;
65