C++20 Port #5
|
@ -106,18 +106,31 @@ export namespace coral {
|
||||||
char buffer[max + 1];
|
char buffer[max + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct file_reader : public reader {
|
||||||
|
virtual expected<u64, io_error> seek(u64 offset) = 0;
|
||||||
|
|
||||||
|
virtual expected<u64, io_error> tell() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct file_writer : public writer {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Platform-generalized file system interface.
|
* Platform-generalized file system interface.
|
||||||
*/
|
*/
|
||||||
struct fs {
|
struct fs {
|
||||||
|
struct io_rules {
|
||||||
|
bool can_read;
|
||||||
|
|
||||||
|
bool can_write;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to read the file in the file system located at `file_path` relative, calling
|
* Attempts to read the file in the file system located at `file_path` relative, calling
|
||||||
* `then` if it was successfully opened for reading.
|
* `then` if it was successfully opened for reading.
|
||||||
*
|
*
|
||||||
* Once `then` returns, access to the file is closed automatically.
|
* Once `then` returns, access to the file is closed automatically.
|
||||||
*/
|
*/
|
||||||
virtual void read_file(path const & file_path,
|
virtual void read_file(path const & file_path, callable<void(file_reader &)> const & then) = 0;
|
||||||
callable<void(readable const &)> const & then) = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempts to write the file in the file system located at `file_path` relative, calling
|
* Attempts to write the file in the file system located at `file_path` relative, calling
|
||||||
|
@ -125,7 +138,6 @@ export namespace coral {
|
||||||
*
|
*
|
||||||
* Once `then` returns, access to the file is closed automatically.
|
* Once `then` returns, access to the file is closed automatically.
|
||||||
*/
|
*/
|
||||||
virtual void write_file(path const & file_path,
|
virtual void write_file(path const & file_path, callable<void(file_writer &)> const & then) = 0;
|
||||||
callable<void(writable const &)> const & then) = 0;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,14 +200,20 @@ export namespace coral {
|
||||||
/**
|
/**
|
||||||
* Writable type for appending data to a [sequence] containing [u8] values.
|
* Writable type for appending data to a [sequence] containing [u8] values.
|
||||||
*/
|
*/
|
||||||
struct sequence_writer : public writable {
|
struct sequence_writer : public writer {
|
||||||
sequence_writer(sequence<u8> * output_sequence) : writable{
|
sequence_writer(sequence<u8> * output_sequence) {
|
||||||
[output_sequence](slice<u8 const> const & buffer) -> expected<usize, io_error> {
|
this->output_sequence = output_sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
expected<usize, io_error> write(slice<u8 const> const & buffer) {
|
||||||
switch (output_sequence->append(buffer)) {
|
switch (output_sequence->append(buffer)) {
|
||||||
case append_result::ok: return buffer.length;
|
case append_result::ok: return buffer.length;
|
||||||
case append_result::out_of_memory: return io_error::unavailable;
|
case append_result::out_of_memory: return io_error::unavailable;
|
||||||
default: unreachable();
|
default: unreachable();
|
||||||
}
|
}
|
||||||
}} {}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
sequence<u8> * output_sequence;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue