From c2128f214c3c1825136b181dacf0daf35e9796a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Mon, 13 Oct 2014 10:51:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=AD=E4=BB=A3=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=8A=A0=E5=87=8F=E6=B3=95=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TinySTL/CircularBuffer.h | 55 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/TinySTL/CircularBuffer.h b/TinySTL/CircularBuffer.h index 33d88ea..3137ded 100644 --- a/TinySTL/CircularBuffer.h +++ b/TinySTL/CircularBuffer.h @@ -23,8 +23,18 @@ namespace TinySTL{ cbPtr container_; public: cb_iter() :ptr_(0), index_(0), container_(0){} - explicit cb_iter(T *ptr, cbPtr container) : + cb_iter(T *ptr, cbPtr container) : ptr_(ptr), index_(ptr - container->start_), container_(container){} + cb_iter(const cb_iter& cit) : + ptr_(cit.ptr_), index_(cit.index_), container_(cit.container_){} + cb_iter& operator = (const cb_iter& cit){ + if (this != &cit){ + ptr_ = cit.ptr_; + index_ = cit.index_; + container_ = cit.container_; + } + return *this; + } public: operator T*(){ return ptr_; } T& operator *(){ return *ptr_; } @@ -57,33 +67,6 @@ namespace TinySTL{ bool operator != (const cb_iter& it)const{ return !((*this) == it); } - //fuck - //fuck - //fuck - //fuck - //wish to do like this, but buggy - //for (auto it = cb.first(); it <= cb.last(); ++it) - // { cout << *it << endl; } - //fuck - //fuck - //fuck - bool operator <= (const cb_iter& it)const{//fuck - if (*this == it) return true; - auto indexOfThis = ptr_ - container_->start_; - auto indexOfIt = it.ptr_ - it.container_->start_; - - if (indexOfThis < indexOfIt){ - if (container_->indexOfHead < indexOfThis || container_->indexOfHead > indexOfIt) - return true; - else if (container_->indexOfHead < indexOfIt && container_->indexOfHead > indexOfThis) - return false; - }else{//indexOfThis > indexOfIt - if (container_->indexOfHead < indexOfIt || container_->indexOfHead > indexOfThis) - return false; - else if (container_->indexOfHead < indexOfThis && container_->indexOfHead > indexOfIt) - return true; - } - } private: void setIndex_(int index){ index_ = index; } void setPtr_(T *ptr){ ptr_ = ptr; } @@ -93,7 +76,23 @@ namespace TinySTL{ index = (index == -1 ? index + N : index); return index; } + public: + friend cb_iter operator +(const cb_iter& cit, std::ptrdiff_t i); + friend cb_iter operator -(const cb_iter& cit, std::ptrdiff_t i); }; + template + cb_iter operator +(const cb_iter& cit, std::ptrdiff_t i){ + auto real_i = i % N; + cb_iter res = *this; + res.setIndex_(res.index_ + real_i); + res.setPtr_(res.ptr_ + res.index_); + return res; + } + template + cb_iter operator -(const cb_iter& cit, std::ptrdiff_t i){ + cb_iter res = *this; + return (res + (-i)); + } }//end of anonymous namespace //circular buffer