7 #pragma warning(disable : 4365 4987)
17template<
class TStream, std::
size_t BufferSize = 4096ul>
29 setg(bufferEnd, bufferEnd, bufferEnd);
32 std::streamsize
xsgetn(
CharType* destination, std::streamsize size)
override {
37 std::streamsize bytesNeeded = size;
40 if (gptr() < egptr()) {
41 const std::size_t bytesInBuffer =
static_cast<std::size_t
>(egptr() - gptr());
42 const std::size_t bytesToCopy = std::min(
static_cast<std::size_t
>(bytesNeeded), bytesInBuffer);
43 std::memcpy(destination, gptr(), bytesToCopy);
44 destination += bytesToCopy;
45 bytesNeeded -=
static_cast<std::streamsize
>(bytesToCopy);
46 gbump(
static_cast<IntType>(bytesToCopy));
50 if (bytesNeeded > 0) {
51 const auto bytesRead =
52 static_cast<std::streamsize
>(
stream->read(destination,
static_cast<std::size_t
>(bytesNeeded)));
53 bytesNeeded -= bytesRead;
59 return size - bytesNeeded;
63 if (gptr() < egptr()) {
64 return TraitsType::to_int_type(*gptr());
67 char* base =
buffer.data();
73 if (eback() == base) {
74 std::memcpy(base, egptr() - 1ul, 1ul);
79 const std::size_t bytesRead =
stream->read(start,
buffer.size() -
static_cast<std::size_t
>(start - base));
80 if (bytesRead == 0ul) {
81 return TraitsType::eof();
84 setg(base, start, start + bytesRead);
85 return TraitsType::to_int_type(*gptr());
89 return static_cast<std::streamsize
>(
stream->size() -
stream->tell());