xx

来源:互联网 发布:苹果mac电脑使用教程 编辑:程序博客网 时间:2024/04/28 00:15
// 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_tm_uiSize;size_tm_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 sizem_RingVector.m_uiSize -= m_uiLen;}}CRingVectorIterator& operator++(){T*pNext = FindNext(1);if (!pNext) {cout << "超出了范围,不设置任何" << endl;} else {m_pCurrent = pNext;}return *this;}Toperator*(){return *m_pCurrent;}T* operator+(size_t len){}private:boolIsOutOfRange(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;boolm_bBreak;T*m_pEnd;size_tm_uiLen;static size_tm_uiCount;};template <typename T>size_t CRingVectorIterator<T>::m_uiCount = 0;