Generate list of seen categories

This commit is contained in:
Marcus Holland-Moritz 2023-08-04 15:15:18 +02:00
parent a75381b0ef
commit e86cd07246
3 changed files with 40 additions and 10 deletions

View File

@ -63,8 +63,12 @@ class inode_manager {
}
std::vector<std::pair<fragment_category::value_type, size_t>>
category_counts() const {
return impl_->category_counts();
fragment_category_counts() const {
return impl_->fragment_category_counts();
}
std::vector<fragment_category> inode_categories() const {
return impl_->inode_categories();
}
void scan_background(worker_group& wg, os_access& os,
@ -85,7 +89,8 @@ class inode_manager {
virtual void for_each_inode_in_order(
std::function<void(std::shared_ptr<inode> const&)> const& fn) const = 0;
virtual std::vector<std::pair<fragment_category::value_type, size_t>>
category_counts() const = 0;
fragment_category_counts() const = 0;
virtual std::vector<fragment_category> inode_categories() const = 0;
virtual void
scan_background(worker_group& wg, os_access& os, std::shared_ptr<inode> ino,
file const* p) const = 0;

View File

@ -477,12 +477,12 @@ class inode_manager_ final : public inode_manager::impl {
}
std::vector<std::pair<fragment_category::value_type, size_t>>
category_counts() const override {
fragment_category_counts() const override {
std::unordered_map<fragment_category::value_type, size_t> tmp;
for (auto const& i : inodes_) {
if (auto const& fragments = i->fragments(); !fragments.empty()) {
for (auto const& frag : fragments.span()) {
for (auto const& frag : fragments) {
++tmp[frag.category().value()];
}
}
@ -500,6 +500,24 @@ class inode_manager_ final : public inode_manager::impl {
return rv;
}
std::vector<fragment_category> inode_categories() const override {
std::unordered_set<fragment_category> tmp;
for (auto const& i : inodes_) {
if (auto const& fragments = i->fragments(); !fragments.empty()) {
for (auto const& frag : fragments) {
tmp.emplace(frag.category());
}
}
}
std::vector<fragment_category> rv(tmp.begin(), tmp.end());
std::sort(rv.begin(), rv.end());
return rv;
}
void
scan_background(worker_group& wg, os_access& os, std::shared_ptr<inode> ino,
file const* p) const override;

View File

@ -606,11 +606,18 @@ void scanner_<LoggerPolicy>::scan(
<< prog.duplicate_files << "/" << prog.files_found
<< " duplicate files";
if (options_.inode.categorizer_mgr) {
for (auto const& cc : im.category_counts()) {
LOG_INFO << cc.second << " "
<< options_.inode.categorizer_mgr->category_name(cc.first)
<< " files";
if (auto catmgr = options_.inode.categorizer_mgr) {
for (auto const& cc : im.fragment_category_counts()) {
LOG_INFO << cc.second << " " << catmgr->category_name(cc.first)
<< " fragments";
}
for (auto const& cat : im.inode_categories()) {
std::string str(catmgr->category_name(cat.value()));
if (cat.has_subcategory()) {
str += fmt::format("/{}", cat.subcategory());
}
LOG_INFO << str;
}
}