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