gfx/skia/trunk/src/gpu/GrTemplates.h

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:2e78d5106fd9
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

mercurial