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 = (which & std::ios_base::in)
43 ? in_pos + gptr() - eback()
44 : out_pos + pptr() - pbase();
46 else if (dir == std::ios_base::end)
47 base = file.get_size();
50 return pos_type(off_type(-1));
52 return seekpos(base + off, which);
60 std::ios_base::openmode which
65 if (which & std::ios_base::in)
68 if (which & std::ios_base::out)
87 const int64_t size = file.
get_size();
90 return size - (in_pos + gptr() - eback());
97 if (gptr() == egptr())
99 in_pos += gptr() - eback();
100 const size_t size = file.
pread(buffer.data(), buffer.size(), in_pos);
101 setg(buffer.data(), buffer.data(), buffer.data() + size);
103 return traits_type::eof();
106 return traits_type::to_int_type(*gptr());
113 std::streamsize result = 0;
116 const std::streamsize available = egptr() - gptr();
117 const std::streamsize n = std::min(available, count);
118 std::memcpy(s, gptr(), n);
131 const std::streamsize n = std::streamsize(file.
pread(s, count, in_pos));
152 const ptrdiff_t available = epptr() - pptr();
154 if (available >= count)
156 std::memcpy(pptr(), s, count);
162 file.
pwrite(s, count, out_pos);
173 if (pptr() >= epptr())
176 if (!traits_type::eq_int_type(ch, traits_type::eof()))
178 *pptr() = traits_type::to_char_type(ch);
182 return traits_type::not_eof(ch);
189 if (gptr() == eback() && in_pos > 0)
192 setg(buffer.data(), buffer.data() + 1, buffer.data() + 1);
193 file.
pread(buffer.data(), 1, in_pos);
196 if (gptr() > eback())
199 if (!traits_type::eq_int_type(c, traits_type::eof()))
201 const char cc = traits_type::to_char_type(c);
205 file.
pwrite(gptr(), 1, in_pos + gptr() - eback());
211 return traits_type::eof();
219 setg(buffer.data(), buffer.data(), buffer.data());
222 setp(buffer.data(), buffer.data() + buffer_size);
229 if (pptr() > pbase())
232 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(std::string_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