git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1068 b431acfa-c32f-4a4a-93f1-934dc6c82436
92 lines
1.4 KiB
C++
92 lines
1.4 KiB
C++
#ifndef __PROCESSOR_BUFFER_HPP__
|
|
#define __PROCESSOR_BUFFER_HPP__
|
|
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <algorithm>
|
|
#include "Exception.hpp"
|
|
|
|
#ifdef PROCESSOR_BUFFER_USE_EXCEPTIONS
|
|
#define RETURN_OR_EXCEPT(code) EXC_EXCEPT(code)
|
|
#else
|
|
#define RETURN_OR_EXCEPT(code) return code
|
|
#endif
|
|
|
|
namespace Processor
|
|
{
|
|
|
|
class IBuffer
|
|
{
|
|
public:
|
|
virtual ~IBuffer() = default;
|
|
};
|
|
|
|
template <typename T>
|
|
class Buffer : public IBuffer
|
|
{
|
|
public:
|
|
enum Result
|
|
{
|
|
Ok=0,
|
|
Err_InvalidSize=1
|
|
};
|
|
|
|
Buffer(size_t capacity=0);
|
|
~Buffer();
|
|
Buffer(const Buffer<T> &rhs) = delete;
|
|
|
|
void resize(size_t size);
|
|
void fill(T value);
|
|
size_t len();
|
|
size_t free();
|
|
size_t capacity();
|
|
void clear();
|
|
|
|
T* data_w();
|
|
T* data_r();
|
|
|
|
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);
|
|
void print(const char *prefix);
|
|
void make_contigious()
|
|
{
|
|
if (m_len == 0)
|
|
{
|
|
return;
|
|
}
|
|
size_t cont_len = std::min(m_capacity - m_ri, m_len);
|
|
if (cont_len < m_len)
|
|
{
|
|
m_wi = m_len;
|
|
read(bufferStdBy(), m_len);
|
|
m_ri = 0;
|
|
m_len = m_wi;
|
|
m_bid = !m_bid & 1;
|
|
}
|
|
}
|
|
T *bufferActive()
|
|
{
|
|
return m_data[m_bid];
|
|
}
|
|
|
|
private:
|
|
size_t m_capacity;
|
|
size_t m_len;
|
|
size_t m_wi;
|
|
size_t m_ri;
|
|
size_t m_bid;
|
|
T *m_data[2];
|
|
|
|
T *bufferStdBy()
|
|
{
|
|
return m_data[!m_bid & 1];
|
|
}
|
|
};
|
|
|
|
#include "Buffer.tcc"
|
|
};
|
|
|
|
#endif // __PROCESSOR_BUFFER_HPP__
|