mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-09 04:19:10 -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
|
||||
order_inodes_by_nilsimsa(inode_manager::inode_cb const& fn, uint32_t inode_no,
|
||||
file_order_options const& file_order);
|
||||
@ -276,6 +279,47 @@ void inode_manager_<LoggerPolicy>::order_inodes(
|
||||
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>
|
||||
void inode_manager_<LoggerPolicy>::order_inodes_by_nilsimsa(
|
||||
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;
|
||||
|
||||
{
|
||||
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)";
|
||||
}
|
||||
presort_index(inodes, index);
|
||||
|
||||
finalize_inode();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user