@@ -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
313339class 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-
19751996std::optional<dir_entry_view>
19761997metadata_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 {
0 commit comments