读写安全的ringobjbuffer。 可用于做简单的任务队列。

源码地址:https://github.com/SaberMqd/naive/blob/master/include/naive/ring_object_buffer.h

需要C++11支持。

#ifndef _NAIVE_RING_OBJECT_BUF_H_
#define _NAIVE_RING_OBJECT_BUF_H_

#include <cstdint>
#include <memory>

#include "safe_delete.h"
#include "base_constructor.h"

namespace naive {

template <typename T>
class RingObjBuf {

public:
		
	explicit RingObjBuf(uint32_t len):
		_len(len+1),_beg(0),_end(0) {
		_buf = new std::unique_ptr<T>[_len];
	}

	bool Push(std::unique_ptr<T> data) {
		if ((_end + 1) % _len == _beg || !data.get()) {
			return false;
		}

		_buf[_end] = std::move(data);
		_end += 1;
		_end %= _len;

		return true;
	}

	bool Pop(std::unique_ptr<T>& data) {
		if (_beg  == _end) {
			return false;
		}
		data = std::move(_buf[_beg]);
		_beg += 1;
		_beg %= _len;
		return true;
	}

	T* Front() {
		if (_beg == _end) {
			return nullptr;
		}
		return _buf[_beg].get();
	}

	void Reset() {
		for (uint32_t i = 0; i < _len; ++i) {
			_buf[i].reset(nullptr);
		}
		_beg = 0;
		_end = 0;
	}

	uint32_t Size() {
		if (_end >= _beg) {
			return _end - _beg;
		} else {
			return _len - 1 - (_beg - _end);
		}
	}

	~RingObjBuf() {
		SafeDeleteArray(_buf);
	}

private:

	uint32_t				_beg;
	uint32_t				_end;
	uint32_t				_len;

	std::unique_ptr<T>		*_buf;

	DISALLOW_COPY_AND_ASSIGN(RingObjBuf)
};

}

#endif //_NAIVE_RING_OBJECT_BUF_H_

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值