/* * Copyright 2001-2007, Ingo Weinhold, bonefish@users.sf.net. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _AUTO_DELETER_H #define _AUTO_DELETER_H /*! Scope-based automatic deletion of objects/arrays. ObjectDeleter - deletes an object ArrayDeleter - deletes an array MemoryDeleter - free()s malloc()ed memory */ #include namespace BPrivate { // AutoDeleter template class AutoDeleter { public: inline AutoDeleter() : fObject(NULL) { } inline AutoDeleter(C *object) : fObject(object) { } inline ~AutoDeleter() { fDelete(fObject); } inline void SetTo(C *object) { if (object != fObject) { fDelete(fObject); fObject = object; } } inline void Unset() { SetTo(NULL); } inline void Delete() { SetTo(NULL); } inline C *Get() const { return fObject; } inline C *Detach() { C *object = fObject; fObject = NULL; return object; } private: C *fObject; DeleteFunc fDelete; }; // ObjectDeleter template struct ObjectDelete { inline void operator()(C *object) { delete object; } }; template struct ObjectDeleter : AutoDeleter > { ObjectDeleter() : AutoDeleter >() {} ObjectDeleter(C *object) : AutoDeleter >(object) {} }; // ArrayDeleter template struct ArrayDelete { inline void operator()(C *array) { delete[] array; } }; template struct ArrayDeleter : AutoDeleter > { ArrayDeleter() : AutoDeleter >() {} ArrayDeleter(C *array) : AutoDeleter >(array) {} }; // MemoryDeleter struct MemoryDelete { inline void operator()(void *memory) { free(memory); } }; struct MemoryDeleter : AutoDeleter { MemoryDeleter() : AutoDeleter() {} MemoryDeleter(void *memory) : AutoDeleter(memory) {} }; } // namespace BPrivate using BPrivate::ObjectDeleter; using BPrivate::ArrayDeleter; using BPrivate::MemoryDeleter; #endif // _AUTO_DELETER_H