Skip to content

Commit e9644b5

Browse files
committed
refactor(entry_storage): allocate entries directly in chunked vectors
1 parent a3f742a commit e9644b5

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

src/writer/entry_storage.cpp

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,34 @@ namespace dwarfs::writer {
3737

3838
class entry_storage::impl {
3939
public:
40-
template <typename T, typename... Args>
41-
T* make(Args&&... args) {
42-
auto p = std::make_unique<T>(std::forward<Args>(args)...);
43-
auto* raw = p.get();
44-
entries_.emplace_back(std::move(p));
45-
return raw;
40+
internal::file* make_file(std::filesystem::path const& path,
41+
internal::entry* parent, file_stat const& st) {
42+
auto& f = files_.emplace_back(path, parent, st);
43+
return &f;
4644
}
4745

48-
bool empty() const noexcept { return entries_.empty(); }
46+
internal::dir* make_dir(std::filesystem::path const& path,
47+
internal::entry* parent, file_stat const& st) {
48+
auto& d = dirs_.emplace_back(path, parent, st);
49+
return &d;
50+
}
51+
52+
internal::link* make_link(std::filesystem::path const& path,
53+
internal::entry* parent, file_stat const& st) {
54+
auto& l = links_.emplace_back(path, parent, st);
55+
return &l;
56+
}
57+
58+
internal::device* make_device(std::filesystem::path const& path,
59+
internal::entry* parent, file_stat const& st) {
60+
auto& d = devices_.emplace_back(path, parent, st);
61+
return &d;
62+
}
63+
64+
bool empty() const noexcept { return dirs_.empty(); }
4965

50-
internal::entry* root() const noexcept {
51-
return empty() ? nullptr : entries_.front().get();
66+
internal::entry* root() noexcept {
67+
return dirs_.empty() ? nullptr : &dirs_.front();
5268
}
5369

5470
void dump(std::ostream& os) const;
@@ -66,15 +82,21 @@ class entry_storage::impl {
6682
}
6783

6884
private:
69-
chunked_append_only_vector<std::unique_ptr<internal::entry>> entries_;
85+
chunked_append_only_vector<internal::file> files_;
86+
chunked_append_only_vector<internal::dir> dirs_;
87+
chunked_append_only_vector<internal::link> links_;
88+
chunked_append_only_vector<internal::device> devices_;
7089
dwarfs::internal::synchronized<
7190
chunked_append_only_vector<internal::file_data>>
7291
file_data_;
7392
};
7493

7594
void entry_storage::impl::dump(std::ostream& os) const {
76-
os << "num entries: " << entries_.size() << "\n";
95+
os << "num dirs: " << dirs_.size() << "\n";
96+
os << "num files: " << files_.size() << "\n";
7797
os << "num file data: " << file_data_.lock()->size() << "\n";
98+
os << "num links: " << links_.size() << "\n";
99+
os << "num devices: " << devices_.size() << "\n";
78100
}
79101

80102
entry_storage::entry_storage()
@@ -99,34 +121,34 @@ std::string entry_storage::dump() const {
99121
dir_handle entry_storage::create_root_dir(std::filesystem::path const& path,
100122
file_stat const& st) {
101123
DWARFS_CHECK(empty(), "entry_storage root already set");
102-
return {*this, impl_->make<internal::dir>(path, nullptr, st)};
124+
return {*this, impl_->make_dir(path, nullptr, st)};
103125
}
104126

105127
file_handle
106128
entry_storage::create_file(std::filesystem::path const& path,
107129
entry_handle parent, file_stat const& st) {
108130
assert(!empty());
109-
return {*this, impl_->make<internal::file>(path, parent.self_, st)};
131+
return {*this, impl_->make_file(path, parent.self_, st)};
110132
}
111133

112134
dir_handle entry_storage::create_dir(std::filesystem::path const& path,
113135
entry_handle parent, file_stat const& st) {
114136
assert(!empty());
115-
return {*this, impl_->make<internal::dir>(path, parent.self_, st)};
137+
return {*this, impl_->make_dir(path, parent.self_, st)};
116138
}
117139

118140
link_handle
119141
entry_storage::create_link(std::filesystem::path const& path,
120142
entry_handle parent, file_stat const& st) {
121143
assert(!empty());
122-
return {*this, impl_->make<internal::link>(path, parent.self_, st)};
144+
return {*this, impl_->make_link(path, parent.self_, st)};
123145
}
124146

125147
device_handle
126148
entry_storage::create_device(std::filesystem::path const& path,
127149
entry_handle parent, file_stat const& st) {
128150
assert(!empty());
129-
return {*this, impl_->make<internal::device>(path, parent.self_, st)};
151+
return {*this, impl_->make_device(path, parent.self_, st)};
130152
}
131153

132154
size_t entry_storage::create_file_data() { return impl_->create_file_data(); }

0 commit comments

Comments
 (0)