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 */
16template <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 */
38template <typename T> class GrAutoTRestore : SkNoncopyable {
39public:
40    GrAutoTRestore() : fPtr(NULL), fVal() {}
41
42    GrAutoTRestore(T* ptr) {
43        fPtr = ptr;
44        if (ptr) {
45            fVal = *ptr;
46        }
47    }
48
49    ~GrAutoTRestore() {
50        if (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 (fPtr) {
58            *fPtr = fVal;
59        }
60        fPtr = ptr;
61        fVal = *ptr;
62    }
63private:
64    T* fPtr;
65    T  fVal;
66};
67
68#endif
69