/* vim:set ts=2 sw=2 sts=2 et: */
/**
* \author Marcus Holland-Moritz (github@mhxnet.de)
* \copyright Copyright (c) Marcus Holland-Moritz
*
* This file is part of dwarfs.
*
* dwarfs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dwarfs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dwarfs. If not, see .
*/
#include
#include
#include
#include
#include
namespace dwarfs::writer::internal {
inode_element_view::inode_element_view(
std::span const> inodes,
std::span index, fragment_category cat)
: inodes_{inodes}
, cat_{cat} {
hash_cache_.resize(inodes_.size());
for (auto i : index) {
hash_cache_[i] = inodes_[i]->nilsimsa_similarity_hash(cat);
}
}
bool inode_element_view::exists(size_t i) const {
return !cat_ || inodes_[i]->has_category(*cat_);
}
size_t inode_element_view::size() const { return inodes_.size(); }
size_t inode_element_view::weight(size_t i) const {
return inodes_[i]->any()->size();
}
bool inode_element_view::bitvec_less(size_t a, size_t b) const {
assert(hash_cache_[a] != nullptr);
assert(hash_cache_[b] != nullptr);
auto const& ha = *hash_cache_[a];
auto const& hb = *hash_cache_[b];
if (ha < hb) {
return true;
}
if (ha > hb) {
return false;
}
return inodes_[a]->any()->less_revpath(*inodes_[b]->any());
}
bool inode_element_view::order_less(size_t a, size_t b) const {
auto const& fa = *inodes_[a]->any();
auto const& fb = *inodes_[b]->any();
auto sa = fa.size();
auto sb = fb.size();
return sa > sb || (sa == sb && fa.less_revpath(fb));
}
bool inode_element_view::bits_equal(size_t a, size_t b) const {
assert(hash_cache_[a] != nullptr);
assert(hash_cache_[b] != nullptr);
return *hash_cache_[a] == *hash_cache_[b];
}
std::string inode_element_view::description(size_t i) const {
auto f = inodes_[i]->any();
return fmt::format("{} [{}]", f->path_as_string(), f->size());
}
nilsimsa::hash_type const& inode_element_view::get_bits(size_t i) const {
assert(hash_cache_[i] != nullptr);
return *hash_cache_[i];
}
} // namespace dwarfs::writer::internal