|
|
|
@ -43,28 +43,17 @@ namespace rdr {
|
|
|
|
|
return end - ptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check() ensures there is buffer data for at least one item of size
|
|
|
|
|
// itemSize bytes. Returns the number of items in the buffer (up to a
|
|
|
|
|
// maximum of nItems). If wait is false, then instead of blocking to wait
|
|
|
|
|
// for the bytes, zero is returned if the bytes are not immediately
|
|
|
|
|
// available. If itemSize or nItems is zero, check() will return zero.
|
|
|
|
|
// check() ensures there is buffer data for at least needed bytes. Returns
|
|
|
|
|
// true once the data is available. If wait is false, then instead of
|
|
|
|
|
// blocking to wait for the bytes, false is returned if the bytes are not
|
|
|
|
|
// immediately available.
|
|
|
|
|
|
|
|
|
|
inline size_t check(size_t itemSize, size_t nItems=1, bool wait=true)
|
|
|
|
|
inline size_t check(size_t needed, bool wait=true)
|
|
|
|
|
{
|
|
|
|
|
size_t nAvail;
|
|
|
|
|
if (needed > avail())
|
|
|
|
|
return overrun(needed, wait);
|
|
|
|
|
|
|
|
|
|
if (itemSize == 0 || nItems == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
if (itemSize > avail())
|
|
|
|
|
return overrun(itemSize, nItems, wait);
|
|
|
|
|
|
|
|
|
|
// itemSize cannot be zero at this point
|
|
|
|
|
nAvail = avail() / itemSize;
|
|
|
|
|
if (nAvail < nItems)
|
|
|
|
|
return nAvail;
|
|
|
|
|
|
|
|
|
|
return nItems;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// checkNoWait() tries to make sure that the given number of bytes can
|
|
|
|
@ -72,10 +61,7 @@ namespace rdr {
|
|
|
|
|
// otherwise. The length must be "small" (less than the buffer size).
|
|
|
|
|
// If length is zero, checkNoWait() will return true.
|
|
|
|
|
|
|
|
|
|
inline bool checkNoWait(size_t length)
|
|
|
|
|
{
|
|
|
|
|
return length == 0 || check(length, 1, false) > 0;
|
|
|
|
|
}
|
|
|
|
|
inline bool checkNoWait(size_t length) { return check(length, false); }
|
|
|
|
|
|
|
|
|
|
// readU/SN() methods read unsigned and signed N-bit integers.
|
|
|
|
|
|
|
|
|
@ -146,13 +132,12 @@ namespace rdr {
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
// overrun() is implemented by a derived class to cope with buffer overrun.
|
|
|
|
|
// It ensures there are at least itemSize bytes of buffer data. Returns
|
|
|
|
|
// the number of items in the buffer (up to a maximum of nItems). itemSize
|
|
|
|
|
// is supposed to be "small" (a few bytes). If wait is false, then
|
|
|
|
|
// instead of blocking to wait for the bytes, zero is returned if the bytes
|
|
|
|
|
// are not immediately available.
|
|
|
|
|
// It ensures there are at least needed bytes of buffer data. Returns true
|
|
|
|
|
// once the data is available. If wait is false, then instead of blocking
|
|
|
|
|
// to wait for the bytes, false is returned if the bytes are not
|
|
|
|
|
// immediately available.
|
|
|
|
|
|
|
|
|
|
virtual size_t overrun(size_t itemSize, size_t nItems, bool wait=true) = 0;
|
|
|
|
|
virtual bool overrun(size_t needed, bool wait=true) = 0;
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
|
|