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:
parent
747578cd93
commit
32ad4ceefb
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user