diff --git a/include/flatbuffers/file_manager.h b/include/flatbuffers/file_manager.h index bafe6f29b97..c3cc4c60059 100644 --- a/include/flatbuffers/file_manager.h +++ b/include/flatbuffers/file_manager.h @@ -18,6 +18,7 @@ #define FLATBUFFERS_FILE_MANAGER_H_ #include +#include #include #include @@ -48,22 +49,8 @@ class FileSaver { FileSaver& operator=(FileSaver&&) = default; }; -class RealFileSaver final : public FileSaver { - public: - bool SaveFile(const char* name, const char* buf, size_t len, - bool binary) final; -}; - -class FileNameSaver final : public FileSaver { - public: - bool SaveFile(const char* name, const char* buf, size_t len, - bool binary) final; - - void Finish() final; - - private: - std::set file_names_{}; -}; +std::unique_ptr CreateFileSaver(); +std::unique_ptr CreateFileNameCollector(); } // namespace flatbuffers diff --git a/src/file_manager.cpp b/src/file_manager.cpp index f1deae3886b..8e32f7133d7 100644 --- a/src/file_manager.cpp +++ b/src/file_manager.cpp @@ -22,12 +22,26 @@ namespace flatbuffers { -bool RealFileSaver::SaveFile(const char* name, const char* buf, size_t len, - bool binary) { - std::ofstream ofs(name, binary ? std::ofstream::binary : std::ofstream::out); - if (!ofs.is_open()) return false; - ofs.write(buf, len); - return !ofs.bad(); +class RealFileSaver final : public FileSaver { + public: + bool SaveFile(const char* name, const char* buf, size_t len, + bool binary) final { + std::ofstream ofs{name, + binary ? std::ofstream::binary : std::ofstream::out}; + + if (!ofs.is_open()) { + return false; + } + + ofs.write(buf, len); + + return !ofs.bad(); + } +}; + +std::unique_ptr CreateFileSaver() { + // compiler limitations mean we can't use std::make_unique + return std::unique_ptr{new RealFileSaver()}; } } // namespace flatbuffers diff --git a/src/file_name_manager.cpp b/src/file_name_manager.cpp index aad63de8c6b..313dc9e6a9b 100644 --- a/src/file_name_manager.cpp +++ b/src/file_name_manager.cpp @@ -21,24 +21,35 @@ namespace flatbuffers { -bool FileNameSaver::SaveFile(const char* name, const char* buf, size_t len, - bool binary) { - (void)buf; - (void)len; - (void)binary; +class FileNameSaver final : public FileSaver { + public: + bool SaveFile(const char* name, const char* buf, size_t len, + bool binary) final { + (void)buf; + (void)len; + (void)binary; + + std::ignore = file_names_.insert(name); + + // we want to simulate always successful save + return true; + } - std::ignore = file_names_.insert(name); + void Finish() final { + for (const auto& file_name : file_names_) { + // Just print the file names to standard output. + // No actual file is created. + std::cout << file_name << "\n"; + } + } - // we want to simulate always successful save - return true; -} + private: + std::set file_names_{}; +}; -void FileNameSaver::Finish() { - for (const auto& file_name : file_names_) { - // Just print the file names to standard output. - // No actual file is created. - std::cout << file_name << "\n"; - } +std::unique_ptr CreateFileNameCollector() { + // compiler limitations mean we can't use std::make_unique + return std::unique_ptr{new FileNameSaver()}; } } // namespace flatbuffers diff --git a/src/flatc_main.cpp b/src/flatc_main.cpp index ce9b8c4a4ed..bd35f56635b 100644 --- a/src/flatc_main.cpp +++ b/src/flatc_main.cpp @@ -187,9 +187,9 @@ int main(int argc, const char* argv[]) { // this exists here to ensure file_saver outlives the compilation process std::unique_ptr file_saver; if (options.file_names_only) { - file_saver.reset(new flatbuffers::FileNameSaver{}); + file_saver = flatbuffers::CreateFileNameCollector(); } else { - file_saver.reset(new flatbuffers::RealFileSaver{}); + file_saver = flatbuffers::CreateFileSaver(); } options.opts.file_saver = file_saver.get();