12 if (!
m_file)
throw std::ios_base::failure(
"AutoFile::read: file handle is nullptr");
16 const auto init_pos{std::ftell(
m_file)};
17 if (init_pos < 0)
throw std::ios_base::failure(
"AutoFile::read: ftell failed");
27 throw std::ios_base::failure(
feof() ?
"AutoFile::read: end of file" :
"AutoFile::read: fread failed");
33 if (!
m_file)
throw std::ios_base::failure(
"AutoFile::ignore: file handle is nullptr");
34 unsigned char data[4096];
36 size_t nNow = std::min<size_t>(nSize,
sizeof(data));
37 if (std::fread(data, 1, nNow,
m_file) != nNow) {
38 throw std::ios_base::failure(
feof() ?
"AutoFile::ignore: end of file" :
"AutoFile::ignore: fread failed");
46 if (!
m_file)
throw std::ios_base::failure(
"AutoFile::write: file handle is nullptr");
49 throw std::ios_base::failure(
"AutoFile::write: write failed");
52 auto current_pos{std::ftell(
m_file)};
53 if (current_pos < 0)
throw std::ios_base::failure(
"AutoFile::write: ftell failed");
54 std::array<std::byte, 4096> buf;
55 while (src.
size() > 0) {
56 auto buf_now{
Span{buf}.
first(std::min<size_t>(src.
size(), buf.size()))};
57 std::copy(src.
begin(), src.
begin() + buf_now.size(), buf_now.begin());
59 if (std::fwrite(buf_now.data(), 1, buf_now.size(),
m_file) != buf_now.size()) {
60 throw std::ios_base::failure{
"XorFile::write: failed"};
62 src = src.
subspan(buf_now.size());
63 current_pos += buf_now.
size();
void ignore(size_t nSize)
void read(Span< std::byte > dst)
const std::vector< std::byte > m_xor
std::size_t detail_fread(Span< std::byte > dst)
Implementation detail, only used internally.
void write(Span< const std::byte > src)
A Span is an object that can refer to a contiguous sequence of objects.
constexpr std::size_t size() const noexcept
constexpr C * data() const noexcept
constexpr C * begin() const noexcept
CONSTEXPR_IF_NOT_DEBUG Span< C > first(std::size_t count) const noexcept
CONSTEXPR_IF_NOT_DEBUG Span< C > subspan(std::size_t offset) const noexcept
void Xor(Span< std::byte > write, Span< const std::byte > key, size_t key_offset=0)