RingBuffer

// PHZ
// 2018-5-15

#ifndef _RING_BUFFER_H
#define _RING_BUFFER_H

#include <vector>
#include <memory>
#include <atomic>
#include <iostream>

template <typename T>
class RingBuffer
{
public:
    RingBuffer(unsigned capacity=60)
        : _buffer(capacity)
        , _capacity(capacity)
        , _numDatas(0)
    { }
	
    ~RingBuffer() {	}

    bool push(const T& data) { return pushData(std::forward<T>(data)); } 	
    bool push(T&& data) { return pushData(data); } 
        
    bool pop(T& data)
    {
        if(_numDatas > 0)
        {
            data = std::move(_buffer[_getPos]);
            add(_getPos);
            _numDatas--;
            return true;
        }

        return false;
    }	

    bool isFull()  const { return ((_numDatas==_capacity)?true:false); }	
    bool isEmpty() const { return ((_numDatas==0)?true:false); }
    int size() const { return _numDatas; }
	
private:		
	template <typename F>
	bool pushData(F&& data)
	{
        if (_numDatas < _capacity)
        {
        _buffer[_putPos] = std::forward<F>(data);
        add(_putPos);
        _numDatas++;
        return true;
        }

        return false;
	}

    void add(int& pos)
    {	
        pos = (((pos+1)==_capacity) ? 0 : (pos+1));
    }

    int _capacity = 0;	
    int _putPos   = 0;  					
    int _getPos   = 0;  		

    std::atomic_int _numDatas;     			
    std::vector<T> _buffer;	
};

#endif

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值