• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkSafeRange_DEFINED
9 #define SkSafeRange_DEFINED
10 
11 #include "include/core/SkTypes.h"
12 
13 #include <cstdint>
14 
15 // SkSafeRange always check that a series of operations are in-range.
16 // This check is sticky, so that if any one operation fails, the object will remember that and
17 // return false from ok().
18 
19 class SkSafeRange {
20 public:
21     explicit operator bool() const { return fOK; }
22 
ok()23     bool ok() const { return fOK; }
24 
25     // checks 0 <= value <= max.
26     // On success, returns value
27     // On failure, returns 0 and sets ok() to false
checkLE(uint64_t value,T max)28     template <typename T> T checkLE(uint64_t value, T max) {
29         SkASSERT(static_cast<int64_t>(max) >= 0);
30         if (value > static_cast<uint64_t>(max)) {
31             fOK = false;
32             value = 0;
33         }
34         return static_cast<T>(value);
35     }
36 
checkGE(int value,int min)37     int checkGE(int value, int min) {
38         if (value < min) {
39             fOK = false;
40             value = min;
41         }
42         return value;
43     }
44 
45 private:
46     bool fOK = true;
47 };
48 
49 #endif
50