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

Add level offset.

The level in the FileRecordData is 0 at the base of the
directory being scanned. However PathName::atom_count() can be
more than that. For example scanning /mnt/cdrom will have
level 0 at the mount point, but atom_count() is 2. So it's
necessary to pass in this offset. This way the code can take
that into account and compute stuff correctly.
This commit is contained in:
King_DuckZ 2016-02-16 20:18:10 +00:00
parent 5908828390
commit 5fbad40fda
3 changed files with 34 additions and 23 deletions

View file

@ -60,7 +60,7 @@ namespace mchlib {
DirIterator ( DirIterator<Const>&& parOther );
template <bool OtherConst>
DirIterator ( DirIterator<OtherConst>&& parOther, typename std::enable_if<std::is_convertible<typename DirIterator<OtherConst>::VecIterator, VecIterator>::value, enabler>::type = enabler() );
DirIterator ( VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath );
DirIterator ( VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath, std::size_t parLevelOffset );
~DirIterator ( void ) noexcept;
private:
@ -75,6 +75,7 @@ namespace mchlib {
VecIterator m_current;
VecIterator m_end;
std::unique_ptr<PathName> m_base_path;
std::size_t m_level_offset;
};
};
@ -87,7 +88,7 @@ namespace mchlib {
typedef typename implem::DirIterator<Const>::VecIterator list_iterator;
explicit SetListingView ( const implem::DirIterator<Const>& parIter );
SetListingView ( list_iterator parBeg, list_iterator parEnd );
SetListingView ( list_iterator parBeg, list_iterator parEnd, std::size_t parLevelOffset );
SetListingView ( SetListingView&& ) = default;
~SetListingView ( void ) noexcept = default;
@ -103,6 +104,7 @@ namespace mchlib {
private:
list_iterator m_begin;
list_iterator m_end;
std::size_t m_level_offset;
};
class SetListing {

View file

@ -368,7 +368,7 @@ namespace mchlib {
#endif
#if !defined(USE_LEGACY_HASH_DIR)
SetListingView<false> recordlist(m_local_data->paths.begin(), m_local_data->paths.end());
SetListingView<false> recordlist(m_local_data->paths.begin(), m_local_data->paths.end(), base_path.atom_count());
#endif
#if defined(WITH_PROGRESS_FEEDBACK)
m_local_data->done_count = 0;

View file

@ -49,7 +49,8 @@ namespace mchlib {
DirIterator<Const>::DirIterator (DirIterator<Const>&& parOther) :
m_current(std::move(parOther.m_current)),
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_level_offset(parOther.m_level_offset)
{
}
@ -58,23 +59,26 @@ namespace mchlib {
DirIterator<Const>::DirIterator (DirIterator<OtherConst>&& parOther, typename std::enable_if<std::is_convertible<typename DirIterator<OtherConst>::VecIterator, VecIterator>::value, enabler>::type) :
m_current(parOther.m_current),
m_end(parOther.m_end),
m_base_path(std::move(parOther.m_base_path))
m_base_path(std::move(parOther.m_base_path)),
m_level_offset(parOther.m_level_offset)
{
}
template <bool Const>
DirIterator<Const>::DirIterator (VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath) :
DirIterator<Const>::DirIterator (VecIterator parBegin, VecIterator parEnd, std::unique_ptr<PathName>&& parBasePath, std::size_t parLevelOffset) :
m_current(parBegin),
m_end(parEnd),
m_base_path(std::move(parBasePath))
m_base_path(std::move(parBasePath)),
m_level_offset(parLevelOffset)
{
assert(m_base_path or m_current == m_end);
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() == PathName(m_current->abs_path).atom_count());
assert(m_current == m_end or m_base_path->atom_count() == m_current->level + m_level_offset);
//Look for the point where the children of this entry starts
while (
m_current != m_end and (
m_current->level == m_base_path->atom_count() or
m_current->level + m_level_offset == m_base_path->atom_count() or
*m_base_path != PathName(m_current->abs_path).pop_right()
)) {
assert(m_base_path);
@ -93,7 +97,7 @@ namespace mchlib {
++m_current;
} while(
m_current != m_end and
m_current->level == m_base_path->atom_count() + 1 and
m_current->level + m_level_offset == m_base_path->atom_count() + 1 and
*m_base_path != PathName(m_current->abs_path).pop_right()
);
}
@ -126,7 +130,7 @@ namespace mchlib {
const bool is_this_end =
not m_base_path or
(m_current == m_end) or
(m_current->level != m_base_path->atom_count() + 1) /*or
(m_current->level + m_level_offset != m_base_path->atom_count() + 1) /*or
(*m_base_path != PathName(m_current->abs_path).pop_right())
*/;
return is_this_end;
@ -161,7 +165,7 @@ namespace mchlib {
if (m_list.begin() != m_list.end()) {
base_path.reset(new PathName(m_list.front().abs_path));
}
return const_iterator(m_list.begin(), m_list.end(), std::move(base_path));
return const_iterator(m_list.begin(), m_list.end(), std::move(base_path), base_path->atom_count());
}
auto SetListing::end() const -> const_iterator {
@ -169,32 +173,37 @@ namespace mchlib {
}
auto SetListing::cend() const -> const_iterator {
return const_iterator(m_list.end(), m_list.end(), std::unique_ptr<PathName>());
return const_iterator(m_list.end(), m_list.end(), std::unique_ptr<PathName>(), 0);
}
SetListingView<false> SetListing::make_view() {
return SetListingView<false>(m_list.begin(), m_list.end());
const auto offs = (m_list.empty() ? 0 : PathName(m_list.front().abs_path).atom_count());
return SetListingView<false>(m_list.begin(), m_list.end(), offs);
}
SetListingView<true> SetListing::make_view() const {
return SetListingView<true>(m_list.begin(), m_list.end());
const auto offs = (m_list.empty() ? 0 : PathName(m_list.front().abs_path).atom_count());
return SetListingView<true>(m_list.begin(), m_list.end(), offs);
}
SetListingView<true> SetListing::make_cview() const {
return SetListingView<true>(m_list.begin(), m_list.end());
const auto offs = (m_list.empty() ? 0 : PathName(m_list.front().abs_path).atom_count());
return SetListingView<true>(m_list.begin(), m_list.end(), offs);
}
template <bool Const>
SetListingView<Const>::SetListingView (const implem::DirIterator<Const>& parIter) :
m_begin(parIter.m_current),
m_end(parIter.m_end)
m_end(parIter.m_end),
m_level_offset(parIter.m_level_offset)
{
}
template <bool Const>
SetListingView<Const>::SetListingView (list_iterator parBeg, list_iterator parEnd) :
SetListingView<Const>::SetListingView (list_iterator parBeg, list_iterator parEnd, std::size_t parLevelOffset) :
m_begin(std::move(parBeg)),
m_end(std::move(parEnd))
m_end(std::move(parEnd)),
m_level_offset(parLevelOffset)
{
}
@ -209,7 +218,7 @@ namespace mchlib {
if (m_begin != m_end) {
base_path.reset(new PathName(m_begin->abs_path));
}
return const_iterator(m_begin, m_end, std::move(base_path));
return const_iterator(m_begin, m_end, std::move(base_path), m_level_offset);
}
template <bool Const>
@ -219,7 +228,7 @@ namespace mchlib {
template <bool Const>
auto SetListingView<Const>::cend() const -> const_iterator {
return const_iterator(m_end, m_end, std::unique_ptr<PathName>());
return const_iterator(m_end, m_end, std::unique_ptr<PathName>(), m_level_offset);
}
template <bool Const>
@ -229,13 +238,13 @@ namespace mchlib {
if (m_begin != m_end) {
base_path.reset(new PathName(m_begin->abs_path));
}
return iterator(m_begin, m_end, std::move(base_path));
return iterator(m_begin, m_end, std::move(base_path), m_level_offset);
}
template <bool Const>
template <bool B, typename R>
R SetListingView<Const>::end() {
return iterator(m_end, m_end, std::unique_ptr<PathName>());
return iterator(m_end, m_end, std::unique_ptr<PathName>(), m_level_offset);
}
template class SetListingView<true>;