From 48976fff88b05c2eda807337f0d6a8b0aaf8fa39 Mon Sep 17 00:00:00 2001 From: Henrik Stickann <4376396-Mithradir@users.noreply.gitlab.com> Date: Wed, 27 Apr 2022 18:34:42 +0200 Subject: [PATCH] Add FIFO buffer type --- include/sta/fifo_buffer.hpp | 97 +++++++++++++++++++++++++++++++++ include/sta/fifo_buffer.tpp | 103 ++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 include/sta/fifo_buffer.hpp create mode 100644 include/sta/fifo_buffer.tpp diff --git a/include/sta/fifo_buffer.hpp b/include/sta/fifo_buffer.hpp new file mode 100644 index 0000000..b0db3a8 --- /dev/null +++ b/include/sta/fifo_buffer.hpp @@ -0,0 +1,97 @@ +#ifndef STA_FIFO_BUFFER_HPP +#define STA_FIFO_BUFFER_HPP + + +namespace sta +{ + /** + * @brief FIFO buffer. + * + * @tparam Size Size type + * @tparam N Buffer size + */ + template + class FifoBuffer + { + public: + using size_type = Size; + static constexpr size_type MAX_SIZE = N; + + public: + FifoBuffer(); + FifoBuffer(const uint8_t * buffer, Size size); + + /** + * @brief Clear buffer content. + */ + void clear(); + + /** + * @brief Set data in buffer. + * + * @param buffer Source buffer + * @param size Number of bytes to write + */ + void set(const uint8_t * buffer, size_type size); + + /** + * @brief Append value to end of buffer. + * + * @param value Value + */ + void pushBack(uint8_t value); + /** + * @brief Append data to end of buffer. + * + * @param buffer Source buffer + * @param size Number of bytes to write + */ + void pushBack(const uint8_t * buffer, size_type size); + /** + * @brief Append value repeatedly to end of buffer. + * + * @param value Fill value + * @param count Repeat count + */ + void pushBack(uint8_t value, size_type count); + + /** + * @brief Take data from start of buffer. + * + * @param buffer Destination buffer + * @param size Number of bytes to read + */ + void popFront(uint8_t * buffer, size_type size); + + /** + * @brief Get size of data in buffer. + * + * @return Data size + */ + size_type size() const; + + /** + * @brief Check if buffer is full. + * + * @return True if buffer is full + */ + bool isFull() const; + /** + * @brief Check if buffer is empty. + * + * @return True if buffer is empty + */ + bool isEmpty() const; + + private: + uint8_t * head_; /**< Read position */ + uint8_t * tail_; /**< Write position */ + uint8_t buffer_[N]; /**< Buffer data */ + }; +} // namespace sta + + +#include + + +#endif // STA_FIFO_BUFFER_HPP diff --git a/include/sta/fifo_buffer.tpp b/include/sta/fifo_buffer.tpp new file mode 100644 index 0000000..b593d53 --- /dev/null +++ b/include/sta/fifo_buffer.tpp @@ -0,0 +1,103 @@ +#ifndef STA_FIFO_BUFFER_TPP +#define STA_FIFO_BUFFER_TPP + +#ifndef STA_FIFO_BUFFER_HPP +# error "Internal header. Include instead" +#endif // !STA_FIFO_BUFFER_HPP + +#include + + +namespace sta +{ + template + FifoBuffer::FifoBuffer() + : head_{buffer_}, tail_{buffer_} + {} + + template + FifoBuffer::FifoBuffer(const uint8_t * buffer, size_type size) + { + set(buffer, size); + } + + + template + void FifoBuffer::set(const uint8_t * buffer, size_type bsize) + { + STA_ASSERT(bsize <= sizeof(buffer_)); + STA_ASSERT(buffer != nullptr); + + head_ = buffer_; + tail_ = buffer_ + bsize; + memcpy(buffer_, buffer, bsize); + } + + template + void FifoBuffer::clear() + { + head_ = tail_ = buffer_; + } + + + template + void FifoBuffer::pushBack(uint8_t value) + { + STA_ASSERT_MSG(tail_ < buffer_ + sizeof(buffer_), "Buffer overflow"); + + *tail_++ = value; + } + + template + void FifoBuffer::pushBack(const uint8_t * buffer, size_type bsize) + { + STA_ASSERT_MSG(size() + bsize <= sizeof(buffer_), "Buffer overflow"); + STA_ASSERT(buffer != nullptr); + + memcpy(tail_, buffer, bsize); + tail_ += bsize; + } + + template + void FifoBuffer::pushBack(uint8_t value, size_type count) + { + STA_ASSERT_MSG(size() + count <= sizeof(buffer_), "Buffer overflow"); + + memset(tail_, value, count); + tail_ += count; + } + + + template + void FifoBuffer::popFront(uint8_t * buffer, size_type bsize) + { + STA_ASSERT_MSG(size() >= bsize, "Not enough data"); + STA_ASSERT(buffer != nullptr); + + memcpy(buffer, head_, bsize); + head_ += bsize; + } + + + template + typename FifoBuffer::size_type FifoBuffer::size() const + { + return (tail_ - head_); + } + + + template + bool FifoBuffer::isFull() const + { + return (tail_ == buffer_ + sizeof(buffer_)); + } + + template + bool FifoBuffer::isEmpty() const + { + return (head_ == tail_); + } +} // namespace sta + + +#endif // STA_FIFO_BUFFER_TPP