12 in_pos += gptr() - eback();
13 setg(buffer.data(), buffer.data(), buffer.data());
20 const ptrdiff_t n = pptr() - pbase();
23 file.
pwrite(buffer.data(), n, out_pos);
25 setp(buffer.data(), buffer.data() + buffer.size());
34 std::ios_base::seekdir dir,
35 std::ios_base::openmode which
40 if (dir == std::ios_base::beg)
42 else if (dir == std::ios_base::cur)
44 base = bool(which & std::ios_base::in)
45 ? in_pos + gptr() - eback()
46 : out_pos + pptr() - pbase();
48 else if (dir == std::ios_base::end)
51 base = file.get_size();
55 return pos_type(off_type(-1));
57 return seekpos(base + off, which);
65 std::ios_base::openmode which
70 if (which & std::ios_base::in)
73 if (which & std::ios_base::out)
92 const int64_t size = file.
get_size();
95 return size - (in_pos + gptr() - eback());
102 if (gptr() == egptr())
104 in_pos += gptr() - eback();
105 const size_t size = file.
pread(buffer.data(), buffer.size(), in_pos);
106 setg(buffer.data(), buffer.data(), buffer.data() + size);
108 return traits_type::eof();
111 return traits_type::to_int_type(*gptr());
118 std::streamsize result = 0;
121 const std::streamsize available = egptr() - gptr();
122 const std::streamsize n = std::min(available, count);
123 std::memcpy(s, gptr(), n);
136 const std::streamsize n = std::streamsize(file.
pread(s, count, in_pos));
157 const ptrdiff_t available = epptr() - pptr();
159 if (available >= count)
161 std::memcpy(pptr(), s, count);
167 file.
pwrite(s, count, out_pos);
178 if (pptr() >= epptr())
181 if (!traits_type::eq_int_type(ch, traits_type::eof()))
183 *pptr() = traits_type::to_char_type(ch);
187 return traits_type::not_eof(ch);
194 if (gptr() == eback() && in_pos > 0)
196 const pos_type previous_position = in_pos - off_type(1);
197 if (file.
pread(buffer.data(), 1, previous_position) == 1)
199 in_pos = previous_position;
200 setg(buffer.data(), buffer.data() + 1, buffer.data() + 1);
204 if (gptr() > eback())
207 if (!traits_type::eq_int_type(c, traits_type::eof()))
209 const char cc = traits_type::to_char_type(c);
213 file.
pwrite(gptr(), 1, in_pos + gptr() - eback());
216 return traits_type::to_int_type(*gptr());
219 return traits_type::eof();
227 setg(buffer.data(), buffer.data(), buffer.data());
230 setp(buffer.data(), buffer.data() + buffer.size());
237 if (pptr() > pbase())
240 try {syncp();}
catch (...) {}
virtual int64_t get_size() const
Get the size of the file, or -1 if it is unknown.
virtual void pwrite(const char *data, size_t size, int64_t offset)
Write a range of bytes. Extend file size if necessary.
virtual size_t pread(char *data, size_t size, int64_t offset) const
Read a range of bytes.
static void warning(beman::cstring_view message) noexcept
pos_type seekpos(pos_type pos, std::ios_base::openmode which) override
pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which) override
std::streamsize showmanyc() override
filebuf(Abstract_File &file)
int_type pbackfail(int_type c) override
int_type overflow(int_type ch) override
std::streamsize xsputn(const char_type *s, std::streamsize count) override
int_type underflow() override
std::streamsize xsgetn(char_type *s, std::streamsize count) override