mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-10 21:10:02 -04:00
Refactor nilsimsa ordering
This commit is contained in:
parent
d179fe175d
commit
a3d06dc469
@ -211,6 +211,9 @@ class inode_manager_ : public inode_manager::impl {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void presort_index(std::vector<std::shared_ptr<inode>>& inodes,
|
||||||
|
std::vector<uint32_t>& index);
|
||||||
|
|
||||||
void
|
void
|
||||||
order_inodes_by_nilsimsa(inode_manager::inode_cb const& fn, uint32_t inode_no,
|
order_inodes_by_nilsimsa(inode_manager::inode_cb const& fn, uint32_t inode_no,
|
||||||
file_order_options const& file_order);
|
file_order_options const& file_order);
|
||||||
@ -276,6 +279,47 @@ void inode_manager_<LoggerPolicy>::order_inodes(
|
|||||||
for_each_inode(fn);
|
for_each_inode(fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename LoggerPolicy>
|
||||||
|
void inode_manager_<LoggerPolicy>::presort_index(
|
||||||
|
std::vector<std::shared_ptr<inode>>& inodes, std::vector<uint32_t>& index) {
|
||||||
|
auto ti = log_.timed_info();
|
||||||
|
size_t num_name = 0;
|
||||||
|
size_t num_path = 0;
|
||||||
|
|
||||||
|
std::sort(index.begin(), index.end(), [&](auto a, auto b) {
|
||||||
|
auto const& ia = *inodes[a];
|
||||||
|
auto const& ib = *inodes[b];
|
||||||
|
auto sa = ia.size();
|
||||||
|
auto sb = ib.size();
|
||||||
|
|
||||||
|
if (sa < sb) {
|
||||||
|
return true;
|
||||||
|
} else if (sa > sb) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
++num_name;
|
||||||
|
|
||||||
|
auto fa = ia.any();
|
||||||
|
auto fb = ib.any();
|
||||||
|
auto& na = fa->name();
|
||||||
|
auto& nb = fb->name();
|
||||||
|
|
||||||
|
if (na < nb) {
|
||||||
|
return true;
|
||||||
|
} else if (na > nb) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
++num_path;
|
||||||
|
|
||||||
|
return fa->path() < fb->path();
|
||||||
|
});
|
||||||
|
|
||||||
|
ti << "pre-sorted index (" << num_name << " name, " << num_path
|
||||||
|
<< " path lookups)";
|
||||||
|
}
|
||||||
|
|
||||||
template <typename LoggerPolicy>
|
template <typename LoggerPolicy>
|
||||||
void inode_manager_<LoggerPolicy>::order_inodes_by_nilsimsa(
|
void inode_manager_<LoggerPolicy>::order_inodes_by_nilsimsa(
|
||||||
inode_manager::inode_cb const& fn, uint32_t inode_no,
|
inode_manager::inode_cb const& fn, uint32_t inode_no,
|
||||||
@ -310,36 +354,7 @@ void inode_manager_<LoggerPolicy>::order_inodes_by_nilsimsa(
|
|||||||
|
|
||||||
log_.info() << "nilsimsa: depth=" << depth << ", limit=" << limit;
|
log_.info() << "nilsimsa: depth=" << depth << ", limit=" << limit;
|
||||||
|
|
||||||
{
|
presort_index(inodes, index);
|
||||||
auto ti = log_.timed_info();
|
|
||||||
size_t num_name = 0;
|
|
||||||
size_t num_path = 0;
|
|
||||||
|
|
||||||
std::sort(index.begin(), index.end(), [&](auto a, auto b) {
|
|
||||||
auto const& ia = *inodes[a];
|
|
||||||
auto const& ib = *inodes[b];
|
|
||||||
auto sa = ia.size();
|
|
||||||
auto sb = ib.size();
|
|
||||||
if (sa < sb) {
|
|
||||||
return true;
|
|
||||||
} else if (sa > sb) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
++num_name;
|
|
||||||
auto fa = ia.any();
|
|
||||||
auto fb = ib.any();
|
|
||||||
if (fa->name() < fb->name()) {
|
|
||||||
return true;
|
|
||||||
} else if (fa->name() > fb->name()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
++num_path;
|
|
||||||
return fa->path() < fb->path();
|
|
||||||
});
|
|
||||||
|
|
||||||
ti << "pre-sorted index (" << num_name << " name, " << num_path
|
|
||||||
<< " path lookups)";
|
|
||||||
}
|
|
||||||
|
|
||||||
finalize_inode();
|
finalize_inode();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user