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