From 3a377e97f9df60c8fe096ce9b01148b3ae673c1c Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 13 Jun 2022 06:51:49 +0000 Subject: [PATCH] - fixed buffer resize - added readAt() git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@949 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- radio/processor/src/Buffer.hpp | 7 +++-- radio/processor/src/Buffer.tcc | 47 ++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/radio/processor/src/Buffer.hpp b/radio/processor/src/Buffer.hpp index 585d3b2..86f065e 100644 --- a/radio/processor/src/Buffer.hpp +++ b/radio/processor/src/Buffer.hpp @@ -2,7 +2,7 @@ #define __PROCESSOR_BUFFER_HPP__ #include -#include +#include #include #include @@ -12,7 +12,8 @@ #define RETURN_OR_EXCEPT(code) return code #endif - +namespace Processor +{ class IBuffer { public: @@ -59,6 +60,7 @@ class Buffer : public IBuffer T* data_r(); size_t write(const T* pData, size_t len); size_t read(T* pData, size_t len); + Result readAt(size_t offset, T &x); Result consume(size_t len); Result produce(size_t len); void print(const char *prefix); @@ -98,5 +100,6 @@ class Buffer : public IBuffer }; #include "Buffer.tcc" +}; #endif // __PROCESSOR_BUFFER_HPP__ \ No newline at end of file diff --git a/radio/processor/src/Buffer.tcc b/radio/processor/src/Buffer.tcc index d0df06d..c6cdda9 100644 --- a/radio/processor/src/Buffer.tcc +++ b/radio/processor/src/Buffer.tcc @@ -1,6 +1,3 @@ -#include -#include -#include template Buffer::Buffer(size_t capacity) @@ -17,20 +14,33 @@ Buffer::Buffer(size_t capacity) template Buffer::~Buffer() { - delete [] m_data[0]; - delete [] m_data[1]; + resize(0); } template void Buffer::resize(size_t size) { - delete [] m_data[0]; - delete [] m_data[1]; - m_data[0] = new T[size]; - m_data[1] = new T[size]; + const size_t N = sizeof(m_data)/sizeof(m_data[0]); + for (int i=0; i < N; i++) + { + if (m_data[i] != nullptr) + { + delete m_data[i]; + m_data[i] = nullptr; + } + } m_capacity = size; - clear(); + if (size == 0) + { + return; + } + + for (int i=0; i < N; i++) + { + m_data[i] = new T[size]; + } + } template @@ -116,6 +126,23 @@ size_t Buffer::read(T* pData, size_t len) } +template +typename Buffer::Result Buffer::readAt(size_t offset, T &x) +{ + if (m_len == 0) + { + RETURN_OR_EXCEPT(Result::Err_InvalidSize); + } + size_t n = (m_ri+offset) % m_capacity; + x = data_r()[n]; + if (offset) + { + consume(1); + } + + return Result::Ok; +} + template typename Buffer::Result Buffer::consume(size_t len) {