xx

// CCRingVectorIterator.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

#include "CRingVectorIterator.h"
#include "CRingVector.h"

CRingVector<int>				g_cRingVector(5);
CRingVectorIterator<int>		g_cRingVectorIt(g_cRingVector, 2);

int _tmain(int argc, _TCHAR* argv[])
{
	g_cRingVector.push_back(1);
	g_cRingVector.push_back(2);
	g_cRingVector.push_back(3);
	g_cRingVector.push_back(4);
	g_cRingVector.push_back(5);
	cout << *g_cRingVectorIt << endl;
	cout << *(++g_cRingVectorIt) << endl;
	return 0;
}
#pragma once

//template <typename T>
//class CCRingVectorIterator<T>;

template <typename T>
class CRingVector
{
//public:
//	friend class CCRingVectorIterator<T>;

public:
	CRingVector(size_t capacity)
		: m_uiCapacity(capacity)
		//, m_pDataFront(new int[5]) //TODO:new T[capacity]
		//, m_pDataRear(m_pDataFront+m_uiCapacity)
		//, m_uiSize(0)
		//, m_pConsummerStart(m_pDataFront)
		//, m_pProducerStart(m_pDataFront)
	{
		m_pDataFront = new int[5]; //TODO:new T[capacity]
		m_pDataRear = m_pDataFront+m_uiCapacity;
		m_uiSize = 0;
		m_pConsummerStart = m_pDataFront;
		m_pProducerStart = m_pDataFront;
	}

	~CRingVector()
	{
		delete m_pDataFront;
	}

	void push_back(const T& data)
	{
		if (m_uiSize && m_pConsummerStart == m_pProducerStart) {
			cout << "out of flow,then not insert." << endl;
			return ;
		} else {
			*m_pProducerStart = data;
			m_pProducerStart = NextInsertPosition();
			//lock();
			m_uiSize++;
			//unlock();
		}
	}

	bool IsEmpty()
	{
		return (m_uiSize==0);
	}


public://private:
	///返回插入位置
	T* NextInsertPosition()
	{
		T* pNextInsertPos = ((m_pProducerStart+1) == m_pDataRear ? m_pDataFront : (m_pProducerStart+1));
		return pNextInsertPos;
	}

public://private:
	T*				m_pDataFront;
	T*				m_pDataRear;

	size_t					m_uiSize;
	size_t					m_uiCapacity;

	///消费者消费起始位置
	T*						m_pConsummerStart;
	///生产者插入位置
	T*						m_pProducerStart;
};

#pragma once

#include "CRingVector.h"

template <typename T>
class CRingVectorIterator
{
public:
	CRingVectorIterator(CRingVector<T>& v, size_t len) 
		: m_RingVector(v)
	{
		m_pStart = m_RingVector.m_pConsummerStart;
		m_pCurrent = m_RingVector.m_pConsummerStart;
		m_bBreak = false;
		m_uiLen = len;


		//lock();
		m_uiCount++;
		if (m_RingVector.IsEmpty()) {
			cout << "There is no datas" << endl;
		}

		///防止超过消费能力
		if (m_uiLen > m_RingVector.m_uiSize) {
			m_uiLen = m_RingVector.m_uiSize;
		}

		if (m_pStart+len <= m_RingVector.m_pDataRear) {	///没有超过数组的最后一个
			m_pEnd = m_pStart + m_uiLen;
		} else {										///超过
			m_bBreak = true;
			m_pEnd = (m_RingVector.m_pDataRear-m_pStart)+m_RingVector.m_pDataFront;
		}
	}

	CRingVectorIterator(const CRingVectorIterator& it)
	{
		m_RingVector = it.m_RingVector;
		m_pCurrent = it.m_pCurrent;
		m_pStart = it.m_pStart;
		m_pEnd = it.m_pEnd;
		m_uiLen = it.m_uiLen;
	}

	~CRingVectorIterator()
	{
		m_uiCount--;
		if (!m_uiCount) {
			m_RingVector.m_pConsummerStart = m_pEnd;
			//TODO:modify size
			m_RingVector.m_uiSize -= m_uiLen;
		}
	}

	CRingVectorIterator& operator++()
	{
		T*		pNext = FindNext(1);
		if (!pNext) {
			cout << "超出了范围,不设置任何" << endl;
		} else {
			m_pCurrent = pNext;
		}
		return *this;
	}

	T					operator*()
	{
		return *m_pCurrent;
	}

	T* operator+(size_t len)
	{

	}

private:
	bool	IsOutOfRange(const T* p) const 
	{
		bool bRet = false;

		if (!m_bBreak) {
			bRet = (p >= m_pStart && p < m_pEnd) ? false :true;
		} else {
			bRet = (p >= m_pEnd && p < m_pStart) ? true : false;
		}
		return bRet;
	}

	T*		FindNext(int i) const 
	{
		T*			pNext = m_pCurrent+i;
		if (m_bBreak) {
			if (pNext < m_RingVector.m_pDataFront) {
				pNext = m_RingVector.m_pDataRear - (m_RingVector.m_pDataFront-pNext);
			} else if (pNext >= m_RingVector.m_pDataRear) {
				pNext = pNext-m_RingVector.m_pDataRear+m_RingVector.m_pDataFront;
			}
			if (IsOutOfRange(pNext))
				pNext = NULL;
		} else {
			if (IsOutOfRange(pNext)) 
				pNext = NULL;
		}
		return pNext;
	}
private:
	CRingVector<T>&				m_RingVector;

	T*							m_pCurrent;

	T*							m_pStart;
	bool						m_bBreak;
	T*							m_pEnd;
	size_t						m_uiLen;

	static size_t				m_uiCount;
};

template <typename T>
size_t CRingVectorIterator<T>::m_uiCount = 0;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值