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(); }