1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com */
7a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com
8a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com#ifndef GrTemplates_DEFINED
9a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com#define GrTemplates_DEFINED
10a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com
11a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h"
12a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com
13a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com/**
14a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com *  Use to cast a ptr to a different type, and maintain strict-aliasing
15a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com */
16a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.comtemplate <typename Dst, typename Src> Dst GrTCast(Src src) {
17a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    union {
18a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        Src src;
19a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        Dst dst;
20a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    } data;
21a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    data.src = src;
22a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    return data.dst;
23a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com}
24a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com
25a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com/**
26a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com * takes a T*, saves the value it points to,  in and restores the value in the
27a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com * destructor
28a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com * e.g.:
29a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com * {
30a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com *      GrAutoTRestore<int*> autoCountRestore;
31a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com *      if (useExtra) {
32a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com *          autoCountRestore.reset(&fCount);
33a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com *          fCount += fExtraCount;
34a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com *      }
35a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com *      ...
36a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com * }  // fCount is restored
37a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com */
38e3beb6bd7de7fa211681abbb0be58e80b19885e0commit-bot@chromium.orgtemplate <typename T> class GrAutoTRestore : SkNoncopyable {
39a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.compublic:
40a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com    GrAutoTRestore() : fPtr(NULL), fVal() {}
41d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
42a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com    GrAutoTRestore(T* ptr) {
43a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        fPtr = ptr;
44a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        if (NULL != ptr) {
45a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com            fVal = *ptr;
46a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        }
47a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    }
48d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
49a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com    ~GrAutoTRestore() {
50a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        if (NULL != fPtr) {
51a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com            *fPtr = fVal;
52a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        }
53a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    }
54d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
55a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    // restores previously saved value (if any) and saves value for passed T*
56a320194e4242ef0e5e758aea896bfd52bcb3dac7bsalomon@google.com    void reset(T* ptr) {
57a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        if (NULL != fPtr) {
58a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com            *fPtr = fVal;
59a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        }
60a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        fPtr = ptr;
61a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com        fVal = *ptr;
62a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    }
63a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.comprivate:
64a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    T* fPtr;
65a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com    T  fVal;
66a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com};
67a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com
6883747252b811c9f76bfec3c8ea4b48e30e46dd7fagl@chromium.org#endif
69