Skip to content

Commit f06623a

Browse files
committed
refactor(filesystem_v2): walk_directories -> directory_entries
1 parent cc0dcf5 commit f06623a

File tree

6 files changed

+50
-32
lines changed

6 files changed

+50
-32
lines changed

include/dwarfs/reader/filesystem_v2.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ class filesystem_v2_lite {
116116
lite_->walk_data_order(func);
117117
}
118118

119-
void walk_directories(std::function<void(dir_entry_view)> const& func) const {
120-
lite_->walk_directories(func);
119+
dir_entry_view_iterable directory_entries() const {
120+
return lite_->directory_entries();
121121
}
122122

123123
dir_entry_view_iterable entries_in_data_order() const {
@@ -372,8 +372,7 @@ class filesystem_v2_lite {
372372
walk(std::function<void(dir_entry_view)> const& func) const = 0;
373373
virtual void
374374
walk_data_order(std::function<void(dir_entry_view)> const& func) const = 0;
375-
virtual void
376-
walk_directories(std::function<void(dir_entry_view)> const& func) const = 0;
375+
virtual dir_entry_view_iterable directory_entries() const = 0;
377376
virtual dir_entry_view_iterable entries_in_data_order() const = 0;
378377
virtual dir_entry_view root() const = 0;
379378
virtual std::optional<dir_entry_view> find(std::string_view path) const = 0;

include/dwarfs/reader/internal/metadata_v2.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ class metadata_v2 {
8989
impl_->walk(func);
9090
}
9191

92-
void walk_directories(std::function<void(dir_entry_view)> const& func) const {
93-
impl_->walk_directories(func);
92+
dir_entry_view_iterable directory_entries() const {
93+
return impl_->directory_entries();
9494
}
9595

9696
dir_entry_view_iterable entries_in_data_order() const {
@@ -205,9 +205,7 @@ class metadata_v2 {
205205
virtual void
206206
walk(std::function<void(dir_entry_view)> const& func) const = 0;
207207

208-
virtual void
209-
walk_directories(std::function<void(dir_entry_view)> const& func) const = 0;
210-
208+
virtual dir_entry_view_iterable directory_entries() const = 0;
211209
virtual dir_entry_view_iterable entries_in_data_order() const = 0;
212210

213211
virtual dir_entry_view root() const = 0;

src/reader/filesystem_v2.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ class filesystem_ final {
277277
bool has_valid_section_index() const;
278278
void walk(std::function<void(dir_entry_view)> const& func) const;
279279
void walk_data_order(std::function<void(dir_entry_view)> const& func) const;
280-
void walk_directories(std::function<void(dir_entry_view)> const& func) const;
280+
dir_entry_view_iterable directory_entries() const;
281281
dir_entry_view_iterable entries_in_data_order() const;
282282
dir_entry_view root() const;
283283
std::optional<dir_entry_view> find(std::string_view path) const;
@@ -919,9 +919,8 @@ void filesystem_<LoggerPolicy>::walk_data_order(
919919
}
920920

921921
template <typename LoggerPolicy>
922-
void filesystem_<LoggerPolicy>::walk_directories(
923-
std::function<void(dir_entry_view)> const& func) const {
924-
meta_.walk_directories(func);
922+
dir_entry_view_iterable filesystem_<LoggerPolicy>::directory_entries() const {
923+
return meta_.directory_entries();
925924
}
926925

927926
template <typename LoggerPolicy>
@@ -1305,9 +1304,8 @@ class filesystem_common_ : public Base {
13051304
std::function<void(dir_entry_view)> const& func) const override {
13061305
fs_.walk_data_order(func);
13071306
}
1308-
void walk_directories(
1309-
std::function<void(dir_entry_view)> const& func) const override {
1310-
fs_.walk_directories(func);
1307+
dir_entry_view_iterable directory_entries() const override {
1308+
return fs_.directory_entries();
13111309
}
13121310
dir_entry_view_iterable entries_in_data_order() const override {
13131311
return fs_.entries_in_data_order();

src/reader/internal/metadata_v2.cpp

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,32 @@ class data_order_dir_entry_range
308308
global_metadata const& g_;
309309
};
310310

311+
class directories_dir_entry_range
312+
: public dir_entry_view_iterable::dir_entry_range {
313+
public:
314+
directories_dir_entry_range(size_t count, global_metadata const& g)
315+
: count_{count}
316+
, g_{g} {}
317+
318+
size_t size() const noexcept override { return count_; }
319+
320+
dir_entry_view at(size_t index) const override {
321+
if (index < count_) {
322+
auto const self_index = g_.self_dir_entry(index);
323+
auto const parent_index = g_.parent_dir_entry(index);
324+
return dir_entry_view{dir_entry_view_impl::from_dir_entry_index_shared(
325+
self_index, parent_index, g_)};
326+
}
327+
328+
throw std::out_of_range(
329+
fmt::format("index {} out of range (size={})", index, count_));
330+
}
331+
332+
private:
333+
size_t const count_{0};
334+
global_metadata const& g_;
335+
};
336+
311337
} // namespace
312338

313339
class metadata_v2_data {
@@ -389,7 +415,11 @@ class metadata_v2_data {
389415
});
390416
}
391417

392-
void walk_directories(std::function<void(dir_entry_view)> const& func) const;
418+
dir_entry_view_iterable directory_entries() const {
419+
return dir_entry_view_iterable{
420+
std::make_unique<directories_dir_entry_range>(symlink_inode_offset_,
421+
global_)};
422+
}
393423

394424
template <typename LoggerPolicy>
395425
dir_entry_view_iterable
@@ -1963,15 +1993,6 @@ metadata_v2_data::entries_in_data_order(LOG_PROXY_REF(LoggerPolicy)) const {
19631993
std::move(entries), global_)};
19641994
}
19651995

1966-
void metadata_v2_data::walk_directories(
1967-
std::function<void(dir_entry_view)> const& func) const {
1968-
for (uint32_t ino = 0; std::cmp_less(ino, symlink_inode_offset_); ++ino) {
1969-
auto const self_index = global_.self_dir_entry(ino);
1970-
auto const parent_index = global_.parent_dir_entry(ino);
1971-
walk_call(func, self_index, parent_index);
1972-
}
1973-
}
1974-
19751996
std::optional<dir_entry_view>
19761997
metadata_v2_data::find(directory_view dir, std::string_view name) const {
19771998
PERFMON_CLS_SCOPED_SECTION(find)
@@ -2320,9 +2341,8 @@ class metadata_ final : public metadata_v2::impl {
23202341
data_.walk(LOG_PROXY_ARG_ func);
23212342
}
23222343

2323-
void walk_directories(
2324-
std::function<void(dir_entry_view)> const& func) const override {
2325-
data_.walk_directories(func);
2344+
dir_entry_view_iterable directory_entries() const override {
2345+
return data_.directory_entries();
23262346
}
23272347

23282348
dir_entry_view_iterable entries_in_data_order() const override {

test/compat_test.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,8 +1247,9 @@ void check_compat(logger& lgr [[maybe_unused]], reader::filesystem_v2 const& fs,
12471247

12481248
{
12491249
std::vector<std::string> dirs;
1250-
fs.walk_directories(
1251-
[&](auto const& de) { dirs.push_back(de.unix_path()); });
1250+
for (auto const& de : fs.directory_entries()) {
1251+
dirs.push_back(de.unix_path());
1252+
}
12521253
std::vector<std::string> expected_dirs{
12531254
"",
12541255
"dev",

test/dwarfs_benchmark.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,9 @@ BENCHMARK_DEFINE_F(filesystem_walk, walk_data_order)
727727
BENCHMARK_DEFINE_F(filesystem_walk, walk_directories)
728728
(::benchmark::State& state) {
729729
for (auto _ : state) {
730-
fs->walk_directories([](reader::dir_entry_view) {});
730+
for (auto const& de : fs->directory_entries()) {
731+
::benchmark::DoNotOptimize(&de);
732+
}
731733
}
732734
}
733735

0 commit comments

Comments
 (0)