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:
@@ -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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user