src/3rdparty/phonon/mmf/objecttree.h
changeset 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/phonon/mmf/objecttree.h	Tue Feb 02 00:43:10 2010 +0200
@@ -0,0 +1,115 @@
+/*  This file is part of the KDE project.
+
+Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+
+This library is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 2.1 or 3 of the License.
+
+This library 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 Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef OBJECTTREE_H
+#define OBJECTTREE_H
+
+#include <QObject>
+#include <QStack>
+
+QT_BEGIN_NAMESPACE
+
+namespace ObjectTree
+{
+
+/**
+ * Depth-first iterator for QObject tree
+ */
+class DepthFirstConstIterator
+{
+public:
+    DepthFirstConstIterator();
+    DepthFirstConstIterator(const QObject& root);
+
+    DepthFirstConstIterator& operator++();
+
+    inline bool operator==(const DepthFirstConstIterator& other) const
+    { return other.m_pointee == m_pointee; }
+
+    inline bool operator!=(const DepthFirstConstIterator& other) const
+    { return other.m_pointee != m_pointee; }
+
+    inline const QObject* operator->() const { return m_pointee; }
+    inline const QObject& operator*() const { return *m_pointee; }
+
+private:
+    void backtrack();
+
+private:
+    const QObject* m_pointee;
+    QStack<int> m_history;
+};
+
+/**
+ * Ancestor iterator for QObject tree
+ */
+class AncestorConstIterator
+{
+public:
+    AncestorConstIterator();
+    AncestorConstIterator(const QObject& root);
+
+    inline AncestorConstIterator& operator++()
+    { m_ancestors.pop(); return *this; }
+
+    inline bool operator==(const AncestorConstIterator& other) const
+    { return other.m_ancestors == m_ancestors; }
+
+    inline bool operator!=(const AncestorConstIterator& other) const
+    { return other.m_ancestors != m_ancestors; }
+
+    inline const QObject* operator->() const { return m_ancestors.top(); }
+    inline const QObject& operator*() const { return *m_ancestors.top(); }
+
+private:
+    QStack<const QObject*> m_ancestors;
+
+};
+
+/**
+ * Generic algorithm for visiting nodes in an object tree.  Nodes in the
+ * tree are visited in a const context, therefore they are not modified
+ * by this algorithm.
+ *
+ * Visitor must provide functions with the following signatures:
+ *
+ *      Called before visit begins
+ *          void visitPrepare()
+ *
+ *      Called on each node visited
+ *          void visitNode(const QObject& object)
+ *
+ *      Called when visit is complete
+ *          void visitComplete()
+ */
+template <class Iterator, class Visitor>
+void visit(Iterator begin, Iterator end, Visitor& visitor)
+{
+    visitor.visitPrepare();
+
+    for ( ; begin != end; ++begin)
+        visitor.visitNode(*begin);
+
+    visitor.visitComplete();
+}
+
+} // namespace ObjectTree
+
+QT_END_NAMESPACE
+
+#endif // OBJECTTREE_H