mirror of https://github.com/EspoTek/Labrador.git
54 lines
1.5 KiB
C++
54 lines
1.5 KiB
C++
#ifndef ISOBUFFERBUFFER_H
|
|
#define ISOBUFFERBUFFER_H
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <memory>
|
|
|
|
/** @file isobufferbuffer.h
|
|
* @brief This module implements a data structure that allows
|
|
* insertion of single characters and a view of the last N
|
|
* inserted characters in constant time.
|
|
*
|
|
* To obtain such complexity, a double ring buffer is used.
|
|
* That is, two identical ring buffers are mantained adjacent
|
|
* in memory. If we always return a pointer to the beginning of a
|
|
* range that ends in the second buffer, we will always return a
|
|
* valid address(*), even when the requested length is greater
|
|
* than the current position being inserted into in the buffer.
|
|
*
|
|
* (*) By valid address I mean that both the addresses that
|
|
* represent the beginning and end of the requested query result
|
|
* are within the allocated buffer.
|
|
*/
|
|
class isoBufferBuffer
|
|
{
|
|
public:
|
|
isoBufferBuffer(uint32_t length);
|
|
~isoBufferBuffer() = default;
|
|
|
|
void insert(char c);
|
|
void insert(char const * s);
|
|
void insert(std::string const & s);
|
|
void insert_hex(uint8_t x);
|
|
|
|
char const * query(uint32_t length) const;
|
|
// TODO?: add ability to get a copy of the content
|
|
// (e.g. return std::string or Qstring)
|
|
|
|
void clear();
|
|
|
|
char const * begin() const;
|
|
char const * end() const;
|
|
|
|
uint32_t size() const;
|
|
uint32_t capacity() const;
|
|
private:
|
|
std::unique_ptr<char[]> m_data;
|
|
uint32_t m_capacity;
|
|
uint32_t m_size = 0;
|
|
uint32_t m_top = 0;
|
|
};
|
|
|
|
#endif // ISOBUFFERBUFFER_H
|