diff --git a/src/add-ons/kernel/file_systems/packagefs/Index.cpp b/src/add-ons/kernel/file_systems/packagefs/Index.cpp index 88cc9fcb2b..b0ccfb747e 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Index.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Index.cpp @@ -117,41 +117,24 @@ IndexIterator::~IndexIterator() } -Node* -IndexIterator::Current() +bool +IndexIterator::HasNext() const { - return fIterator != NULL ? fIterator->Current() : NULL; -} - - -Node* -IndexIterator::Current(void* buffer, size_t* _keyLength) -{ - return fIterator != NULL ? fIterator->Current(buffer, _keyLength) : NULL; -} - - -Node* -IndexIterator::Previous() -{ - return fIterator != NULL ? fIterator->Previous() : NULL; + return fIterator != NULL && fIterator->HasNext(); } Node* IndexIterator::Next() { - return fIterator != NULL ? fIterator->Next() : NULL; + return fIterator != NULL ? fIterator->Next(NULL, NULL) : NULL; } Node* IndexIterator::Next(void* buffer, size_t* _keyLength) { - Node* node = NULL; - if (fIterator != NULL && fIterator->Next()) - node = Current(buffer, _keyLength); - return node; + return fIterator != NULL ? fIterator->Next(buffer, _keyLength) : NULL; } diff --git a/src/add-ons/kernel/file_systems/packagefs/Index.h b/src/add-ons/kernel/file_systems/packagefs/Index.h index cd3c69315e..204d95b372 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Index.h +++ b/src/add-ons/kernel/file_systems/packagefs/Index.h @@ -73,9 +73,7 @@ public: IndexIterator(Index* index); ~IndexIterator(); - Node* Current(); - Node* Current(void* buffer, size_t* _keyLength); - Node* Previous(); + bool HasNext() const; Node* Next(); Node* Next(void* buffer, size_t* _keyLength); diff --git a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h index 3dae8e6277..1805d9fb86 100644 --- a/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h +++ b/src/add-ons/kernel/file_systems/packagefs/IndexImpl.h @@ -15,10 +15,8 @@ public: AbstractIndexIterator(); virtual ~AbstractIndexIterator(); - virtual Node* Current() = 0; - virtual Node* Current(void* buffer, size_t* _keyLength) = 0; - virtual Node* Previous() = 0; - virtual Node* Next() = 0; + virtual bool HasNext() const = 0; + virtual Node* Next(void* buffer, size_t* _keyLength) = 0; virtual status_t Suspend(); virtual status_t Resume(); diff --git a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp index d2b69c5774..ebc8a767ec 100644 --- a/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/NameIndex.cpp @@ -91,10 +91,8 @@ public: NameIndexIterator(); virtual ~NameIndexIterator(); - virtual Node* Current(); - virtual Node* Current(void* buffer, size_t* _keyLength); - virtual Node* Previous(); - virtual Node* Next(); + virtual bool HasNext() const; + virtual Node* Next(void* buffer, size_t* _keyLength); virtual status_t Suspend(); virtual status_t Resume(); @@ -107,13 +105,15 @@ public: private: friend class NameIndex; - typedef AbstractIndexIterator BaseClass; + typedef NameIndex::EntryTree EntryTree; + +private: + inline Node* _ToNode() const; private: NameIndex* fIndex; - NameIndex::EntryTree::Iterator fIterator; + EntryTree::Node* fNextTreeNode; bool fSuspended; - bool fIsNext; }; @@ -255,9 +255,8 @@ NameIndexIterator::NameIndexIterator() : AbstractIndexIterator(), fIndex(NULL), - fIterator(), - fSuspended(false), - fIsNext(false) + fNextTreeNode(NULL), + fSuspended(false) { } @@ -268,60 +267,41 @@ NameIndexIterator::~NameIndexIterator() } -Node* -NameIndexIterator::Current() +bool +NameIndexIterator::HasNext() const { - return fIndex != NULL - && fIterator.Current() != NULL ? *fIterator.Current() : NULL; + return fNextTreeNode != NULL; } Node* -NameIndexIterator::Current(void* buffer, size_t* _keyLength) +NameIndexIterator::Next(void* buffer, size_t* _keyLength) { - Node* entry = Current(); + if (fSuspended || fNextTreeNode == NULL) + return NULL; + + Node* entry = _ToNode(); if (entry != NULL) { - strlcpy((char*)buffer, entry->Name(), kMaxIndexKeyLength); - *_keyLength = strlen(entry->Name()); + if (buffer != NULL) { + strlcpy((char*)buffer, entry->Name(), kMaxIndexKeyLength); + *_keyLength = strlen(entry->Name()); + } + + fNextTreeNode = fIndex->fEntries->Next(fNextTreeNode); } + return entry; } -Node* -NameIndexIterator::Previous() -{ - if (fSuspended) - return NULL; - if (!(fIterator.Current() != NULL && fIsNext)) - fIterator.Previous(); - fIsNext = false; - return fIndex != NULL - && fIterator.Current() != NULL ? *fIterator.Current() : NULL; -} - - -Node* -NameIndexIterator::Next() -{ - if (fSuspended) - return NULL; - if (!(fIterator.Current() != NULL && fIsNext)) - fIterator.Next(); - fIsNext = false; - return fIndex != NULL - && fIterator.Current() != NULL ? *fIterator.Current() : NULL; -} - - status_t NameIndexIterator::Suspend() { if (fSuspended) return B_BAD_VALUE; - if (fIterator.Current() != NULL) - fIndex->GetVolume()->AddNodeListener(this, *fIterator.Current()); + if (fNextTreeNode != NULL) + fIndex->GetVolume()->AddNodeListener(this, _ToNode()); fSuspended = true; return B_OK; @@ -334,7 +314,7 @@ NameIndexIterator::Resume() if (!fSuspended) return B_BAD_VALUE; - if (fIterator.Current() != NULL) + if (fNextTreeNode != NULL) fIndex->GetVolume()->RemoveNodeListener(this); fSuspended = false; @@ -349,15 +329,19 @@ NameIndexIterator::SetTo(NameIndex* index, const char* name, bool ignoreValue) fIndex = index; fSuspended = false; - fIsNext = false; + fNextTreeNode = NULL; + if (fIndex == NULL) return false; - if (ignoreValue) { - fIndex->fEntries->GetIterator(&fIterator); - return fIterator.Current() != NULL; - } - return fIndex->fEntries->FindFirst(name, &fIterator); + EntryTree::Iterator iterator; + if (ignoreValue) + fIndex->fEntries->GetIterator(&iterator); + else if (fIndex->fEntries->FindFirst(name, &iterator) == NULL) + return false; + + fNextTreeNode = iterator.CurrentNode(); + return fNextTreeNode != NULL; } @@ -365,6 +349,13 @@ void NameIndexIterator::NodeRemoved(Node* node) { Resume(); - fIsNext = Next() != NULL; + Next(NULL, NULL); Suspend(); } + + +Node* +NameIndexIterator::_ToNode() const +{ + return EntryTree::NodeStrategy().GetValue(fNextTreeNode); +}