10 in_pos += gptr() - eback();
11 setg(buffer.data(), buffer.data(), buffer.data());
18 const ptrdiff_t n = pptr() - pbase();
21 file.
pwrite(buffer.data(), n, out_pos);
23 setp(buffer.data(), buffer.data() + buffer_size);
32 std::ios_base::seekdir dir,
33 std::ios_base::openmode which
38 if (dir == std::ios_base::beg)
40 else if (dir == std::ios_base::cur)
42 base = bool(which & std::ios_base::in)
43 ? in_pos + gptr() - eback()
44 : out_pos + pptr() - pbase();
46 else if (dir == std::ios_base::end)
49 base = file.get_size();
53 return pos_type(off_type(-1));
55 return seekpos(base + off, which);
63 std::ios_base::openmode which
68 if (which & std::ios_base::in)
71 if (which & std::ios_base::out)
90 const int64_t size = file.
get_size();
93 return size - (in_pos + gptr() - eback());
100 if (gptr() == egptr())
102 in_pos += gptr() - eback();
103 const size_t size = file.
pread(buffer.data(), buffer.size(), in_pos);
104 setg(buffer.data(), buffer.data(), buffer.data() + size);
106 return traits_type::eof();
109 return traits_type::to_int_type(*gptr());
116 std::streamsize result = 0;
119 const std::streamsize available = egptr() - gptr();
120 const std::streamsize n = std::min(available, count);
121 std::memcpy(s, gptr(), n);
134 const std::streamsize n = std::streamsize(file.
pread(s, count, in_pos));
155 const ptrdiff_t available = epptr() - pptr();
157 if (available >= count)
159 std::memcpy(pptr(), s, count);
165 file.
pwrite(s, count, out_pos);
176 if (pptr() >= epptr())
179 if (!traits_type::eq_int_type(ch, traits_type::eof()))
181 *pptr() = traits_type::to_char_type(ch);
185 return traits_type::not_eof(ch);
192 if (gptr() == eback() && in_pos > 0)
195 setg(buffer.data(), buffer.data() + 1, buffer.data() + 1);
196 file.
pread(buffer.data(), 1, in_pos);
199 if (gptr() > eback())
202 if (!traits_type::eq_int_type(c, traits_type::eof()))
204 const char cc = traits_type::to_char_type(c);
208 file.
pwrite(gptr(), 1, in_pos + gptr() - eback());
211 return traits_type::to_int_type(*gptr());
214 return traits_type::eof();
222 setg(buffer.data(), buffer.data(), buffer.data());
225 setp(buffer.data(), buffer.data() + buffer_size);
232 if (pptr() > pbase())
235 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