C++リング配列
2785 ワード
#ifndef RING_H
#define RING_H
#include
#include
namespace RingBuffer {
template
class ring_api {
public:
ring_api() :m_0(0), m_1(), m_s(0)
{};
void push_back(const T &t);
void pop_front();
size_t get_m0() { return m_0; };
size_t get_m1() { return m_1; };
size_t get_ms() { return m_s; };
T &front() {
return m_data[m_0];
};
const T &front() const {
return m_data[m_0];
};
T &back() {
return m_data[m_1];
};
const T &back() const {
return m_data[m_1];
};
virtual size_t capacity() const = 0;
size_t size() const {
return m_s;
};
bool empty() const {
return size() == 0;
};
const T &at(size_t i) const {
assert(i < m_s);
return m_data[index(m_0 + i)];
};
const T &operator[](size_t i) const
{
return at(i);
};
T &operator[](size_t i) {
assert(i < m_s);
return m_data[index(m_0 + i)];
}
protected:
size_t m_0, m_1;//
size_t m_s;
C m_data;
size_t index(size_t i) const
{
return i < capacity() ? i : i - capacity();
}
};
template
class ring : public ring_api > {
//using ring_api >::m_data;
public:
ring(size_t capacity) : ring_api >() {
m_data.reserve(capacity);
m_data.resize(capacity);
}
size_t capacity() const {
return m_data.size();
}
};
template
class static_ring : public ring_api {
using ring_api::m_data;
public:
static_ring() : ring_api() {}
size_t capacity() const {
return N;
}
};
template
void ring_api::push_back(const T &t) {
if (empty()) {
m_0 = m_1 = 0;
m_data[m_0] = t;
m_s = 1;
}
else if(m_s == capacity()) {
m_data[m_0] = t;
m_0 = index(++m_0);
m_1 = index(++m_1);
}
else {
m_data[index(m_0 + m_s)] = t;
++m_1;
++m_s;
}
}
template
void ring_api::pop_front() {
assert(!empty());
if (empty())
return;
m_data[m_0] = T();
m_0 = index(++m_0);
--m_s;
}
}//namespace RingBuffer
#endif
使用
#include
#include "ring.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
RingBuffer::ring buffer(6);
for (int i = 0; i < 18; i++) {
buffer.push_back(i);
printf("=======================
");
printf("m_0=%d
", buffer.get_m0());
printf("m_1=%d
", buffer.get_m1());
printf("m_s=%d
", buffer.get_ms());
printf("
");
}
return a.exec();
}