Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/freestyle/intern/system/PointerSequence.h')
-rw-r--r--source/blender/freestyle/intern/system/PointerSequence.h97
1 files changed, 97 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..72c6aa458fd
--- /dev/null
+++ b/source/blender/freestyle/intern/system/PointerSequence.h
@@ -0,0 +1,97 @@
+//
+// Filename : PointerSequence.h
+// Author(s) : Alexander Beels
+// Purpose : Class to define a cell grid surrounding
+// the projected image of a scene
+// Date of creation : 22/11/2010
+//
+///////////////////////////////////////////////////////////////////////////////
+
+
+//
+// Copyright (C) : Please refer to the COPYRIGHT file distributed
+// with this source distribution.
+//
+// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+//
+// Simple RAII wrappers for std:: sequential containers
+//
+///////////////////////////////////////////////////////////////////////////////
+
+//
+// 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.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef POINTERSEQUENCE_H
+# define POINTERSEQUENCE_H
+
+#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 // POINTERSEQUENCE_H
+