1
0
Fork 0
mirror of https://github.com/KingDuckZ/dindexer.git synced 2025-02-19 12:04:54 +00:00

Fix unit test

This commit is contained in:
King_DuckZ 2016-02-10 09:19:54 +01:00
parent c4a68356f6
commit 6362f0f002
3 changed files with 19 additions and 49 deletions

View file

@ -50,21 +50,9 @@ namespace mchlib {
reference dereference ( void ) const; reference dereference ( void ) const;
bool is_end ( void ) const; bool is_end ( void ) const;
//There are three iterators and an offset because the first item
//could very well be detached from the rest of its siblings. For
//example "a", "b", "a/c", "a/d": when iterating on that sequence the
//expected outcome is "a", "a/c", "a/d". So in order to be able to
//iterate back and forward we need a "first" iterator so we can
//always get back to it whene we are decrementing an iterator to
//"a/c" for example. current is just the current iterator, and the
//offset is needed so we can tell if at any moment we are at
//first+offset and skip back to first instead of decrementing
//current. end is just there so we know when to stop advancing.
VecIterator m_first;
VecIterator m_current; VecIterator m_current;
VecIterator m_end; VecIterator m_end;
std::unique_ptr<PathName> m_base_path; std::unique_ptr<PathName> m_base_path;
std::vector<FileRecordData>::difference_type m_second_offs;
}; };
}; };

View file

@ -45,62 +45,42 @@ namespace mchlib {
namespace implem { namespace implem {
DirIterator::DirIterator (DirIterator&& parOther) : DirIterator::DirIterator (DirIterator&& parOther) :
m_first(std::move(parOther.m_first)),
m_current(std::move(parOther.m_current)), m_current(std::move(parOther.m_current)),
m_end(std::move(parOther.m_end)), m_end(std::move(parOther.m_end)),
m_base_path(std::move(parOther.m_base_path)), m_base_path(std::move(parOther.m_base_path))
m_second_offs(parOther.m_second_offs)
{ {
} }
DirIterator::DirIterator (VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath) : DirIterator::DirIterator (VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath) :
m_first(parBegin),
m_current(parBegin), m_current(parBegin),
m_end(parEnd), m_end(parEnd),
m_base_path(std::move(parBasePath)), m_base_path(std::move(parBasePath))
m_second_offs(0)
{ {
assert(m_current == m_end or m_base_path->atom_count() == m_current->level); assert(m_current == m_end or m_base_path->atom_count() == m_current->level);
//Look for the point where the children of this entry starts //Look for the point where the children of this entry starts
auto search_second = parBegin;
while ( while (
search_second != m_end and ( m_current != m_end and (
search_second->level == m_base_path->atom_count() or m_current->level == m_base_path->atom_count() or
*m_base_path != PathName(search_second->abs_path).pop_right() *m_base_path != PathName(m_current->abs_path).pop_right()
)) { )) {
assert(search_second->level == m_base_path->atom_count()); //assert(m_current->level == m_base_path->atom_count());
++search_second; ++m_current;
} }
m_second_offs = std::distance(parBegin, search_second);
} }
DirIterator::~DirIterator() noexcept { DirIterator::~DirIterator() noexcept {
} }
void DirIterator::increment() { void DirIterator::increment() {
if (m_current == m_first and m_second_offs > 1) { ++m_current;
m_current = m_first + m_second_offs;
}
else {
++m_current;
}
} }
void DirIterator::decrement() { void DirIterator::decrement() {
if (m_current == m_first + m_second_offs) { --m_current;
m_current = m_first;
}
else {
--m_current;
}
} }
void DirIterator::advance (std::size_t parAdvance) { void DirIterator::advance (std::size_t parAdvance) {
if (m_current == m_first and parAdvance > 0) {
--parAdvance;
m_current = m_first + m_second_offs;
}
m_current += parAdvance; m_current += parAdvance;
} }

View file

@ -912,15 +912,17 @@ TEST(machinery, diriterator) {
SetListing lst(std::move(test_data)); SetListing lst(std::move(test_data));
auto i = lst.begin(); auto i = lst.begin();
EXPECT_EQ("", i->abs_path);
++i;
EXPECT_EQ("BestAndBest", i->abs_path); EXPECT_EQ("BestAndBest", i->abs_path);
auto view = SetListingView(i); {
auto i2 = view.cbegin(); auto view = SetListingView(i);
EXPECT_EQ("BestAndBest/CD1", i2->abs_path); auto i2 = view.cbegin();
EXPECT_EQ("BestAndBest/CD1", i2->abs_path);
++i2; ++i2;
EXPECT_EQ("BestAndBest/CD2", i2->abs_path); EXPECT_EQ("BestAndBest/CD2", i2->abs_path);
}
++i;
EXPECT_EQ("City Hunter", i->abs_path);
} }