mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-12 13:59:46 -04:00
chore: add open_output() to file_access
This commit is contained in:
parent
8a61697799
commit
61db8cec2b
@ -61,6 +61,11 @@ class file_access {
|
|||||||
open_input_binary(std::filesystem::path const& path,
|
open_input_binary(std::filesystem::path const& path,
|
||||||
std::error_code& ec) const = 0;
|
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>
|
virtual std::unique_ptr<output_stream>
|
||||||
open_output_binary(std::filesystem::path const& path) const = 0;
|
open_output_binary(std::filesystem::path const& path) const = 0;
|
||||||
virtual std::unique_ptr<output_stream>
|
virtual std::unique_ptr<output_stream>
|
||||||
|
@ -70,8 +70,9 @@ class file_input_stream : public input_stream {
|
|||||||
|
|
||||||
class file_output_stream : public output_stream {
|
class file_output_stream : public output_stream {
|
||||||
public:
|
public:
|
||||||
file_output_stream(std::filesystem::path const& path, std::error_code& ec)
|
file_output_stream(std::filesystem::path const& path, std::error_code& ec,
|
||||||
: os_{path.string().c_str(), std::ios::binary | std::ios::trunc} {
|
std::ios_base::openmode mode)
|
||||||
|
: os_{path.string().c_str(), mode} {
|
||||||
if (os_.bad() || os_.fail() || !os_.is_open()) {
|
if (os_.bad() || os_.fail() || !os_.is_open()) {
|
||||||
assign_error_code(ec);
|
assign_error_code(ec);
|
||||||
}
|
}
|
||||||
@ -137,10 +138,32 @@ class file_access_generic : public file_access {
|
|||||||
return rv;
|
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>
|
std::unique_ptr<output_stream>
|
||||||
open_output_binary(std::filesystem::path const& path,
|
open_output_binary(std::filesystem::path const& path,
|
||||||
std::error_code& ec) const override {
|
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) {
|
if (ec) {
|
||||||
rv.reset();
|
rv.reset();
|
||||||
}
|
}
|
||||||
|
@ -180,6 +180,12 @@ class test_file_access : public file_access {
|
|||||||
std::unique_ptr<input_stream>
|
std::unique_ptr<input_stream>
|
||||||
open_input_binary(std::filesystem::path const& path) const override;
|
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>
|
std::unique_ptr<output_stream>
|
||||||
open_output_binary(std::filesystem::path const& path,
|
open_output_binary(std::filesystem::path const& path,
|
||||||
std::error_code& ec) const override;
|
std::error_code& ec) const override;
|
||||||
|
@ -111,6 +111,27 @@ test_file_access::open_input_binary(std::filesystem::path const& path) const {
|
|||||||
return rv;
|
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>
|
std::unique_ptr<output_stream>
|
||||||
test_file_access::open_output_binary(std::filesystem::path const& path,
|
test_file_access::open_output_binary(std::filesystem::path const& path,
|
||||||
std::error_code& ec) const {
|
std::error_code& ec) const {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user