From ab8f67619f0fe39640a2f7f88e002ec441a83bce Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sun, 16 Mar 2025 17:09:03 +0100 Subject: [PATCH] refactor: prefer `std::ranges::` algorithm variants --- src/checksum.cpp | 2 +- src/glob_matcher.cpp | 2 +- src/internal/features.cpp | 5 ++--- src/internal/string_table.cpp | 2 +- src/library_dependencies.cpp | 2 +- src/logger.cpp | 6 +++--- src/option_map.cpp | 6 +++--- src/performance_monitor.cpp | 6 +++--- src/reader/fsinfo_features.cpp | 5 ++--- src/reader/internal/block_cache.cpp | 12 +++++------- src/reader/internal/metadata_types.cpp | 18 ++++++++---------- src/reader/internal/metadata_v2.cpp | 8 ++++---- src/writer/categorizer/fits_categorizer.cpp | 2 +- .../compression_metadata_requirements.cpp | 2 +- src/writer/internal/entry.cpp | 13 ++++++------- src/writer/internal/inode_manager.cpp | 6 +++--- src/writer/internal/nilsimsa.cpp | 4 +++- src/writer/internal/progress.cpp | 2 +- src/writer/rule_based_entry_filter.cpp | 4 ++-- src/writer/scanner.cpp | 2 +- 20 files changed, 52 insertions(+), 57 deletions(-) diff --git a/src/checksum.cpp b/src/checksum.cpp index 9da1d37f..c243007c 100644 --- a/src/checksum.cpp +++ b/src/checksum.cpp @@ -223,7 +223,7 @@ std::vector checksum::available_algorithms() { available.insert(available.end(), supported_algorithms.begin(), supported_algorithms.end()); available.insert(available.end(), available_evp.begin(), available_evp.end()); - std::sort(available.begin(), available.end()); + std::ranges::sort(available); return available; } diff --git a/src/glob_matcher.cpp b/src/glob_matcher.cpp index f2d605eb..be8623a2 100644 --- a/src/glob_matcher.cpp +++ b/src/glob_matcher.cpp @@ -85,7 +85,7 @@ class glob_matcher_ final : public glob_matcher::impl { } bool match(std::string_view sv) const override { - return std::any_of(m_.begin(), m_.end(), [&sv](auto const& re) { + return std::ranges::any_of(m_, [&sv](auto const& re) { return std::regex_match(sv.begin(), sv.end(), re); }); } diff --git a/src/internal/features.cpp b/src/internal/features.cpp index 04557a8f..432f1372 100644 --- a/src/internal/features.cpp +++ b/src/internal/features.cpp @@ -54,9 +54,8 @@ std::set feature_set::get_unsupported(std::set wanted_features) { auto const supported_features = get_supported(); std::set missing; - std::set_difference(wanted_features.begin(), wanted_features.end(), - supported_features.begin(), supported_features.end(), - std::inserter(missing, missing.end())); + std::ranges::set_difference(wanted_features, supported_features, + std::inserter(missing, missing.end())); return missing; } diff --git a/src/internal/string_table.cpp b/src/internal/string_table.cpp index 66558128..d6dcb255 100644 --- a/src/internal/string_table.cpp +++ b/src/internal/string_table.cpp @@ -272,7 +272,7 @@ string_table::pack_generic(std::span input, output.buffer()->swap(buffer); output.symtab() = std::move(symtab); output.index()->resize(size); - std::copy(out_len_vec.begin(), out_len_vec.end(), output.index()->begin()); + std::ranges::copy(out_len_vec, output.index()->begin()); } else { // store uncompressed output.buffer()->reserve(total_input_size); diff --git a/src/library_dependencies.cpp b/src/library_dependencies.cpp index a9912aad..579844d0 100644 --- a/src/library_dependencies.cpp +++ b/src/library_dependencies.cpp @@ -87,7 +87,7 @@ void library_dependencies::add_library(std::string const& name_version_string) { if (tmp.starts_with("lib")) { tmp.erase(0, 3); } - std::replace(tmp.begin(), tmp.end(), ' ', '-'); + std::ranges::replace(tmp, ' ', '-'); deps_.insert(tmp); } diff --git a/src/logger.cpp b/src/logger.cpp index fa87085e..96d3f9db 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -238,8 +238,8 @@ void stream_logger::write(level_type level, std::string_view output, if (output.find('\r') != std::string::npos) { tmp.reserve(output.size()); - std::copy_if(output.begin(), output.end(), std::back_inserter(tmp), - [](char c) { return c != '\r'; }); + std::ranges::copy_if(output, std::back_inserter(tmp), + [](char c) { return c != '\r'; }); split_to(tmp, '\n', lines); } else { split_to(output, '\n', lines); @@ -261,7 +261,7 @@ void stream_logger::write(level_type level, std::string_view output, << newline; if (clear_ctx) { - std::fill(t.begin(), t.end(), '.'); + std::ranges::fill(t, '.'); context.assign(context_len, ' '); clear_ctx = false; } diff --git a/src/option_map.cpp b/src/option_map.cpp index 9fb8d9ba..693a2a70 100644 --- a/src/option_map.cpp +++ b/src/option_map.cpp @@ -74,9 +74,9 @@ size_t option_map::get_size(const std::string& key, size_t default_value) { void option_map::report() { if (!opt_.empty()) { std::vector invalid; - std::transform(opt_.begin(), opt_.end(), std::back_inserter(invalid), - [](const auto& p) { return p.first; }); - std::sort(invalid.begin(), invalid.end()); + std::ranges::transform(opt_, std::back_inserter(invalid), + [](const auto& p) { return p.first; }); + std::ranges::sort(invalid); DWARFS_THROW(runtime_error, fmt::format("invalid option(s) for choice {}: {}", choice_, fmt::join(invalid, ", "))); diff --git a/src/performance_monitor.cpp b/src/performance_monitor.cpp index e30ffb70..0dc09fba 100644 --- a/src/performance_monitor.cpp +++ b/src/performance_monitor.cpp @@ -229,7 +229,7 @@ class performance_monitor_impl final : public performance_monitor { ts.emplace_back(t.get_namespace(), t.total_latency(), i); } - std::sort(ts.begin(), ts.end(), [](auto const& a, auto const& b) { + std::ranges::sort(ts, [](auto const& a, auto const& b) { return std::get<0>(a) < std::get<0>(b) || (std::get<0>(a) == std::get<0>(b) && std::get<1>(a) > std::get<1>(b)); @@ -302,8 +302,8 @@ class performance_monitor_impl final : public performance_monitor { } } - std::sort(events.begin(), events.end(), - [](auto const& a, auto const& b) { return a.ts < b.ts; }); + std::ranges::sort(events, + [](auto const& a, auto const& b) { return a.ts < b.ts; }); bool first = true; auto const pid = ::getpid(); diff --git a/src/reader/fsinfo_features.cpp b/src/reader/fsinfo_features.cpp index e387338c..4e8551c1 100644 --- a/src/reader/fsinfo_features.cpp +++ b/src/reader/fsinfo_features.cpp @@ -100,9 +100,8 @@ fsinfo_features fsinfo_features::parse(std::string_view features) { fsinfo_features result; for (auto const& f : split_view(features, ',')) { - auto const it = - std::find_if(fsinfo_feature_names.begin(), fsinfo_feature_names.end(), - [&f](auto const& p) { return f == p.second; }); + auto const it = std::ranges::find_if( + fsinfo_feature_names, [&f](auto const& p) { return f == p.second; }); if (it == fsinfo_feature_names.end()) { DWARFS_THROW(runtime_error, fmt::format("invalid feature: \"{}\"", f)); diff --git a/src/reader/internal/block_cache.cpp b/src/reader/internal/block_cache.cpp index 8667dacc..badc5546 100644 --- a/src/reader/internal/block_cache.cpp +++ b/src/reader/internal/block_cache.cpp @@ -108,12 +108,11 @@ class lru_sequential_access_detector : public sequential_access_detector { return std::nullopt; } - auto minmax = std::minmax_element( - lru_.begin(), lru_.end(), - [](auto const& a, auto const& b) { return a.first < b.first; }); + auto minmax = std::ranges::minmax_element( + lru_, [](auto const& a, auto const& b) { return a.first < b.first; }); - auto min = minmax.first->first; - auto max = minmax.second->first; + auto min = minmax.min->first; + auto max = minmax.max->first; is_sequential_ = max - min + 1 == seq_blocks_; @@ -185,8 +184,7 @@ class block_request_set { void merge(block_request_set& other) { queue_.reserve(queue_.size() + other.queue_.size()); - std::move(other.queue_.begin(), other.queue_.end(), - std::back_inserter(queue_)); + std::ranges::move(other.queue_, std::back_inserter(queue_)); other.queue_.clear(); std::make_heap(queue_.begin(), queue_.end()); range_end_ = std::max(range_end_, other.range_end_); diff --git a/src/reader/internal/metadata_types.cpp b/src/reader/internal/metadata_types.cpp index 929732d4..3f435638 100644 --- a/src/reader/internal/metadata_types.cpp +++ b/src/reader/internal/metadata_types.cpp @@ -508,7 +508,7 @@ void check_compact_strings( fmt::format("invalid first compact {0} index: {1}", what, idx.front())); } - if (!std::is_sorted(idx.begin(), idx.end())) { + if (!std::ranges::is_sorted(idx)) { DWARFS_THROW(runtime_error, fmt::format("compact {0} index not sorted", what)); } @@ -663,26 +663,24 @@ std::array check_partitioning(global_metadata::Meta const& meta) { }; auto inodes = meta.inodes(); - if (!std::is_partitioned(inodes.begin(), inodes.end(), pred)) { + if (!std::ranges::is_partitioned(inodes, pred)) { DWARFS_THROW(runtime_error, "inode table is not partitioned"); } - offsets[r] = std::distance( - inodes.begin(), - std::partition_point(inodes.begin(), inodes.end(), pred)); + offsets[r] = std::distance(inodes.begin(), + std::ranges::partition_point(inodes, pred)); } else { auto pred = [r, modes = meta.modes(), inodes = meta.inodes()](auto ent) { return mode_rank(modes[inodes[ent].mode_index()]) < r; }; auto entries = meta.entry_table_v2_2(); - if (!std::is_partitioned(entries.begin(), entries.end(), pred)) { + if (!std::ranges::is_partitioned(entries, pred)) { DWARFS_THROW(runtime_error, "entry_table_v2_2 is not partitioned"); } - offsets[r] = std::distance( - entries.begin(), - std::partition_point(entries.begin(), entries.end(), pred)); + offsets[r] = std::distance(entries.begin(), + std::ranges::partition_point(entries, pred)); } } @@ -1049,7 +1047,7 @@ std::string dir_entry_view_impl::unix_path() const { static_cast(std::filesystem::path::preferred_separator); auto p = path(); if constexpr (preferred != '/') { - std::replace(p.begin(), p.end(), preferred, '/'); + std::ranges::replace(p, preferred, '/'); } return p; } diff --git a/src/reader/internal/metadata_v2.cpp b/src/reader/internal/metadata_v2.cpp index d070db16..6996d555 100644 --- a/src/reader/internal/metadata_v2.cpp +++ b/src/reader/internal/metadata_v2.cpp @@ -310,7 +310,7 @@ void analyze_frozen(std::ostream& os, l->reg_file_size_cacheField.layout.valueField.layout.lookupField); } - std::sort(usage.begin(), usage.end(), [](auto const& a, auto const& b) { + std::ranges::sort(usage, [](auto const& a, auto const& b) { return a.first > b.first || (a.first == b.first && a.second < b.second); }); @@ -816,7 +816,7 @@ class metadata_ final : public metadata_v2::impl { host_preferred = '/'; } if (meta_preferred != host_preferred) { - std::replace(rv.begin(), rv.end(), meta_preferred, host_preferred); + std::ranges::replace(rv, meta_preferred, host_preferred); } } @@ -915,7 +915,7 @@ class metadata_ final : public metadata_v2::impl { { auto tt = LOG_TIMED_TRACE; - uint32_t max = *std::max_element(nlinks.begin(), nlinks.end()); + uint32_t max = *std::ranges::max_element(nlinks); packed_nlinks.reset(std::bit_width(max), nlinks.size()); for (size_t i = 0; i < nlinks.size(); ++i) { @@ -979,7 +979,7 @@ class metadata_ final : public metadata_v2::impl { // It's faster to check here if the folded names are sorted than to // check later if the indices in `entries` are sorted. - if (!std::is_sorted(names.begin(), names.end())) { + if (!std::ranges::is_sorted(names)) { std::vector entries(range.size()); std::iota(entries.begin(), entries.end(), 0); boost::sort::flat_stable_sort( diff --git a/src/writer/categorizer/fits_categorizer.cpp b/src/writer/categorizer/fits_categorizer.cpp index 3f0a1cdb..79c9f4f7 100644 --- a/src/writer/categorizer/fits_categorizer.cpp +++ b/src/writer/categorizer/fits_categorizer.cpp @@ -145,7 +145,7 @@ unsigned get_unused_lsb_count(std::span imagedata) { size_t size = imagedata.size_bytes() / kAlignment; alignas(kAlignment) std::array b512; - std::fill(b512.begin(), b512.end(), 0); + std::ranges::fill(b512, 0); for (size_t i = 0; i < size; ++i) { for (size_t k = 0; k < b512.size(); ++k) { diff --git a/src/writer/compression_metadata_requirements.cpp b/src/writer/compression_metadata_requirements.cpp index b0b2f68c..3d115dea 100644 --- a/src/writer/compression_metadata_requirements.cpp +++ b/src/writer/compression_metadata_requirements.cpp @@ -60,7 +60,7 @@ void check_unsupported_metadata_requirements(nlohmann::json& req) { for (auto const& [k, v] : req.items()) { keys.emplace_back(k); } - std::sort(keys.begin(), keys.end()); + std::ranges::sort(keys); throw std::runtime_error(fmt::format( "unsupported metadata requirements: {}", fmt::join(keys, ", "))); } diff --git a/src/writer/internal/entry.cpp b/src/writer/internal/entry.cpp index 0aff0278..6f1e2378 100644 --- a/src/writer/internal/entry.cpp +++ b/src/writer/internal/entry.cpp @@ -129,7 +129,7 @@ std::string entry::unix_dpath() const { if (auto parent = parent_.lock()) { p = parent->unix_dpath() + p; } else if constexpr (kLocalPathSeparator != '/') { - std::replace(p.begin(), p.end(), kLocalPathSeparator, '/'); + std::ranges::replace(p, kLocalPathSeparator, '/'); } } @@ -352,10 +352,9 @@ void dir::accept(entry_visitor& v, bool preorder) { } void dir::sort() { - std::sort(entries_.begin(), entries_.end(), - [](entry_ptr const& a, entry_ptr const& b) { - return a->name() < b->name(); - }); + std::ranges::sort(entries_, [](entry_ptr const& a, entry_ptr const& b) { + return a->name() < b->name(); + }); } void dir::scan(os_access const&, progress&) {} @@ -427,8 +426,8 @@ std::shared_ptr dir::find(fs::path const& path) { return it->second; } } else { - auto it = std::find_if(entries_.begin(), entries_.end(), - [name](auto& e) { return e->name() == name; }); + auto it = std::ranges::find_if( + entries_, [name](auto& e) { return e->name() == name; }); if (it != entries_.end()) { return *it; } diff --git a/src/writer/internal/inode_manager.cpp b/src/writer/internal/inode_manager.cpp index a0909de8..cdca411a 100644 --- a/src/writer/internal/inode_manager.cpp +++ b/src/writer/internal/inode_manager.cpp @@ -95,8 +95,8 @@ class inode_ : public inode { bool has_category(fragment_category cat) const override { DWARFS_CHECK(!fragments_.empty(), "has_category() called with no fragments"); - return std::any_of(fragments_.begin(), fragments_.end(), - [cat](auto const& f) { return f.category() == cat; }); + return std::ranges::any_of( + fragments_, [cat](auto const& f) { return f.category() == cat; }); } std::optional @@ -610,7 +610,7 @@ class inode_manager_ final : public inode_manager::impl { return catmgr.deterministic_less(a, b); }); } else { - std::sort(rv.categories.begin(), rv.categories.end()); + std::ranges::sort(rv.categories); } return rv; diff --git a/src/writer/internal/nilsimsa.cpp b/src/writer/internal/nilsimsa.cpp index 6ceb1a7c..2cd20a5b 100644 --- a/src/writer/internal/nilsimsa.cpp +++ b/src/writer/internal/nilsimsa.cpp @@ -19,6 +19,8 @@ * along with dwarfs. If not, see . */ +#include + #include namespace dwarfs::writer::internal { @@ -88,7 +90,7 @@ class nilsimsa::impl { size_t threshold = total / acc_.size(); - std::fill(hash.begin(), hash.end(), 0); + std::ranges::fill(hash, 0); for (size_t i = 0; i < acc_.size(); i++) { if (acc_[i] > threshold) { diff --git a/src/writer/internal/progress.cpp b/src/writer/internal/progress.cpp index 7b74bab0..bfda183a 100644 --- a/src/writer/internal/progress.cpp +++ b/src/writer/internal/progress.cpp @@ -55,7 +55,7 @@ auto progress::get_active_contexts() const contexts_.end()); } - std::stable_sort(rv.begin(), rv.end(), [](const auto& a, const auto& b) { + std::ranges::stable_sort(rv, [](const auto& a, const auto& b) { return a->get_priority() > b->get_priority(); }); diff --git a/src/writer/rule_based_entry_filter.cpp b/src/writer/rule_based_entry_filter.cpp index d2ac5179..2f344c76 100644 --- a/src/writer/rule_based_entry_filter.cpp +++ b/src/writer/rule_based_entry_filter.cpp @@ -19,6 +19,7 @@ * along with dwarfs. If not, see . */ +#include #include #include #include @@ -185,8 +186,7 @@ void rule_based_entry_filter_::set_root_path( // Both '/' and '\\' are, surprisingly, valid path separators on Windows, // and invalid characters in filenames. So on Windows, it's a lossless // transformation to replace all '\\' with '/'. - std::replace(root_path_.begin(), root_path_.end(), kLocalPathSeparator, - '/'); + std::ranges::replace(root_path_, kLocalPathSeparator, '/'); } if (root_path_.ends_with('/')) { diff --git a/src/writer/scanner.cpp b/src/writer/scanner.cpp index e5495e74..a9d52d47 100644 --- a/src/writer/scanner.cpp +++ b/src/writer/scanner.cpp @@ -234,7 +234,7 @@ class save_shared_files_visitor : public visitor_base { void pack_shared_files() { if (!shared_files_.empty()) { - DWARFS_CHECK(std::is_sorted(shared_files_.begin(), shared_files_.end()), + DWARFS_CHECK(std::ranges::is_sorted(shared_files_), "shared files vector not sorted"); std::vector compressed; compressed.reserve(shared_files_.back() + 1);