• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List

deque.h

00001 /***************************************************************************
00002  *  include/stxxl/bits/containers/deque.h
00003  *
00004  *  Part of the STXXL. See http://stxxl.sourceforge.net
00005  *
00006  *  Copyright (C) 2006 Roman Dementiev <[email protected]>
00007  *
00008  *  Distributed under the Boost Software License, Version 1.0.
00009  *  (See accompanying file LICENSE_1_0.txt or copy at
00010  *  http://www.boost.org/LICENSE_1_0.txt)
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         {                         // copy data to the new end of the vector
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()      // empty so far
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             // an overflow will occur: resize the array
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             // an overflow will occur: resize the array
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             {                             // need to resize
00626                 const size_type old_size = Vector.size();
00627                 Vector.resize(2 * n);
00628                 if (begin_o > end_o)
00629                 {                         // copy data to the new end of the vector
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 /* _STXXL_DEQUE_H */

Generated by  doxygen 1.7.1