diff --git a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h index 9714c16c2e..b55b63fefc 100644 --- a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h +++ b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h @@ -31,6 +31,7 @@ public: typedef typename Policy::Index Index; typedef typename Policy::Value Value; typedef typename Policy::NodeTree NodeTree; + typedef typename Policy::TreePolicy TreePolicy; typedef typename NodeTree::Node TreeNode; public: @@ -51,9 +52,6 @@ public: virtual void NodeRemoved(Node* node); -protected: - inline Node* _ToNode() const; - protected: Index* fIndex; TreeNode* fNextTreeNode; @@ -75,7 +73,7 @@ GenericIndexIterator::GenericIndexIterator() template GenericIndexIterator::~GenericIndexIterator() { - SetTo(NULL, NULL); + SetTo(NULL, Value()); } @@ -94,15 +92,14 @@ GenericIndexIterator::Next(void* buffer, size_t* _keyLength) if (fSuspended || fNextTreeNode == NULL) return NULL; - Node* node = _ToNode(); - if (node != NULL) { - if (buffer != NULL) - Policy::GetNodeValue(node, buffer, _keyLength); - fNextTreeNode = Policy::GetNodeTree(fIndex)->Next(fNextTreeNode); - } + if (buffer != NULL) + TreePolicy::GetTreeNodeValue(fNextTreeNode, buffer, _keyLength); - return node; + TreeNode* treeNode = fNextTreeNode; + fNextTreeNode = Policy::GetNodeTree(fIndex)->Next(fNextTreeNode); + + return TreePolicy::GetNode(treeNode); } @@ -113,8 +110,10 @@ GenericIndexIterator::Suspend() if (fSuspended) return B_BAD_VALUE; - if (fNextTreeNode != NULL) - fIndex->GetVolume()->AddNodeListener(this, _ToNode()); + if (fNextTreeNode != NULL) { + fIndex->GetVolume()->AddNodeListener(this, + TreePolicy::GetNode(fNextTreeNode)); + } fSuspended = true; return B_OK; @@ -150,15 +149,11 @@ GenericIndexIterator::SetTo(Index* index, const Value& value, if (fIndex == NULL) return false; - typename NodeTree::Iterator iterator; - if (ignoreValue) { - Policy::GetNodeTree(fIndex)->GetIterator(&iterator); - } else if (Policy::GetNodeTree(fIndex)->FindFirstClosest(value, false, - &iterator) == NULL) { - return false; - } + if (ignoreValue) + fNextTreeNode = TreePolicy::GetFirstTreeNode(fIndex); + else + fNextTreeNode = TreePolicy::FindClosestTreeNode(fIndex, value); - fNextTreeNode = iterator.CurrentNode(); return fNextTreeNode != NULL; } @@ -182,20 +177,17 @@ template void GenericIndexIterator::NodeChangeEnd(Node* node) { - if (fNextTreeNode != NULL) { + if (fNextTreeNode != NULL) fNextTreeNode = Policy::GetNodeTree(fIndex)->Next(fNextTreeNode); - } else { - typename NodeTree::Iterator iterator; - Policy::GetNodeTree(fIndex)->GetIterator(&iterator); - fNextTreeNode = iterator.CurrentNode(); - } + else + fNextTreeNode = TreePolicy::GetFirstTreeNode(fIndex); // 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(); + Node* newNode = TreePolicy::GetNode(fNextTreeNode); if (newNode != node) { fIndex->GetVolume()->RemoveNodeListener(this); fIndex->GetVolume()->AddNodeListener(this, newNode); @@ -215,13 +207,42 @@ GenericIndexIterator::NodeRemoved(Node* node) template -Node* -GenericIndexIterator::_ToNode() const -{ -// return NodeTree::NodeStrategy().GetValue(fNextTreeNode); - typename NodeTree::NodeStrategy strategy; - return strategy.GetValue(fNextTreeNode); -} +struct GenericIndexIteratorTreePolicy { + typedef typename Policy::Index Index; + typedef typename Policy::Value Value; + typedef typename Policy::NodeTree NodeTree; + typedef typename NodeTree::Node TreeNode; + + static Node* GetNode(TreeNode* treeNode) + { + typename Policy::NodeTree::NodeStrategy strategy; + return strategy.GetValue(treeNode); + } + + static TreeNode* GetFirstTreeNode(Index* index) + { + typename NodeTree::Iterator iterator; + Policy::GetNodeTree(index)->GetIterator(&iterator); + return iterator.CurrentNode(); + } + + static TreeNode* FindClosestTreeNode(Index* index, const Value& value) + { + typename NodeTree::Iterator iterator; + if (Policy::GetNodeTree(index)->FindFirstClosest(value, false, + &iterator) == NULL) { + return NULL; + } + + return iterator.CurrentNode(); + } + + static void GetTreeNodeValue(TreeNode* treeNode, void* buffer, + size_t* _keyLength) + { + Policy::GetNodeValue(GetNode(treeNode), buffer, _keyLength); + } +}; #endif // INDEX_IMPL_H diff --git a/src/add-ons/kernel/file_systems/packagefs/LastModifiedIndex.cpp b/src/add-ons/kernel/file_systems/packagefs/LastModifiedIndex.cpp index b7d637c1f8..e46b587438 100644 --- a/src/add-ons/kernel/file_systems/packagefs/LastModifiedIndex.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/LastModifiedIndex.cpp @@ -105,9 +105,10 @@ class LastModifiedIndex::IteratorList : public SinglyLinkedList {}; struct LastModifiedIndex::IteratorPolicy { - typedef LastModifiedIndex Index; - typedef time_t Value; - typedef LastModifiedIndex::NodeTree NodeTree; + typedef LastModifiedIndex Index; + typedef time_t Value; + typedef LastModifiedIndex::NodeTree NodeTree; + typedef GenericIndexIteratorTreePolicy TreePolicy; static NodeTree* GetNodeTree(Index* index) { diff --git a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp index 9726b05a90..25d3178234 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp @@ -85,9 +85,10 @@ class NameIndex::EntryTree : public _EntryTree { struct NameIndex::IteratorPolicy { - typedef NameIndex Index; - typedef const char* Value; - typedef NameIndex::EntryTree NodeTree; + typedef NameIndex Index; + typedef const char* Value; + typedef NameIndex::EntryTree NodeTree; + typedef GenericIndexIteratorTreePolicy TreePolicy; static NodeTree* GetNodeTree(Index* index) { diff --git a/src/add-ons/kernel/file_systems/packagefs/SizeIndex.cpp b/src/add-ons/kernel/file_systems/packagefs/SizeIndex.cpp index 18022286fd..d11224691b 100644 --- a/src/add-ons/kernel/file_systems/packagefs/SizeIndex.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/SizeIndex.cpp @@ -104,9 +104,10 @@ class SizeIndex::IteratorList : public SinglyLinkedList {}; struct SizeIndex::IteratorPolicy { - typedef SizeIndex Index; - typedef off_t Value; - typedef SizeIndex::NodeTree NodeTree; + typedef SizeIndex Index; + typedef off_t Value; + typedef SizeIndex::NodeTree NodeTree; + typedef GenericIndexIteratorTreePolicy TreePolicy; static NodeTree* GetNodeTree(Index* index) {