chore: add open_output() to file_access

This commit is contained in:
Marcus Holland-Moritz 2023-12-30 17:08:22 +01:00
parent 8a61697799
commit 61db8cec2b
4 changed files with 58 additions and 3 deletions

View File

@ -61,6 +61,11 @@ class file_access {
open_input_binary(std::filesystem::path const& path,
std::error_code& ec) const = 0;
virtual std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path) const = 0;
virtual std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path, std::error_code& ec) const = 0;
virtual std::unique_ptr<output_stream>
open_output_binary(std::filesystem::path const& path) const = 0;
virtual std::unique_ptr<output_stream>

View File

@ -70,8 +70,9 @@ class file_input_stream : public input_stream {
class file_output_stream : public output_stream {
public:
file_output_stream(std::filesystem::path const& path, std::error_code& ec)
: os_{path.string().c_str(), std::ios::binary | std::ios::trunc} {
file_output_stream(std::filesystem::path const& path, std::error_code& ec,
std::ios_base::openmode mode)
: os_{path.string().c_str(), mode} {
if (os_.bad() || os_.fail() || !os_.is_open()) {
assign_error_code(ec);
}
@ -137,10 +138,32 @@ class file_access_generic : public file_access {
return rv;
}
std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path,
std::error_code& ec) const override {
auto rv = std::make_unique<file_output_stream>(path, ec, std::ios::trunc);
if (ec) {
rv.reset();
}
return rv;
}
std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path) const override {
std::error_code ec;
auto rv = open_output(path, ec);
if (ec) {
throw std::system_error(ec,
fmt::format("open_output('{}')", path.string()));
}
return rv;
}
std::unique_ptr<output_stream>
open_output_binary(std::filesystem::path const& path,
std::error_code& ec) const override {
auto rv = std::make_unique<file_output_stream>(path, ec);
auto rv = std::make_unique<file_output_stream>(
path, ec, std::ios::binary | std::ios::trunc);
if (ec) {
rv.reset();
}

View File

@ -180,6 +180,12 @@ class test_file_access : public file_access {
std::unique_ptr<input_stream>
open_input_binary(std::filesystem::path const& path) const override;
std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path,
std::error_code& ec) const override;
std::unique_ptr<output_stream>
open_output(std::filesystem::path const& path) const override;
std::unique_ptr<output_stream>
open_output_binary(std::filesystem::path const& path,
std::error_code& ec) const override;

View File

@ -111,6 +111,27 @@ test_file_access::open_input_binary(std::filesystem::path const& path) const {
return rv;
}
std::unique_ptr<output_stream>
test_file_access::open_output(std::filesystem::path const& path,
std::error_code& ec) const {
auto rv = std::make_unique<test_output_stream>(path, ec, this);
if (ec) {
rv.reset();
}
return rv;
}
std::unique_ptr<output_stream>
test_file_access::open_output(std::filesystem::path const& path) const {
std::error_code ec;
auto rv = open_output(path, ec);
if (ec) {
throw std::system_error(ec,
fmt::format("open_output('{}')", path.string()));
}
return rv;
}
std::unique_ptr<output_stream>
test_file_access::open_output_binary(std::filesystem::path const& path,
std::error_code& ec) const {