Simplify [Abstract]IndexIterator interface

* Remove Current() and Previous() and add a HasNext() instead.
* Reimplement NameIndexIterator. It directly works with tree nodes
  instead of using an iterator, now.
This commit is contained in:
Ingo Weinhold
2011-07-17 16:55:04 +02:00
parent 747578cd93
commit 32ad4ceefb
4 changed files with 53 additions and 83 deletions
@@ -117,41 +117,24 @@ IndexIterator::~IndexIterator()
} }
Node* bool
IndexIterator::Current() IndexIterator::HasNext() const
{ {
return fIterator != NULL ? fIterator->Current() : NULL; return fIterator != NULL && fIterator->HasNext();
}
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;
} }
Node* Node*
IndexIterator::Next() IndexIterator::Next()
{ {
return fIterator != NULL ? fIterator->Next() : NULL; return fIterator != NULL ? fIterator->Next(NULL, NULL) : NULL;
} }
Node* Node*
IndexIterator::Next(void* buffer, size_t* _keyLength) IndexIterator::Next(void* buffer, size_t* _keyLength)
{ {
Node* node = NULL; return fIterator != NULL ? fIterator->Next(buffer, _keyLength) : NULL;
if (fIterator != NULL && fIterator->Next())
node = Current(buffer, _keyLength);
return node;
} }
@@ -73,9 +73,7 @@ public:
IndexIterator(Index* index); IndexIterator(Index* index);
~IndexIterator(); ~IndexIterator();
Node* Current(); bool HasNext() const;
Node* Current(void* buffer, size_t* _keyLength);
Node* Previous();
Node* Next(); Node* Next();
Node* Next(void* buffer, size_t* _keyLength); Node* Next(void* buffer, size_t* _keyLength);
@@ -15,10 +15,8 @@ public:
AbstractIndexIterator(); AbstractIndexIterator();
virtual ~AbstractIndexIterator(); virtual ~AbstractIndexIterator();
virtual Node* Current() = 0; virtual bool HasNext() const = 0;
virtual Node* Current(void* buffer, size_t* _keyLength) = 0; virtual Node* Next(void* buffer, size_t* _keyLength) = 0;
virtual Node* Previous() = 0;
virtual Node* Next() = 0;
virtual status_t Suspend(); virtual status_t Suspend();
virtual status_t Resume(); virtual status_t Resume();
@@ -91,10 +91,8 @@ public:
NameIndexIterator(); NameIndexIterator();
virtual ~NameIndexIterator(); virtual ~NameIndexIterator();
virtual Node* Current(); virtual bool HasNext() const;
virtual Node* Current(void* buffer, size_t* _keyLength); virtual Node* Next(void* buffer, size_t* _keyLength);
virtual Node* Previous();
virtual Node* Next();
virtual status_t Suspend(); virtual status_t Suspend();
virtual status_t Resume(); virtual status_t Resume();
@@ -107,13 +105,15 @@ public:
private: private:
friend class NameIndex; friend class NameIndex;
typedef AbstractIndexIterator BaseClass; typedef NameIndex::EntryTree EntryTree;
private:
inline Node* _ToNode() const;
private: private:
NameIndex* fIndex; NameIndex* fIndex;
NameIndex::EntryTree::Iterator fIterator; EntryTree::Node* fNextTreeNode;
bool fSuspended; bool fSuspended;
bool fIsNext;
}; };
@@ -255,9 +255,8 @@ NameIndexIterator::NameIndexIterator()
: :
AbstractIndexIterator(), AbstractIndexIterator(),
fIndex(NULL), fIndex(NULL),
fIterator(), fNextTreeNode(NULL),
fSuspended(false), fSuspended(false)
fIsNext(false)
{ {
} }
@@ -268,60 +267,41 @@ NameIndexIterator::~NameIndexIterator()
} }
Node* bool
NameIndexIterator::Current() NameIndexIterator::HasNext() const
{ {
return fIndex != NULL return fNextTreeNode != NULL;
&& fIterator.Current() != NULL ? *fIterator.Current() : NULL;
} }
Node* 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) { if (entry != NULL) {
strlcpy((char*)buffer, entry->Name(), kMaxIndexKeyLength); if (buffer != NULL) {
*_keyLength = strlen(entry->Name()); strlcpy((char*)buffer, entry->Name(), kMaxIndexKeyLength);
*_keyLength = strlen(entry->Name());
}
fNextTreeNode = fIndex->fEntries->Next(fNextTreeNode);
} }
return entry; 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 status_t
NameIndexIterator::Suspend() NameIndexIterator::Suspend()
{ {
if (fSuspended) if (fSuspended)
return B_BAD_VALUE; return B_BAD_VALUE;
if (fIterator.Current() != NULL) if (fNextTreeNode != NULL)
fIndex->GetVolume()->AddNodeListener(this, *fIterator.Current()); fIndex->GetVolume()->AddNodeListener(this, _ToNode());
fSuspended = true; fSuspended = true;
return B_OK; return B_OK;
@@ -334,7 +314,7 @@ NameIndexIterator::Resume()
if (!fSuspended) if (!fSuspended)
return B_BAD_VALUE; return B_BAD_VALUE;
if (fIterator.Current() != NULL) if (fNextTreeNode != NULL)
fIndex->GetVolume()->RemoveNodeListener(this); fIndex->GetVolume()->RemoveNodeListener(this);
fSuspended = false; fSuspended = false;
@@ -349,15 +329,19 @@ NameIndexIterator::SetTo(NameIndex* index, const char* name, bool ignoreValue)
fIndex = index; fIndex = index;
fSuspended = false; fSuspended = false;
fIsNext = false; fNextTreeNode = NULL;
if (fIndex == NULL) if (fIndex == NULL)
return false; return false;
if (ignoreValue) { EntryTree::Iterator iterator;
fIndex->fEntries->GetIterator(&fIterator); if (ignoreValue)
return fIterator.Current() != NULL; fIndex->fEntries->GetIterator(&iterator);
} else if (fIndex->fEntries->FindFirst(name, &iterator) == NULL)
return fIndex->fEntries->FindFirst(name, &fIterator); return false;
fNextTreeNode = iterator.CurrentNode();
return fNextTreeNode != NULL;
} }
@@ -365,6 +349,13 @@ void
NameIndexIterator::NodeRemoved(Node* node) NameIndexIterator::NodeRemoved(Node* node)
{ {
Resume(); Resume();
fIsNext = Next() != NULL; Next(NULL, NULL);
Suspend(); Suspend();
} }
Node*
NameIndexIterator::_ToNode() const
{
return EntryTree::NodeStrategy().GetValue(fNextTreeNode);
}