From e435631d95ab73e0ae381aef628d9da73f50dcbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Thu, 23 Oct 2014 11:06:13 +0800 Subject: [PATCH] dq_iter swap bug fix --- TinySTL/Deque.h | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/TinySTL/Deque.h b/TinySTL/Deque.h index 0f52bf3..3a06592 100644 --- a/TinySTL/Deque.h +++ b/TinySTL/Deque.h @@ -34,6 +34,11 @@ namespace TinySTL{ } return *this; } + void swap(dq_iter& it){ + TinySTL::swap(mapIndex_, it.mapIndex_); + TinySTL::swap(cur_, it.cur_); + //TinySTL::swap(container_, it.container_); + } reference operator *(){ return *cur_; } pointer operator ->(){ return &(operator*()); } dq_iter& operator ++(){ @@ -99,6 +104,8 @@ namespace TinySTL{ friend dq_iter operator - (typename dq_iter::difference_type n, const dq_iter& it); template friend typename dq_iter::difference_type operator - (const dq_iter& it1, const dq_iter& it2); + template + friend void swap(dq_iter& lhs, dq_iter& rhs); }; template dq_iter operator + (const dq_iter& it, typename dq_iter::difference_type n){//assume n >= 0 @@ -144,6 +151,10 @@ namespace TinySTL{ return typename dq_iter::difference_type(it1.getBuckSize()) * (it1.mapIndex_ - it2.mapIndex_ - 1) + (it1.cur_ - it1.getBuckHead(it1.mapIndex_)) + (it2.getBuckTail(it2.mapIndex_) - it2.cur_) + 1; } + template + void swap(dq_iter& lhs, dq_iter& rhs){ + lhs.swap(rhs); + } } //class of deque @@ -266,14 +277,6 @@ namespace TinySTL{ template friend bool operator!= (const deque& lhs, const deque& rhs); template - friend bool operator< (const deque& lhs, const deque& rhs); - template - friend bool operator<= (const deque& lhs, const deque& rhs); - template - friend bool operator> (const deque& lhs, const deque& rhs); - template - friend bool operator>= (const deque& lhs, const deque& rhs); - template friend void swap(deque& x, deque& y); };//end of deque @@ -356,11 +359,30 @@ namespace TinySTL{ dataAllocator::destroy(end_.cur_); } template - void deque::swap(deque& x){ - TinySTL::swap(beg_, x.beg_); - TinySTL::swap(end_, x.end_); + void deque::swap(deque& x){ TinySTL::swap(mapSize_, x.mapSize_); TinySTL::swap(map_, x.map_); + beg_.swap(x.beg_); + end_.swap(x.end_); + } + template + bool operator== (const deque& lhs, const deque& rhs){ + auto cit1 = lhs.cbegin(), cit2 = rhs.cbegin(); + for (; cit1 != lhs.cend() && cit2 != rhs.cend(); ++cit1, ++cit2){ + if (*cit1 != *cit2) + return false; + } + if (cit1 == lhs.cend() && cit2 == rhs.cend()) + return true; + return false; + } + template + bool operator!= (const deque& lhs, const deque& rhs){ + return !(lhs == rhs); + } + template + void swap(deque& x, deque& y){ + x.swap(y); } } #endif \ No newline at end of file