diff options
Diffstat (limited to 'source/blender/freestyle/intern/system/PointerSequence.h')
-rw-r--r-- | source/blender/freestyle/intern/system/PointerSequence.h | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/source/blender/freestyle/intern/system/PointerSequence.h b/source/blender/freestyle/intern/system/PointerSequence.h new file mode 100644 index 00000000000..c97f4516d00 --- /dev/null +++ b/source/blender/freestyle/intern/system/PointerSequence.h @@ -0,0 +1,96 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2010 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __FREESTYLE_POINTER_SEQUENCE_H__ +#define __FREESTYLE_POINTER_SEQUENCE_H__ + +/** \file blender/freestyle/intern/system/PointerSequence.h + * \ingroup freestyle + * \brief Simple RAII wrappers for std:: sequential containers + * \author 22/11/2010 + * \date 18/03/2003 + * + * PointerSequence + * + * Produces a wrapped version of a sequence type (std::vector, std::deque, std::list) that will take ownership of + * pointers tht it stores. Those pointers will be deleted in its destructor. + * + * Because the contained pointers are wholly owned by the sequence, you cannot make a copy of the sequence. + * Making a copy would result in a double free. + * + * This is a no-frills class that provides no additional facilities. The user is responsible for managing any + * pointers that are removed from the list, and for making sure that any pointers contained in the class are not + * deleted elsewhere. Because this class does no reference counting, the user must also make sure that any pointer + * appears only once in the sequence. + * + * If more sophisticated facilities are needed, use tr1::shared_ptr or boost::shared_ptr. + * This class is only intended to allow one to eke by in projects where tr1 or boost are not available. + * + * Usage: The template takes two parameters, the standard container, and the class held in the container. This is a + * limitation of C++ templates, where T::iterator is not a type when T is a template parameter. If anyone knows a way + * around this limitation, then the second parameter can be eliminated. + * + * Example: + * PointerSequence<vector<Widget*>, Widget*> v; + * v.push_back(new Widget); + * cout << v[0] << endl; // operator[] is provided by std::vector, not by PointerSequence + * v.destroy(); // Deletes all pointers in sequence and sets them to NULL. + * + * The idiom for removing a pointer from a sequence is: + * Widget* w = v[3]; + * v.erase(v.begin() + 3); // or v[3] = 0; + * The user is now responsible for disposing of w properly. + */ + +#include <algorithm> + +template <typename C, typename T> +class PointerSequence : public C +{ + PointerSequence (PointerSequence& other); + PointerSequence& operator=(PointerSequence& other); + + static void destroyer(T t) + { + delete t; + } + +public: + PointerSequence () {}; + + ~PointerSequence () + { + destroy(); + } + + void destroy () + { + for_each(this->begin(), this->end(), destroyer); + } +}; + +#endif // __FREESTYLE_POINTER_SEQUENCE_H__ |