/* 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 . */ #ifndef OBJECTTREE_H #define OBJECTTREE_H #include "objectdump_global.h" #include #include QT_BEGIN_NAMESPACE namespace ObjectTree { /** * Depth-first iterator for QObject tree */ class OBJECTDUMP_EXPORT 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 m_history; }; /** * Ancestor iterator for QObject tree */ class OBJECTDUMP_EXPORT 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 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 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