- add third_party src.
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / GrTemplates.h
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