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 */ GrTCast(Src src)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 */ 38 template <typename T> class GrAutoTRestore : SkNoncopyable { 39 public: GrAutoTRestore()40 GrAutoTRestore() : fPtr(NULL), fVal() {} 41 GrAutoTRestore(T * ptr)42 GrAutoTRestore(T* ptr) { 43 fPtr = ptr; 44 if (NULL != ptr) { 45 fVal = *ptr; 46 } 47 } 48 ~GrAutoTRestore()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* reset(T * ptr)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 69