26static int calcBufferStreamBufferSize (
int requestedSize, InputStream* source)
noexcept
43 bufferedRange (sourceStream->getPosition(), sourceStream->getPosition()),
44 position (bufferedRange.getStart()),
45 bufferLength (calcBufferStreamBufferSize (size, sourceStream))
47 buffer.
malloc (bufferLength);
60 if (! ensureBuffered())
63 return position < lastReadPos ? buffer[(
int) (position - bufferedRange.
getStart())] : 0;
68 return source->getTotalLength();
84 return position >= lastReadPos && source->isExhausted();
87bool BufferedInputStream::ensureBuffered()
95 if (position < lastReadPos
97 && position >= bufferedRange.
getStart())
108 lastReadPos += bytesRead;
113 if (! source->setPosition (position))
116 bytesRead = (
int) source->read (buffer, (
size_t) bufferLength);
121 lastReadPos = position + bytesRead;
124 bufferedRange = Range<int64> (position, lastReadPos);
126 while (bytesRead < bufferLength)
127 buffer[bytesRead++] = 0;
159 return (
int) bytesRead;
164 if (position >= bufferedRange.
getStart()
165 && position < lastReadPos)
167 auto maxChars = (
int) (lastReadPos - position);
168 auto* src = buffer + (
int) (position - bufferedRange.
getStart());
170 for (
int i = 0; i < maxChars; ++i)
190 template <
typename Fn,
size_t...
Ix,
typename Values>
193 fn (std::get<Ix> (values)...);
196 template <
typename Fn,
typename...
Values>
202 template <
typename Fn,
typename Values>
208 template <
typename Fn,
typename Values,
typename Range,
typename...
Ranges>
211 for (
auto& item : range)
215 template <
typename Fn,
typename...
Ranges>
225 void runTest()
override
227 const MemoryBlock
testBufferA (
"abcdefghijklmnopqrstuvwxyz", 26);
231 MemoryBlock
mb { 8192 };
232 auto r = getRandom();
236 item = (char) r.nextInt (std::numeric_limits<char>::max());
246 const auto runTest = [
this] (
const MemoryBlock&
data,
const int readSize,
const bool peek)
248 MemoryInputStream
mi (data,
true);
250 BufferedInputStream stream (
mi,
jmin (200, (
int)
data.getSize()));
254 expectEquals (stream.getPosition(), (
int64) 0);
255 expectEquals (stream.getTotalLength(), (
int64)
data.getSize());
256 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
257 expect (! stream.isExhausted());
279 expectEquals (stream.getPosition(), (
int64)
data.getSize());
280 expectEquals (stream.getNumBytesRemaining(), (
int64) 0);
281 expect (stream.isExhausted());
287 stream.setPosition (0);
288 expectEquals (stream.getPosition(), (
int64) 0);
289 expectEquals (stream.getTotalLength(), (
int64)
data.getSize());
290 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
291 expect (! stream.isExhausted());
309 expectEquals (stream.getPosition(), (
int64)
data.getSize());
310 expectEquals (stream.getNumBytesRemaining(), (
int64) 0);
311 expect (stream.isExhausted());
void malloc(SizeType newNumElements, size_t elementSize=sizeof(ElementType))
Allocates a specified amount of memory.
A general-purpose range object, that simply represents any linear range with a start and end point.
constexpr ValueType getStart() const noexcept
Returns the start of the range.
static String fromUTF8(const char *utf8buffer, int bufferSizeBytes=-1)
Creates a String from a UTF-8 encoded buffer.
This is a base class for classes that perform a unit test.
constexpr Type jmin(Type a, Type b)
Returns the smaller of two values.
constexpr Type jmax(Type a, Type b)
Returns the larger of two values.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...
long long int64
A platform-independent 64-bit integer type.
static Range< Index > doBufferedRead(Range< Index > rangeToRead, GetBufferedRange &&getBufferedRange, ReadFromReservoir &&readFromReservoir, FillReservoir &&fillReservoir)
Attempts to read the requested range from some kind of input stream, with intermediate buffering in a...