From 0d988526bc99654160487c88834d921e316b9249 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 7 Jul 2011 11:39:49 +0200 Subject: [PATCH] GenericIndexIterator: Add node change helpers Add NodeChangeBegin()/NodeChangeEnd() methods that can be used by the index when the respective node attribute has changed. They make sure that the iterator doesn't move with the node, should it be inserted into the index at a different position. --- .../kernel/file_systems/packagefs/IndexImpl.h | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h index 7bd84b4fe7..9714c16c2e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h +++ b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h @@ -46,6 +46,9 @@ public: bool SetTo(Index* index, const Value& name, bool ignoreValue = false); + inline void NodeChangeBegin(Node* node); + inline void NodeChangeEnd(Node* node); + virtual void NodeRemoved(Node* node); protected: @@ -160,6 +163,47 @@ GenericIndexIterator::SetTo(Index* index, const Value& value, } +/*! Moves the iterator temporarily off the current node. + Called when the node the iterator currently points to has been modified and + the index is about to remove it from and reinsert it into the tree. After + having done that NodeChangeEnd() must be called. +*/ +template +void +GenericIndexIterator::NodeChangeBegin(Node* node) +{ + fNextTreeNode = Policy::GetNodeTree(fIndex)->Previous(fNextTreeNode); +} + + +/*! Brackets a NodeChangeBegin() call. +*/ +template +void +GenericIndexIterator::NodeChangeEnd(Node* node) +{ + if (fNextTreeNode != NULL) { + fNextTreeNode = Policy::GetNodeTree(fIndex)->Next(fNextTreeNode); + } else { + typename NodeTree::Iterator iterator; + Policy::GetNodeTree(fIndex)->GetIterator(&iterator); + fNextTreeNode = iterator.CurrentNode(); + } + + // If the node is no longer the one we originally pointed to, re-register + // the node listener. + if (fNextTreeNode == NULL) { + fIndex->GetVolume()->RemoveNodeListener(this); + } else { + Node* newNode = _ToNode(); + if (newNode != node) { + fIndex->GetVolume()->RemoveNodeListener(this); + fIndex->GetVolume()->AddNodeListener(this, newNode); + } + } +} + + template void GenericIndexIterator::NodeRemoved(Node* node)