14 #ifndef _STXXL_DEQUE_H
15 #define _STXXL_DEQUE_H
18 #include <stxxl/vector>
21 __STXXL_BEGIN_NAMESPACE
23 template <
class T,
class VectorType>
26 template <
class DequeType>
27 class const_deque_iterator;
29 template <
class DequeType>
32 typedef typename DequeType::size_type size_type;
33 typedef typename DequeType::vector_type vector_type;
34 typedef deque_iterator<DequeType> _Self;
38 deque_iterator(DequeType * Deque_, size_type Offset_) :
39 Deque(Deque_), Offset(Offset_)
42 friend class const_deque_iterator<DequeType>;
45 typedef typename DequeType::value_type value_type;
46 typedef typename DequeType::pointer pointer;
47 typedef typename DequeType::const_pointer const_pointer;
48 typedef typename DequeType::reference reference;
49 typedef typename DequeType::const_reference const_reference;
50 typedef deque_iterator<DequeType> iterator;
51 typedef const_deque_iterator<DequeType> const_iterator;
52 friend class deque<value_type, vector_type>;
53 typedef std::random_access_iterator_tag iterator_category;
54 typedef typename DequeType::difference_type difference_type;
56 deque_iterator() : Deque(NULL), Offset(0) { }
58 difference_type operator - (
const _Self & a)
const
60 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
61 Offset : (Deque->Vector.size() + Offset);
62 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
63 a.Offset : (Deque->Vector.size() + a.Offset);
65 return SelfAbsOffset - aAbsOffset;
68 difference_type operator - (
const const_iterator & a)
const
70 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
71 Offset : (Deque->Vector.size() + Offset);
72 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
73 a.Offset : (Deque->Vector.size() + a.Offset);
75 return SelfAbsOffset - aAbsOffset;
78 _Self operator - (size_type op)
const
80 return _Self(Deque, (Offset + Deque->Vector.size() - op) % Deque->Vector.size());
83 _Self operator + (size_type op)
const
85 return _Self(Deque, (Offset + op) % Deque->Vector.size());
88 _Self & operator -= (size_type op)
90 Offset = (Offset + Deque->Vector.size() - op) % Deque->Vector.size();
94 _Self & operator += (size_type op)
96 Offset = (Offset + op) % Deque->Vector.size();
100 reference operator * ()
102 return Deque->Vector[Offset];
105 pointer operator -> ()
107 return &(Deque->Vector[Offset]);
110 const_reference operator * ()
const
112 return Deque->Vector[Offset];
115 const_pointer operator -> ()
const
117 return &(Deque->Vector[Offset]);
120 reference operator [] (size_type op)
122 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
125 const_reference operator [] (size_type op)
const
127 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
130 _Self & operator ++ ()
132 Offset = (Offset + 1) % Deque->Vector.size();
135 _Self operator ++ (
int)
138 Offset = (Offset + 1) % Deque->Vector.size();
141 _Self & operator -- ()
143 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
146 _Self operator -- (
int)
149 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
152 bool operator == (
const _Self & a)
const
154 assert(Deque == a.Deque);
155 return Offset == a.Offset;
157 bool operator != (
const _Self & a)
const
159 assert(Deque == a.Deque);
160 return Offset != a.Offset;
163 bool operator < (
const _Self & a)
const
165 assert(Deque == a.Deque);
166 return (a - (*
this)) > 0;
169 bool operator > (
const _Self & a)
const
174 bool operator <= (
const _Self & a)
const
176 return !((*this) > a);
179 bool operator >= (
const _Self & a)
const
181 return !((*this) < a);
184 bool operator == (
const const_iterator & a)
const
186 assert(Deque == a.Deque);
187 return Offset == a.Offset;
189 bool operator != (
const const_iterator & a)
const
191 assert(Deque == a.Deque);
192 return Offset != a.Offset;
195 bool operator < (
const const_iterator & a)
const
197 assert(Deque == a.Deque);
198 return (a - (*
this)) > 0;
201 bool operator > (
const const_iterator & a)
const
206 bool operator <= (
const const_iterator & a)
const
208 return !((*this) > a);
211 bool operator >= (
const const_iterator & a)
const
213 return !((*this) < a);
217 template <
class DequeType>
218 class const_deque_iterator
220 typedef const_deque_iterator<DequeType> _Self;
221 typedef typename DequeType::size_type size_type;
222 typedef typename DequeType::vector_type vector_type;
223 const DequeType * Deque;
226 const_deque_iterator(
const DequeType * Deque_, size_type Offset_) :
227 Deque(Deque_), Offset(Offset_)
231 typedef typename DequeType::value_type value_type;
232 typedef typename DequeType::const_pointer pointer;
233 typedef typename DequeType::const_pointer const_pointer;
234 typedef typename DequeType::const_reference reference;
235 typedef typename DequeType::const_reference const_reference;
236 typedef deque_iterator<DequeType> iterator;
237 typedef const_deque_iterator<DequeType> const_iterator;
238 friend class deque<value_type, vector_type>;
239 friend class deque_iterator<DequeType>;
241 typedef std::random_access_iterator_tag iterator_category;
242 typedef typename DequeType::difference_type difference_type;
244 const_deque_iterator() : Deque(NULL), Offset(0) { }
245 const_deque_iterator(
const deque_iterator<DequeType> & it) :
246 Deque(it.Deque), Offset(it.Offset)
249 difference_type operator - (
const _Self & a)
const
251 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
252 Offset : (Deque->Vector.size() + Offset);
253 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
254 a.Offset : (Deque->Vector.size() + a.Offset);
256 return SelfAbsOffset - aAbsOffset;
259 difference_type operator - (
const iterator & a)
const
261 size_type SelfAbsOffset = (Offset >= Deque->begin_o) ?
262 Offset : (Deque->Vector.size() + Offset);
263 size_type aAbsOffset = (a.Offset >= Deque->begin_o) ?
264 a.Offset : (Deque->Vector.size() + a.Offset);
266 return SelfAbsOffset - aAbsOffset;
269 _Self operator - (size_type op)
const
271 return _Self(Deque, (Offset + Deque->Vector.size() - op) % Deque->Vector.size());
274 _Self operator + (size_type op)
const
276 return _Self(Deque, (Offset + op) % Deque->Vector.size());
279 _Self & operator -= (size_type op)
281 Offset = (Offset + Deque->Vector.size() - op) % Deque->Vector.size();
285 _Self & operator += (size_type op)
287 Offset = (Offset + op) % Deque->Vector.size();
291 const_reference operator * ()
const
293 return Deque->Vector[Offset];
296 const_pointer operator -> ()
const
298 return &(Deque->Vector[Offset]);
301 const_reference operator [] (size_type op)
const
303 return Deque->Vector[(Offset + op) % Deque->Vector.size()];
306 _Self & operator ++ ()
308 Offset = (Offset + 1) % Deque->Vector.size();
311 _Self operator ++ (
int)
314 Offset = (Offset + 1) % Deque->Vector.size();
317 _Self & operator -- ()
319 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
322 _Self operator -- (
int)
325 Offset = (Offset + Deque->Vector.size() - 1) % Deque->Vector.size();
328 bool operator == (
const _Self & a)
const
330 assert(Deque == a.Deque);
331 return Offset == a.Offset;
333 bool operator != (
const _Self & a)
const
335 assert(Deque == a.Deque);
336 return Offset != a.Offset;
339 bool operator < (
const _Self & a)
const
341 assert(Deque == a.Deque);
342 return (a - (*
this)) > 0;
345 bool operator > (
const _Self & a)
const
350 bool operator <= (
const _Self & a)
const
352 return !((*this) > a);
355 bool operator >= (
const _Self & a)
const
357 return !((*this) < a);
360 bool operator == (
const iterator & a)
const
362 assert(Deque == a.Deque);
363 return Offset == a.Offset;
365 bool operator != (
const iterator & a)
const
367 assert(Deque == a.Deque);
368 return Offset != a.Offset;
371 bool operator < (
const iterator & a)
const
373 assert(Deque == a.Deque);
374 return (a - (*
this)) > 0;
377 bool operator > (
const iterator & a)
const
382 bool operator <= (
const iterator & a)
const
384 return !((*this) > a);
387 bool operator >= (
const iterator & a)
const
389 return !((*this) < a);
404 template <
class T,
class VectorType = stxxl::vector<T> >
405 class deque :
private noncopyable
410 typedef typename VectorType::size_type size_type;
411 typedef typename VectorType::difference_type difference_type;
412 typedef VectorType vector_type;
413 typedef T value_type;
415 typedef const value_type * const_pointer;
416 typedef T & reference;
417 typedef const T & const_reference;
418 typedef deque_iterator<Self_> iterator;
419 typedef const_deque_iterator<Self_> const_iterator;
420 typedef std::reverse_iterator<iterator> reverse_iterator;
421 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
423 friend class deque_iterator<Self_>;
424 friend class const_deque_iterator<Self_>;
428 size_type begin_o, end_o, size_;
432 const size_type old_size = Vector.size();
433 Vector.resize(2 * old_size);
436 const size_type new_begin_o = old_size + begin_o;
437 std::copy(Vector.begin() + begin_o,
438 Vector.begin() + old_size,
439 Vector.begin() + new_begin_o);
440 begin_o = new_begin_o;
445 deque() : Vector((STXXL_DEFAULT_BLOCK_SIZE(T)) / sizeof(T)), begin_o(0), end_o(0), size_(0)
449 : Vector(STXXL_MAX<size_type>(STXXL_DEFAULT_BLOCK_SIZE(T) / sizeof(T), 2 * n)),
450 begin_o(0), end_o(n), size_(n)
458 return iterator(
this, begin_o);
462 return iterator(
this, end_o);
464 const_iterator begin()
const
466 return const_iterator(
this, begin_o);
468 const_iterator cbegin()
const
472 const_iterator end()
const
474 return const_iterator(
this, end_o);
476 const_iterator cend()
const
481 reverse_iterator rbegin()
483 return reverse_iterator(end());
485 const_reverse_iterator rbegin()
const
487 return const_reverse_iterator(end());
489 const_reverse_iterator crbegin()
const
491 return const_reverse_iterator(end());
493 reverse_iterator rend()
495 return reverse_iterator(begin());
497 const_reverse_iterator rend()
const
499 return const_reverse_iterator(begin());
501 const_reverse_iterator crend()
const
503 return const_reverse_iterator(begin());
506 size_type size()
const
511 size_type max_size()
const
513 return (std::numeric_limits<size_type>::max)() / 2 - 1;
521 reference operator [] (size_type n)
524 return Vector[(begin_o + n) % Vector.size()];
527 const_reference operator [] (size_type n)
const
530 return Vector[(begin_o + n) % Vector.size()];
536 return Vector[begin_o];
539 const_reference front()
const
542 return Vector[begin_o];
548 return Vector[(end_o + Vector.size() - 1) % Vector.size()];
551 const_reference back()
const
554 return Vector[(end_o + Vector.size() - 1) % Vector.size()];
557 void push_front(
const T & el)
559 if ((begin_o + Vector.size() - 1) % Vector.size() == end_o)
565 begin_o = (begin_o + Vector.size() - 1) % Vector.size();
566 Vector[begin_o] = el;
570 void push_back(
const T & el)
572 if ((end_o + 1) % Vector.size() == begin_o)
578 end_o = (end_o + 1) % Vector.size();
585 begin_o = (begin_o + 1) % Vector.size();
592 end_o = (end_o + Vector.size() - 1) % Vector.size();
596 void swap(
deque & obj)
598 std::swap(Vector, obj.Vector);
599 std::swap(begin_o, obj.begin_o);
600 std::swap(end_o, obj.end_o);
601 std::swap(size_, obj.size_);
607 Vector.resize((STXXL_DEFAULT_BLOCK_SIZE(T)) /
sizeof(T));
613 void resize(size_type n)
620 }
while (n < size());
624 if (n + 1 > Vector.size())
626 const size_type old_size = Vector.size();
627 Vector.resize(2 * n);
630 const size_type new_begin_o = Vector.size() - old_size + begin_o;
631 std::copy(Vector.begin() + begin_o,
632 Vector.begin() + old_size,
633 Vector.begin() + new_begin_o);
634 begin_o = new_begin_o;
637 end_o = (end_o + n - size()) % Vector.size();
643 template <
class T,
class VectorType>
646 return std::equal(a.begin(), a.end(), b.begin());
649 template <
class T,
class VectorType>
652 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
657 __STXXL_END_NAMESPACE
661 template <
typename T,
typename VT>
662 void swap(stxxl::deque<T, VT> & a,
663 stxxl::deque<T, VT> & b)
A deque container.
Definition: deque.h:24