/* 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 { void single_inode_fragment::add_chunk(size_t block, size_t offset, size_t size) { if (!chunks_.empty()) { auto& last = chunks_.back(); if (last.block == block && last.offset + last.size == offset) [[unlikely]] { // merge chunks last.size += size; return; } } chunks_.push_back({ .block = folly::to(block), .offset = folly::to(offset), .size = folly::to(size), }); } bool single_inode_fragment::chunks_are_consistent() const { if (length_ > 0 && chunks_.empty()) { return false; } auto total_chunks_len = std::accumulate(chunks_.begin(), chunks_.end(), file_off_t{0}, [](auto acc, auto const& c) { return acc + c.size; }); return total_chunks_len == length_; } std::ostream& inode_fragments::to_stream(std::ostream& os, mapper_function_type const& mapper) const { if (empty()) { os << "(empty)"; } else { os << "["; bool first = true; for (auto const& f : span()) { if (first) { first = false; } else { os << ", "; } os << "("; auto const& cat = f.category(); if (mapper) { os << mapper(cat.value()); } else { os << cat.value(); } if (cat.has_subcategory()) { os << "/" << cat.subcategory(); } os << ", " << f.size() << ")"; } os << "]"; } return os; } std::string inode_fragments::to_string(mapper_function_type const& mapper) const { std::ostringstream oss; to_stream(oss, mapper); return oss.str(); } std::unordered_map inode_fragments::get_category_sizes() const { std::unordered_map result; for (auto const& f : span()) { result[f.category()] += f.size(); } return result; } } // namespace dwarfs::writer