@@ -37,18 +37,34 @@ namespace dwarfs::writer {
3737
3838class 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
7594void 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
80102entry_storage::entry_storage ()
@@ -99,34 +121,34 @@ std::string entry_storage::dump() const {
99121dir_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
105127file_handle
106128entry_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
112134dir_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
118140link_handle
119141entry_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
125147device_handle
126148entry_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
132154size_t entry_storage::create_file_data () { return impl_->create_file_data (); }
0 commit comments