|
1 /* |
|
2 * Copyright 2010 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 GrTemplates_DEFINED |
|
9 #define GrTemplates_DEFINED |
|
10 |
|
11 #include "SkTypes.h" |
|
12 |
|
13 /** |
|
14 * Use to cast a ptr to a different type, and maintain strict-aliasing |
|
15 */ |
|
16 template <typename Dst, typename Src> Dst GrTCast(Src src) { |
|
17 union { |
|
18 Src src; |
|
19 Dst dst; |
|
20 } data; |
|
21 data.src = src; |
|
22 return data.dst; |
|
23 } |
|
24 |
|
25 /** |
|
26 * takes a T*, saves the value it points to, in and restores the value in the |
|
27 * destructor |
|
28 * e.g.: |
|
29 * { |
|
30 * GrAutoTRestore<int*> autoCountRestore; |
|
31 * if (useExtra) { |
|
32 * autoCountRestore.reset(&fCount); |
|
33 * fCount += fExtraCount; |
|
34 * } |
|
35 * ... |
|
36 * } // fCount is restored |
|
37 */ |
|
38 template <typename T> class GrAutoTRestore : public SkNoncopyable { |
|
39 public: |
|
40 GrAutoTRestore() : fPtr(NULL), fVal() {} |
|
41 |
|
42 GrAutoTRestore(T* ptr) { |
|
43 fPtr = ptr; |
|
44 if (NULL != ptr) { |
|
45 fVal = *ptr; |
|
46 } |
|
47 } |
|
48 |
|
49 ~GrAutoTRestore() { |
|
50 if (NULL != fPtr) { |
|
51 *fPtr = fVal; |
|
52 } |
|
53 } |
|
54 |
|
55 // restores previously saved value (if any) and saves value for passed T* |
|
56 void reset(T* ptr) { |
|
57 if (NULL != fPtr) { |
|
58 *fPtr = fVal; |
|
59 } |
|
60 fPtr = ptr; |
|
61 fVal = *ptr; |
|
62 } |
|
63 private: |
|
64 T* fPtr; |
|
65 T fVal; |
|
66 }; |
|
67 |
|
68 #endif |