/* libs/graphics/sgl/SkTemplatesPriv.h ** ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ #ifndef SkTemplatesPriv_DEFINED #define SkTemplatesPriv_DEFINED #include "SkTemplates.h" //////////////////////////////////////////////////////////////////////////////// #ifdef SK_BUILD_FOR_WIN32 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ result = SkNEW(classname) #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args) \ result = SkNEW_ARGS(classname, args) #else #include #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ do { \ if (storagesize) \ { \ SkASSERT(storageSize >= sizeof(classname)); \ result = new(storage) classname; \ } \ else \ result = SkNEW(classname); \ } while (0) #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args) \ do { \ if (storagesize) \ { \ SkASSERT(storageSize >= sizeof(classname)); \ result = new(storage) classname args; \ } \ else \ result = SkNEW_ARGS(classname, args); \ } while (0) #endif //////////////////////////////////////////////////////////////////////////////// template class SkAutoTPlacementDelete { public: SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) { } ~SkAutoTPlacementDelete() { if (fObj) { if (fObj == fStorage) fObj->~T(); else delete fObj; } } T* detach() { T* obj = fObj; fObj = NULL; return obj; } private: T* fObj; void* fStorage; }; #endif