26static inline int calcBufferStreamBufferSize (
int requestedSize, InputStream* source)
noexcept
29 jassert (source !=
nullptr);
31 requestedSize = jmax (256, requestedSize);
32 auto sourceSize = source->getTotalLength();
34 if (sourceSize >= 0 && sourceSize < requestedSize)
35 return jmax (32, (
int) sourceSize);
43 bufferSize (calcBufferStreamBufferSize (size, sourceStream)),
44 position (sourceStream->getPosition()),
45 bufferStart (position)
47 buffer.
malloc (bufferSize);
62 if (! ensureBuffered())
65 return position < lastReadPos ? buffer[(
int) (position - bufferStart)] : 0;
70 return source->getTotalLength();
86 return position >= lastReadPos && source->isExhausted();
89bool BufferedInputStream::ensureBuffered()
97 if (position < lastReadPos
99 && position >= bufferStart)
104 bufferStart = position;
116 bufferStart = position;
118 if (! source->setPosition (bufferStart))
121 bytesRead = source->read (buffer, bufferSize);
126 lastReadPos = bufferStart + bytesRead;
129 while (bytesRead < bufferSize)
130 buffer[bytesRead++] = 0;
140 if (position >= bufferStart
149 if (! ensureBuffered())
169 if (! ensureBuffered()
180 if (position >= bufferStart
181 && position < lastReadPos)
184 auto*
src = buffer + (
int) (position - bufferStart);
207 :
UnitTest (
"BufferedInputStream", UnitTestCategories::streams)
210 void runTest()
override
212 const MemoryBlock
data (
"abcdefghijklmnopqrstuvwxyz", 26);
213 MemoryInputStream
mi (
data,
true);
215 BufferedInputStream stream (
mi, (
int)
data.getSize());
219 expectEquals (stream.getPosition(), (int64) 0);
220 expectEquals (stream.getTotalLength(), (int64)
data.getSize());
221 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
222 expect (! stream.isExhausted());
233 expectEquals (stream.getPosition(), (int64)
numBytesRead);
234 expectEquals (stream.getNumBytesRemaining(), (int64) (
data.getSize() -
numBytesRead));
238 expectEquals (stream.getPosition(), (int64)
data.getSize());
239 expectEquals (stream.getNumBytesRemaining(), (int64) 0);
240 expect (stream.isExhausted());
246 stream.setPosition (0);
247 expectEquals (stream.getPosition(), (int64) 0);
248 expectEquals (stream.getTotalLength(), (int64)
data.getSize());
249 expectEquals (stream.getNumBytesRemaining(), stream.getTotalLength());
250 expect (! stream.isExhausted());
263 expectEquals (stream.getPosition(), (int64)
numBytesRead);
264 expectEquals (stream.getNumBytesRemaining(), (int64) (
data.getSize() -
numBytesRead));
268 expectEquals (stream.getPosition(), (int64)
data.getSize());
269 expectEquals (stream.getNumBytesRemaining(), (int64) 0);
270 expect (stream.isExhausted());
274static BufferedInputStreamTests bufferedInputStreamTests;
ElementType * data() noexcept
void malloc(SizeType newNumElements, size_t elementSize=sizeof(ElementType))
static String fromUTF8(const char *utf8buffer, int bufferSizeBytes=-1)