00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _STXXL_DEQUE_H
00014 #define _STXXL_DEQUE_H
00015
00016 #include <limits>
00017 #include <stxxl/vector>
00018
00019
00020 __STXXL_BEGIN_NAMESPACE
00021
00022 template <class T, class VectorType>
00023 class deque;
00024
00025 template <class DequeType>
00026 class const_deque_iterator;
00027
00028 template <class DequeType>
00029 class deque_iterator
00030 {
00031 typedef typename DequeType::size_type size_type;
00032 typedef typename DequeType::vector_type vector_type;
00033 typedef deque_iterator<DequeType> _Self;
00034 DequeType * Deque;
00035 size_type Offset;
00036
00037 deque_iterator(DequeType * Deque_, size_type Offset_) :
00038 Deque(Deque_), Offset(Offset_)
00039 { }
00040
00041 friend class const_deque_iterator<DequeType>;
00042
00043 public:
00044 typedef typename DequeType::value_type value_type;
00045 typedef typename DequeType::pointer pointer;
00046 typedef typename DequeType::const_pointer const_pointer;
00047 typedef typename DequeType::reference reference;
00048 typedef typename DequeType::const_reference const_reference;
00049 typedef deque_iterator<DequeType> iterator;
00050 typedef const_deque_iterator<DequeType> const_iterator;
00051 friend class deque<value_type, vector_type>;
00052 typedef std::random_access_iterator_tag iterator_category;
00053 typedef typename DequeType::difference_type difference_type;
00054
00055 deque_iterator() : Deque(NULL), Offset(0) { }
00056
00057 difference_type operator - (const _Self & a) const
00058 {
00059 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
00060 Offset : (Deque->Vector.size() + Offset);
00061 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
00062 a.Offset : (Deque->Vector.size() + a.Offset);
00063
00064 return SelfAbsOffset - aAbsOffset;
00065 }
00066
00067 difference_type operator - (const const_iterator & a) const
00068 {
00069 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
00070 Offset : (Deque->Vector.size() + Offset);
00071 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
00072 a.Offset : (Deque->Vector.size() + a.Offset);
00073
00074 return SelfAbsOffset - aAbsOffset;
00075 }
00076
00077 _Self operator - (size_type op) const
00078 {
00079 return _Self(Deque, (Offset + Deque->Vector.size() - op) % Deque->Vector.size());
00080 }
00081
00082 _Self operator + (size_type op) const
00083 {
00084 return _Self(Deque, (Offset + op) % Deque->Vector.size());
00085 }
00086
00087 _Self & operator -= (size_type op)
00088 {
00089 Offset = (Offset + Deque->Vector.size() - op) % Deque->Vector.size();
00090 return *this;
00091 }
00092
00093 _Self & operator += (size_type op)
00094 {
00095 Offset = (Offset + op) % Deque->Vector.size();
00096 return *this;
00097 }
00098
00099 reference operator * ()
00100 {
00101 return Deque->Vector[Offset];
00102 }
00103
00104 pointer operator -> ()
00105 {
00106 return &(Deque->Vector[Offset]);
00107 }
00108
00109 const_reference operator * () const
00110 {
00111 return Deque->Vector[Offset];
00112 }
00113
00114 const_pointer operator -> () const
00115 {
00116 return &(Deque->Vector[Offset]);
00117 }
00118
00119 reference operator [] (size_type op)
00120 {
00121 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
00122 }
00123
00124 const_reference operator [] (size_type op) const
00125 {
00126 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
00127 }
00128
00129 _Self & operator ++ ()
00130 {
00131 Offset = (Offset + 1) % Deque->Vector.size();
00132 return *this;
00133 }
00134 _Self operator ++ (int)
00135 {
00136 _Self __tmp = *this;
00137 Offset = (Offset + 1) % Deque->Vector.size();
00138 return __tmp;
00139 }
00140 _Self & operator -- ()
00141 {
00142 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
00143 return *this;
00144 }
00145 _Self operator -- (int)
00146 {
00147 _Self __tmp = *this;
00148 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
00149 return __tmp;
00150 }
00151 bool operator == (const _Self & a) const
00152 {
00153 assert(Deque == a.Deque);
00154 return Offset == a.Offset;
00155 }
00156 bool operator != (const _Self & a) const
00157 {
00158 assert(Deque == a.Deque);
00159 return Offset != a.Offset;
00160 }
00161
00162 bool operator < (const _Self & a) const
00163 {
00164 assert(Deque == a.Deque);
00165 return (a - (*this)) > 0;
00166 }
00167
00168 bool operator > (const _Self & a) const
00169 {
00170 return a < (*this);
00171 }
00172
00173 bool operator <= (const _Self & a) const
00174 {
00175 return !((*this) > a);
00176 }
00177
00178 bool operator >= (const _Self & a) const
00179 {
00180 return !((*this) < a);
00181 }
00182
00183 bool operator == (const const_iterator & a) const
00184 {
00185 assert(Deque == a.Deque);
00186 return Offset == a.Offset;
00187 }
00188 bool operator != (const const_iterator & a) const
00189 {
00190 assert(Deque == a.Deque);
00191 return Offset != a.Offset;
00192 }
00193
00194 bool operator < (const const_iterator & a) const
00195 {
00196 assert(Deque == a.Deque);
00197 return (a - (*this)) > 0;
00198 }
00199
00200 bool operator > (const const_iterator & a) const
00201 {
00202 return a < (*this);
00203 }
00204
00205 bool operator <= (const const_iterator & a) const
00206 {
00207 return !((*this) > a);
00208 }
00209
00210 bool operator >= (const const_iterator & a) const
00211 {
00212 return !((*this) < a);
00213 }
00214 };
00215
00216 template <class DequeType>
00217 class const_deque_iterator
00218 {
00219 typedef const_deque_iterator<DequeType> _Self;
00220 typedef typename DequeType::size_type size_type;
00221 typedef typename DequeType::vector_type vector_type;
00222 const DequeType * Deque;
00223 size_type Offset;
00224
00225 const_deque_iterator(const DequeType * Deque_, size_type Offset_) :
00226 Deque(Deque_), Offset(Offset_)
00227 { }
00228
00229 public:
00230 typedef typename DequeType::value_type value_type;
00231 typedef typename DequeType::const_pointer pointer;
00232 typedef typename DequeType::const_pointer const_pointer;
00233 typedef typename DequeType::const_reference reference;
00234 typedef typename DequeType::const_reference const_reference;
00235 typedef deque_iterator<DequeType> iterator;
00236 typedef const_deque_iterator<DequeType> const_iterator;
00237 friend class deque<value_type, vector_type>;
00238 friend class deque_iterator<DequeType>;
00239
00240 typedef std::random_access_iterator_tag iterator_category;
00241 typedef typename DequeType::difference_type difference_type;
00242
00243 const_deque_iterator() : Deque(NULL), Offset(0) { }
00244 const_deque_iterator(const deque_iterator<DequeType> & it) :
00245 Deque(it.Deque), Offset(it.Offset)
00246 { }
00247
00248 difference_type operator - (const _Self & a) const
00249 {
00250 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
00251 Offset : (Deque->Vector.size() + Offset);
00252 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
00253 a.Offset : (Deque->Vector.size() + a.Offset);
00254
00255 return SelfAbsOffset - aAbsOffset;
00256 }
00257
00258 difference_type operator - (const iterator & a) const
00259 {
00260 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
00261 Offset : (Deque->Vector.size() + Offset);
00262 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
00263 a.Offset : (Deque->Vector.size() + a.Offset);
00264
00265 return SelfAbsOffset - aAbsOffset;
00266 }
00267
00268 _Self operator - (size_type op) const
00269 {
00270 return _Self(Deque, (Offset + Deque->Vector.size() - op) % Deque->Vector.size());
00271 }
00272
00273 _Self operator + (size_type op) const
00274 {
00275 return _Self(Deque, (Offset + op) % Deque->Vector.size());
00276 }
00277
00278 _Self & operator -= (size_type op)
00279 {
00280 Offset = (Offset + Deque->Vector.size() - op) % Deque->Vector.size();
00281 return *this;
00282 }
00283
00284 _Self & operator += (size_type op)
00285 {
00286 Offset = (Offset + op) % Deque->Vector.size();
00287 return *this;
00288 }
00289
00290 const_reference operator * () const
00291 {
00292 return Deque->Vector[Offset];
00293 }
00294
00295 const_pointer operator -> () const
00296 {
00297 return &(Deque->Vector[Offset]);
00298 }
00299
00300 const_reference operator [] (size_type op) const
00301 {
00302 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
00303 }
00304
00305 _Self & operator ++ ()
00306 {
00307 Offset = (Offset + 1) % Deque->Vector.size();
00308 return *this;
00309 }
00310 _Self operator ++ (int)
00311 {
00312 _Self __tmp = *this;
00313 Offset = (Offset + 1) % Deque->Vector.size();
00314 return __tmp;
00315 }
00316 _Self & operator -- ()
00317 {
00318 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
00319 return *this;
00320 }
00321 _Self operator -- (int)
00322 {
00323 _Self __tmp = *this;
00324 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
00325 return __tmp;
00326 }
00327 bool operator == (const _Self & a) const
00328 {
00329 assert(Deque == a.Deque);
00330 return Offset == a.Offset;
00331 }
00332 bool operator != (const _Self & a) const
00333 {
00334 assert(Deque == a.Deque);
00335 return Offset != a.Offset;
00336 }
00337
00338 bool operator < (const _Self & a) const
00339 {
00340 assert(Deque == a.Deque);
00341 return (a - (*this)) > 0;
00342 }
00343
00344 bool operator > (const _Self & a) const
00345 {
00346 return a < (*this);
00347 }
00348
00349 bool operator <= (const _Self & a) const
00350 {
00351 return !((*this) > a);
00352 }
00353
00354 bool operator >= (const _Self & a) const
00355 {
00356 return !((*this) < a);
00357 }
00358
00359 bool operator == (const iterator & a) const
00360 {
00361 assert(Deque == a.Deque);
00362 return Offset == a.Offset;
00363 }
00364 bool operator != (const iterator & a) const
00365 {
00366 assert(Deque == a.Deque);
00367 return Offset != a.Offset;
00368 }
00369
00370 bool operator < (const iterator & a) const
00371 {
00372 assert(Deque == a.Deque);
00373 return (a - (*this)) > 0;
00374 }
00375
00376 bool operator > (const iterator & a) const
00377 {
00378 return a < (*this);
00379 }
00380
00381 bool operator <= (const iterator & a) const
00382 {
00383 return !((*this) > a);
00384 }
00385
00386 bool operator >= (const iterator & a) const
00387 {
00388 return !((*this) < a);
00389 }
00390 };
00391
00394
00404 template <class T, class VectorType = stxxl::vector<T> >
00405 class deque : private noncopyable
00406 {
00407 typedef deque<T, VectorType> Self_;
00408
00409 public:
00410 typedef typename VectorType::size_type size_type;
00411 typedef typename VectorType::difference_type difference_type;
00412 typedef VectorType vector_type;
00413 typedef T value_type;
00414 typedef T * pointer;
00415 typedef const value_type * const_pointer;
00416 typedef T & reference;
00417 typedef const T & const_reference;
00418 typedef deque_iterator<Self_> iterator;
00419 typedef const_deque_iterator<Self_> const_iterator;
00420 typedef std::reverse_iterator<iterator> reverse_iterator;
00421 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00422
00423 friend class deque_iterator<Self_>;
00424 friend class const_deque_iterator<Self_>;
00425
00426 private:
00427 VectorType Vector;
00428 size_type begin_o, end_o, size_;
00429
00430 void double_array()
00431 {
00432 const size_type old_size = Vector.size();
00433 Vector.resize(2 * old_size);
00434 if (begin_o > end_o)
00435 {
00436 const size_type new_begin_o = old_size + begin_o;
00437 std::copy(Vector.begin() + begin_o,
00438 Vector.begin() + old_size,
00439 Vector.begin() + new_begin_o);
00440 begin_o = new_begin_o;
00441 }
00442 }
00443
00444 public:
00445 deque() : Vector((STXXL_DEFAULT_BLOCK_SIZE(T)) / sizeof(T)), begin_o(0), end_o(0), size_(0)
00446 { }
00447
00448 deque(size_type n)
00449 : Vector(STXXL_MAX<size_type>(STXXL_DEFAULT_BLOCK_SIZE(T) / sizeof(T), 2 * n)),
00450 begin_o(0), end_o(n), size_(n)
00451 { }
00452
00453 ~deque()
00454 { }
00455
00456 iterator begin()
00457 {
00458 return iterator(this, begin_o);
00459 }
00460 iterator end()
00461 {
00462 return iterator(this, end_o);
00463 }
00464 const_iterator begin() const
00465 {
00466 return const_iterator(this, begin_o);
00467 }
00468 const_iterator cbegin() const
00469 {
00470 return begin();
00471 }
00472 const_iterator end() const
00473 {
00474 return const_iterator(this, end_o);
00475 }
00476 const_iterator cend() const
00477 {
00478 return end();
00479 }
00480
00481 reverse_iterator rbegin()
00482 {
00483 return reverse_iterator(end());
00484 }
00485 const_reverse_iterator rbegin() const
00486 {
00487 return const_reverse_iterator(end());
00488 }
00489 const_reverse_iterator crbegin() const
00490 {
00491 return const_reverse_iterator(end());
00492 }
00493 reverse_iterator rend()
00494 {
00495 return reverse_iterator(begin());
00496 }
00497 const_reverse_iterator rend() const
00498 {
00499 return const_reverse_iterator(begin());
00500 }
00501 const_reverse_iterator crend() const
00502 {
00503 return const_reverse_iterator(begin());
00504 }
00505
00506 size_type size() const
00507 {
00508 return size_;
00509 }
00510
00511 size_type max_size() const
00512 {
00513 return (std::numeric_limits<size_type>::max)() / 2 - 1;
00514 }
00515
00516 bool empty() const
00517 {
00518 return size_ == 0;
00519 }
00520
00521 reference operator [] (size_type n)
00522 {
00523 assert(n < size());
00524 return Vector[(begin_o + n) % Vector.size()];
00525 }
00526
00527 const_reference operator [] (size_type n) const
00528 {
00529 assert(n < size());
00530 return Vector[(begin_o + n) % Vector.size()];
00531 }
00532
00533 reference front()
00534 {
00535 assert(!empty());
00536 return Vector[begin_o];
00537 }
00538
00539 const_reference front() const
00540 {
00541 assert(!empty());
00542 return Vector[begin_o];
00543 }
00544
00545 reference back()
00546 {
00547 assert(!empty());
00548 return Vector[(end_o + Vector.size() - 1) % Vector.size()];
00549 }
00550
00551 const_reference back() const
00552 {
00553 assert(!empty());
00554 return Vector[(end_o + Vector.size() - 1) % Vector.size()];
00555 }
00556
00557 void push_front(const T & el)
00558 {
00559 if ((begin_o + Vector.size() - 1) % Vector.size() == end_o)
00560 {
00561
00562 double_array();
00563 }
00564
00565 begin_o = (begin_o + Vector.size() - 1) % Vector.size();
00566 Vector[begin_o] = el;
00567 ++size_;
00568 }
00569
00570 void push_back(const T & el)
00571 {
00572 if ((end_o + 1) % Vector.size() == begin_o)
00573 {
00574
00575 double_array();
00576 }
00577 Vector[end_o] = el;
00578 end_o = (end_o + 1) % Vector.size();
00579 ++size_;
00580 }
00581
00582 void pop_front()
00583 {
00584 assert(!empty());
00585 begin_o = (begin_o + 1) % Vector.size();
00586 --size_;
00587 }
00588
00589 void pop_back()
00590 {
00591 assert(!empty());
00592 end_o = (end_o + Vector.size() - 1) % Vector.size();
00593 --size_;
00594 }
00595
00596 void swap(deque & obj)
00597 {
00598 std::swap(Vector, obj.Vector);
00599 std::swap(begin_o, obj.begin_o);
00600 std::swap(end_o, obj.end_o);
00601 std::swap(size_, obj.size_);
00602 }
00603
00604 void clear()
00605 {
00606 Vector.clear();
00607 Vector.resize((STXXL_DEFAULT_BLOCK_SIZE(T)) / sizeof(T));
00608 begin_o = 0;
00609 end_o = 0;
00610 size_ = 0;
00611 }
00612
00613 void resize(size_type n)
00614 {
00615 if (n < size())
00616 {
00617 do
00618 {
00619 pop_back();
00620 } while (n < size());
00621 }
00622 else
00623 {
00624 if (n + 1 > Vector.size())
00625 {
00626 const size_type old_size = Vector.size();
00627 Vector.resize(2 * n);
00628 if (begin_o > end_o)
00629 {
00630 const size_type new_begin_o = Vector.size() - old_size + begin_o;
00631 std::copy(Vector.begin() + begin_o,
00632 Vector.begin() + old_size,
00633 Vector.begin() + new_begin_o);
00634 begin_o = new_begin_o;
00635 }
00636 }
00637 end_o = (end_o + n - size()) % Vector.size();
00638 size_ = n;
00639 }
00640 }
00641 };
00642
00643 template <class T, class VectorType>
00644 bool operator == (const deque<T, VectorType> & a, const deque<T, VectorType> & b)
00645 {
00646 return std::equal(a.begin(), a.end(), b.begin());
00647 }
00648
00649 template <class T, class VectorType>
00650 bool operator < (const deque<T, VectorType> & a, const deque<T, VectorType> & b)
00651 {
00652 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
00653 }
00654
00656
00657 __STXXL_END_NAMESPACE
00658
00659 namespace std
00660 {
00661 template <typename T, typename VT>
00662 void swap(stxxl::deque<T, VT> & a,
00663 stxxl::deque<T, VT> & b)
00664 {
00665 a.swap(b);
00666 }
00667 }
00668
00669 #endif