src/3rdparty/phonon/mmf/objecttree.h
changeset 3 41300fa6a67c
equal deleted inserted replaced
2:56cd8111b7f7 3:41300fa6a67c
       
     1 /*  This file is part of the KDE project.
       
     2 
       
     3 Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 
       
     5 This library is free software: you can redistribute it and/or modify
       
     6 it under the terms of the GNU Lesser General Public License as published by
       
     7 the Free Software Foundation, either version 2.1 or 3 of the License.
       
     8 
       
     9 This library is distributed in the hope that it will be useful,
       
    10 but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    12 GNU Lesser General Public License for more details.
       
    13 
       
    14 You should have received a copy of the GNU Lesser General Public License
       
    15 along with this library.  If not, see <http://www.gnu.org/licenses/>.
       
    16 
       
    17 */
       
    18 
       
    19 #ifndef OBJECTTREE_H
       
    20 #define OBJECTTREE_H
       
    21 
       
    22 #include <QObject>
       
    23 #include <QStack>
       
    24 
       
    25 QT_BEGIN_NAMESPACE
       
    26 
       
    27 namespace ObjectTree
       
    28 {
       
    29 
       
    30 /**
       
    31  * Depth-first iterator for QObject tree
       
    32  */
       
    33 class DepthFirstConstIterator
       
    34 {
       
    35 public:
       
    36     DepthFirstConstIterator();
       
    37     DepthFirstConstIterator(const QObject& root);
       
    38 
       
    39     DepthFirstConstIterator& operator++();
       
    40 
       
    41     inline bool operator==(const DepthFirstConstIterator& other) const
       
    42     { return other.m_pointee == m_pointee; }
       
    43 
       
    44     inline bool operator!=(const DepthFirstConstIterator& other) const
       
    45     { return other.m_pointee != m_pointee; }
       
    46 
       
    47     inline const QObject* operator->() const { return m_pointee; }
       
    48     inline const QObject& operator*() const { return *m_pointee; }
       
    49 
       
    50 private:
       
    51     void backtrack();
       
    52 
       
    53 private:
       
    54     const QObject* m_pointee;
       
    55     QStack<int> m_history;
       
    56 };
       
    57 
       
    58 /**
       
    59  * Ancestor iterator for QObject tree
       
    60  */
       
    61 class AncestorConstIterator
       
    62 {
       
    63 public:
       
    64     AncestorConstIterator();
       
    65     AncestorConstIterator(const QObject& root);
       
    66 
       
    67     inline AncestorConstIterator& operator++()
       
    68     { m_ancestors.pop(); return *this; }
       
    69 
       
    70     inline bool operator==(const AncestorConstIterator& other) const
       
    71     { return other.m_ancestors == m_ancestors; }
       
    72 
       
    73     inline bool operator!=(const AncestorConstIterator& other) const
       
    74     { return other.m_ancestors != m_ancestors; }
       
    75 
       
    76     inline const QObject* operator->() const { return m_ancestors.top(); }
       
    77     inline const QObject& operator*() const { return *m_ancestors.top(); }
       
    78 
       
    79 private:
       
    80     QStack<const QObject*> m_ancestors;
       
    81 
       
    82 };
       
    83 
       
    84 /**
       
    85  * Generic algorithm for visiting nodes in an object tree.  Nodes in the
       
    86  * tree are visited in a const context, therefore they are not modified
       
    87  * by this algorithm.
       
    88  *
       
    89  * Visitor must provide functions with the following signatures:
       
    90  *
       
    91  *      Called before visit begins
       
    92  *          void visitPrepare()
       
    93  *
       
    94  *      Called on each node visited
       
    95  *          void visitNode(const QObject& object)
       
    96  *
       
    97  *      Called when visit is complete
       
    98  *          void visitComplete()
       
    99  */
       
   100 template <class Iterator, class Visitor>
       
   101 void visit(Iterator begin, Iterator end, Visitor& visitor)
       
   102 {
       
   103     visitor.visitPrepare();
       
   104 
       
   105     for ( ; begin != end; ++begin)
       
   106         visitor.visitNode(*begin);
       
   107 
       
   108     visitor.visitComplete();
       
   109 }
       
   110 
       
   111 } // namespace ObjectTree
       
   112 
       
   113 QT_END_NAMESPACE
       
   114 
       
   115 #endif // OBJECTTREE_H