1 /*
2  * Copyright 2016 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 GrResourceHandle_DEFINED
9 #define GrResourceHandle_DEFINED
10 
11 #include "include/core/SkTypes.h"
12 
13 // Opaque handle to a resource. Users should always use the macro below to create a specific
14 // template instantiation of GrResourceHandle.
15 template <typename kind> class GrResourceHandle {
16 public:
GrResourceHandle(int value)17     GrResourceHandle(int value) : fValue(value) {
18         SkASSERT(this->isValid());
19     }
20 
GrResourceHandle()21     GrResourceHandle() : fValue(kInvalid_ResourceHandle) {}
22 
23     bool operator==(const GrResourceHandle& other) const { return other.fValue == fValue; }
isValid()24     bool isValid() const { return kInvalid_ResourceHandle != fValue; }
toIndex()25     int toIndex() const { SkASSERT(this->isValid()); return fValue; }
26 
27 private:
28     static const int kInvalid_ResourceHandle = -1;
29     int fValue;
30 };
31 
32 // Creates a type "name", which is a specfic template instantiation of GrResourceHandle.
33 #define GR_DEFINE_RESOURCE_HANDLE_CLASS(name) \
34     struct name##Kind {};  \
35     using name = GrResourceHandle<name##Kind>;
36 #endif
37