diff --git a/radio/processor/src/Buffer.hpp b/radio/processor/src/Buffer.hpp index b7e1130..2fbdf6c 100644 --- a/radio/processor/src/Buffer.hpp +++ b/radio/processor/src/Buffer.hpp @@ -61,8 +61,8 @@ class Buffer : public IBuffer T* data_w(); T* data_r(); - size_t write(const T* pData, size_t len); - size_t read(T* pData, size_t len); + Result write(const T* pData, size_t len); + Result read(T* pData, size_t len); T readAt(size_t offset); Result consume(size_t len); Result produce(size_t len); diff --git a/radio/processor/src/Buffer.tcc b/radio/processor/src/Buffer.tcc index 9e991a8..676e889 100644 --- a/radio/processor/src/Buffer.tcc +++ b/radio/processor/src/Buffer.tcc @@ -94,35 +94,35 @@ T* Buffer::data_r() } template -size_t Buffer::write(const T *pData, size_t len) +typename Buffer::Result Buffer::write(const T *pData, size_t len) { - len = std::min(free(), len); - size_t numWritten = 0; - - if (len == 0) + if (len > free()) { - throw Buffer::Exception(Result::Err_InvalidSize); + RETURN_OR_EXCEPT(Result::Err_InvalidSize); } + size_t numWritten = 0; while(len) { size_t num_remain = m_capacity - m_wi; size_t actual_len = std::min(num_remain, len); memcpy(data_w(), pData, actual_len*sizeof(T)); - produce(actual_len); len -= actual_len; pData += actual_len; numWritten += actual_len; } - return numWritten; - + return produce(numWritten); } template -size_t Buffer::read(T* pData, size_t len) +typename Buffer::Result Buffer::read(T* pData, size_t len) { - len = std::min(m_len, len); + if (len > m_len) + { + RETURN_OR_EXCEPT(Result::Err_InvalidSize); + } + size_t numRead = 0; while(len) { @@ -134,15 +134,13 @@ size_t Buffer::read(T* pData, size_t len) pData += actual_len; numRead += actual_len; } - consume(numRead); - return numRead; - + return consume(numRead); } template T Buffer::readAt(size_t offset) { - if (m_len < offset) + if (m_len < (1+offset)) { throw Buffer::Exception(Result::Err_InvalidSize); } @@ -168,7 +166,7 @@ typename Buffer::Result Buffer::consume(size_t len) template typename Buffer::Result Buffer::produce(size_t len) { - if (len > (m_capacity - m_len)) + if (len > free()) { RETURN_OR_EXCEPT(Result::Err_InvalidSize); }