1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
2
 
        This file is part of the uClibc++ Library.
 
3
 
        This library is free software; you can redistribute it and/or
 
4
 
        modify it under the terms of the GNU Lesser General Public
 
5
 
        License as published by the Free Software Foundation; either
 
6
 
        version 2.1 of the License, or (at your option) any later version.
 
8
 
        This library is distributed in the hope that it will be useful,
 
9
 
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
11
 
        Lesser General Public License for more details.
 
13
 
        You should have received a copy of the GNU Lesser General Public
 
14
 
        License along with this library; if not, write to the Free Software
 
15
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
24
 
#pragma GCC visibility push(default)
 
26
 
#ifndef __STD_HEADER_DEQUE
 
27
 
#define __STD_HEADER_DEQUE
 
31
 
        template <class T, class Allocator = allocator<T> > class deque;
 
32
 
        template <class T, class Allocator> bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
33
 
        template <class T, class Allocator> bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
34
 
        template <class T, class Allocator> bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
35
 
        template <class T, class Allocator> bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
36
 
        template <class T, class Allocator> bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
37
 
        template <class T, class Allocator> bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
38
 
        template <class T, class Allocator> void swap(deque<T,Allocator>& x, deque<T,Allocator>& y);
 
40
 
        template <class T, class Allocator> class _UCXXEXPORT deque {
 
42
 
                friend bool operator==<>(const deque<T, Allocator>& x, const deque<T, Allocator>& y);
 
43
 
                friend class deque_iter;
 
44
 
                friend class deque_citer;
 
48
 
                typedef typename Allocator::reference           reference;
 
49
 
                typedef typename Allocator::const_reference     const_reference;
 
50
 
                typedef deque_iter                              iterator;
 
51
 
                typedef deque_citer                             const_iterator;
 
52
 
                typedef typename Allocator::size_type           size_type;
 
53
 
                typedef typename Allocator::difference_type     difference_type;
 
55
 
                typedef Allocator                               allocator_type;
 
56
 
                typedef typename Allocator::pointer             pointer;
 
57
 
                typedef typename Allocator::const_pointer       const_pointer;
 
58
 
                typedef std::reverse_iterator<iterator>         reverse_iterator;
 
59
 
                typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
 
61
 
                explicit deque(const Allocator& al = Allocator());
 
62
 
                explicit deque(size_type n, const T& value = T(), const Allocator& al = Allocator());
 
63
 
                template <class InputIterator> deque(InputIterator first, InputIterator last, const Allocator& = Allocator());
 
64
 
                deque(const deque<T,Allocator>& x);
 
67
 
                deque<T,Allocator>& operator=(const deque<T,Allocator>& x);
 
68
 
                template <class InputIterator> void assign(InputIterator first, InputIterator last);
 
69
 
                template <class Size, class U> void assign(Size n, const U& u = U());
 
70
 
                allocator_type get_allocator() const;
 
73
 
                const_iterator          begin() const;
 
75
 
                const_iterator          end() const;
 
76
 
                reverse_iterator        rbegin();
 
77
 
                const_reverse_iterator  rbegin() const;
 
78
 
                reverse_iterator        rend();
 
79
 
                const_reverse_iterator  rend() const;
 
81
 
                size_type               size() const;
 
82
 
                size_type               max_size() const;
 
83
 
                void                    resize(size_type sz, T c = T());
 
86
 
                reference       operator[](size_type n);
 
87
 
                const_reference operator[](size_type n) const;
 
88
 
                reference       at(size_type n);
 
89
 
                const_reference at(size_type n) const;
 
91
 
                const_reference front() const;
 
93
 
                const_reference back() const;
 
95
 
                void push_front(const T& x);
 
96
 
                void push_back(const T& x);
 
97
 
                iterator insert(iterator position, const T& x = T());
 
98
 
                void     insert(iterator position, size_type n, const T& x);
 
99
 
                template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);
 
103
 
                iterator erase(iterator position);
 
104
 
                iterator erase(iterator first, iterator last);
 
105
 
                void     swap(deque<T,Allocator>&);
 
109
 
                void reserve(size_type n);
 
110
 
                inline size_type array_element(size_type deque_element) const{
 
111
 
                        if(deque_element < (data_size - first_element)){
 
112
 
                                return first_element + deque_element;
 
114
 
                        return deque_element - (data_size - first_element);
 
116
 
                inline size_type first_subtract(size_type sub_size) const{
 
117
 
                        if(sub_size > first_element){
 
118
 
                                return (data_size - first_element) - sub_size;
 
120
 
                        return first_element - sub_size;
 
124
 
                size_type data_size;            //Physical size of array
 
125
 
                size_type elements;             //Elements in array
 
126
 
                size_type first_element;        //Element number of array 0..n
 
127
 
                size_type last_element;         //Element number of array 0..n
 
133
 
        template<class T, class Allocator> class _UCXXEXPORT deque<T, Allocator>::deque_iter
 
134
 
                : public std::iterator<
 
135
 
                        random_access_iterator_tag,
 
137
 
                        typename Allocator::difference_type,
 
138
 
                        typename Allocator::pointer,
 
139
 
                        typename Allocator::reference
 
142
 
        friend class deque<T, Allocator>;
 
144
 
                deque<T, Allocator> * container;
 
145
 
                typename Allocator::size_type element;
 
148
 
                deque_iter() : container(0), element(0) {  }
 
149
 
                deque_iter(const deque_iter & d) : container (d.container), element(d.element) {  }
 
150
 
                deque_iter(deque<T, Allocator> * c, typename Allocator::size_type e)
 
151
 
                        : container(c), element(e)
 
156
 
                deque_iter & operator=(const deque_iter & d){
 
157
 
                        container = d.container;
 
162
 
                        return container->data[container->array_element(element)];
 
165
 
                        return container->data + container->array_element(element);
 
167
 
                const T & operator*() const{
 
168
 
                        return container->data[container->array_element(element)];
 
170
 
                const T * operator->() const{
 
171
 
                        return container->data + container->array_element(element);
 
173
 
                bool operator==(const deque_iter & d) const{
 
174
 
                        if(container == d.container && element == d.element){
 
179
 
                bool operator==(const deque_citer & d) const{
 
180
 
                        if(container == d.container && element == d.element){
 
185
 
                bool operator!=(const deque_iter & d) const{
 
186
 
                        if(container != d.container || element  != d.element){
 
191
 
                bool operator!=(const deque_citer & d) const{
 
192
 
                        if(container != d.container || element  != d.element){
 
197
 
                bool operator<(const deque_iter & d) const{
 
198
 
                        if(element < d.element){
 
203
 
                bool operator<(const deque_citer & d) const{
 
204
 
                        if(element < d.element){
 
209
 
                bool operator<=(const deque_iter & d) const{
 
210
 
                        if(element <= d.element){
 
215
 
                bool operator<=(const deque_citer & d) const{
 
216
 
                        if(element <= d.element){
 
221
 
                bool operator>(const deque_iter & d) const{
 
222
 
                        if(element > d.element){
 
227
 
                bool operator>(const deque_citer & d) const{
 
228
 
                        if(element > d.element){
 
233
 
                bool operator>=(const deque_iter & d) const{
 
234
 
                        if(element >= d.element){
 
239
 
                bool operator>=(const deque_citer & d) const{
 
240
 
                        if(element >= d.element){
 
245
 
                deque_iter & operator++(){
 
249
 
                deque_iter operator++(int){
 
250
 
                        deque_iter temp(container, element);
 
254
 
                deque_iter operator+(typename Allocator::size_type n){
 
255
 
                        deque_iter temp(container, element + n);
 
258
 
                deque_iter & operator+=(typename Allocator::size_type n){
 
262
 
                deque_iter & operator--(){
 
266
 
                deque_iter operator--(int){
 
267
 
                        deque_iter temp(container, element);
 
271
 
                deque_iter operator-(typename Allocator::size_type n){
 
272
 
                        deque_iter temp(container, element - n);
 
275
 
                deque_iter & operator-=(typename Allocator::size_type n){
 
279
 
                typename Allocator::size_type operator-(const deque_iter & d){
 
280
 
                        return element - d.element;
 
285
 
        template<class T, class Allocator> class _UCXXEXPORT deque<T, Allocator>::deque_citer
 
286
 
                : public std::iterator<
 
287
 
                        random_access_iterator_tag,
 
289
 
                        typename Allocator::difference_type,
 
290
 
                        typename Allocator::const_pointer,
 
291
 
                        typename Allocator::const_reference
 
294
 
        friend class deque<T, Allocator>;
 
296
 
                const deque<T, Allocator> * container;
 
297
 
                typename Allocator::size_type element;
 
300
 
                deque_citer() : container(0), element(0) {  }
 
301
 
                deque_citer(const deque_citer & d) : container (d.container), element(d.element) {  }
 
302
 
                deque_citer(const deque_iter & d) : container (d.container), element(d.element) {  }
 
303
 
                deque_citer(const deque<T, Allocator> * c, typename Allocator::size_type e)
 
304
 
                        : container(c), element(e)
 
309
 
                deque_citer & operator=(const deque_iter & d){
 
310
 
                        container = d.container;
 
314
 
                const T & operator*() const{
 
315
 
                        return container->data[container->array_element(element)];
 
317
 
                const T * operator->() const{
 
318
 
                        return container->data + container->array_element(element);
 
320
 
                bool operator==(const deque_citer & d) const{
 
321
 
                        if(container == d.container && element == d.element){
 
326
 
                bool operator==(const deque_iter & d) const{
 
327
 
                        if(container == d.container && element == d.element){
 
332
 
                bool operator!=(const deque_citer & d) const{
 
333
 
                        if(container != d.container || element  != d.element){
 
338
 
                bool operator!=(const deque_iter & d) const{
 
339
 
                        if(container != d.container || element  != d.element){
 
344
 
                bool operator<(const deque_citer & d) const{
 
345
 
                        if(element < d.element){
 
350
 
                bool operator<(const deque_iter & d) const{
 
351
 
                        if(element < d.element){
 
356
 
                bool operator<=(const deque_citer & d) const{
 
357
 
                        if(element <= d.element){
 
362
 
                bool operator<=(const deque_iter & d) const{
 
363
 
                        if(element <= d.element){
 
368
 
                bool operator>(const deque_citer & d) const{
 
369
 
                        if(element > d.element){
 
374
 
                bool operator>(const deque_iter & d) const{
 
375
 
                        if(element > d.element){
 
380
 
                bool operator>=(const deque_citer & d){
 
381
 
                        if(element >= d.element){
 
386
 
                bool operator>=(const deque_iter & d){
 
387
 
                        if(element >= d.element){
 
392
 
                deque_citer & operator++(){
 
396
 
                deque_citer operator++(int){
 
397
 
                        deque_citer temp(container, element);
 
401
 
                deque_citer operator+(typename Allocator::size_type n){
 
402
 
                        deque_citer temp(container, element + n);
 
405
 
                deque_citer & operator+=(typename Allocator::size_type n){
 
409
 
                deque_citer & operator--(){
 
413
 
                deque_citer operator--(int){
 
414
 
                        deque_citer temp(container, element);
 
418
 
                deque_citer operator-(typename Allocator::size_type n){
 
419
 
                        deque_citer temp(container, element - n);
 
422
 
                deque_citer & operator-=(typename Allocator::size_type n){
 
426
 
                typename Allocator::size_type operator-(const deque_citer & d){
 
427
 
                        return element - d.element;
 
432
 
        template<class T, class Allocator> deque<T, Allocator>::deque(const Allocator& al)
 
434
 
                data_size(0), elements(0), first_element(0), last_element(0), a(al)
 
436
 
                data_size = __UCLIBCXX_STL_BUFFER_SIZE__;
 
437
 
                data = a.allocate(data_size);
 
438
 
                first_element = data_size /2;
 
439
 
                last_element = first_element;
 
443
 
        template<class T, class Allocator> deque<T, Allocator>::deque(
 
444
 
                size_type n, const T& value, const Allocator& al)
 
446
 
                elements(n), first_element(0), last_element(0), a(al)
 
448
 
                data_size = elements + __UCLIBCXX_STL_BUFFER_SIZE__;
 
449
 
                data = a.allocate(data_size);
 
450
 
                first_element = (data_size - elements) / 2;
 
451
 
                last_element = first_element;
 
453
 
                for(n=first_element ; n < last_element; ++n ){
 
454
 
                        a.construct(data+n, value);
 
459
 
        template<class T, class Allocator> template <class InputIterator> 
 
460
 
                deque<T, Allocator>::deque(InputIterator first, InputIterator last, const Allocator& al)
 
462
 
                data_size(0), elements(0), first_element(0), last_element(0), a(al)
 
464
 
                data_size = __UCLIBCXX_STL_BUFFER_SIZE__;
 
465
 
                data = a.allocate(data_size);
 
466
 
                first_element = data_size / 4;  //Note sure how big, but let's add a little space...
 
467
 
                last_element = first_element;
 
468
 
                while(first != last){
 
475
 
        template<class T, class Allocator> deque<T, Allocator>::deque(const deque<T,Allocator>& x)
 
477
 
                elements(0), first_element(0), last_element(0), a(x.a)
 
479
 
                data_size = x.elements + __UCLIBCXX_STL_BUFFER_SIZE__;
 
480
 
                data = a.allocate(data_size);
 
481
 
                first_element = (data_size - x.elements) / 2;
 
482
 
                last_element = first_element;
 
483
 
                for(size_type i=0; i < x.elements; ++i){
 
489
 
        template<class T, class Allocator> deque<T, Allocator>::~deque(){
 
491
 
                a.deallocate(data, data_size);
 
494
 
        template<class T, class Allocator> deque<T,Allocator>& deque<T, Allocator>::
 
495
 
                operator=(const deque<T,Allocator>& x)
 
501
 
                for(size_t i = 0; i < elements; ++i){
 
502
 
                        data[array_element(i)] = x[i];
 
508
 
        template<class T, class Allocator> template <class InputIterator> void
 
509
 
                deque<T, Allocator>::assign(InputIterator first, InputIterator last)
 
519
 
        template<class T, class Allocator> template <class Size, class U> void
 
520
 
                deque<T, Allocator>::assign(Size n, const U& u)
 
526
 
                for(size_type i = 0; i < n; ++i){
 
532
 
        template<class T, class Allocator> typename deque<T, Allocator>::allocator_type 
 
533
 
                deque<T, Allocator>::get_allocator() const
 
538
 
        template<class T, class Allocator> typename
 
539
 
                deque<T, Allocator>::iterator deque<T, Allocator>::begin()
 
541
 
                return deque_iter(this, 0);
 
545
 
        template<class T, class Allocator> typename deque<T, Allocator>::const_iterator
 
546
 
                deque<T, Allocator>::begin() const
 
548
 
                return deque_citer(this, 0);
 
551
 
        template<class T, class Allocator> typename
 
552
 
                deque<T, Allocator>::iterator deque<T, Allocator>::end()
 
554
 
                return deque_iter(this, elements);
 
557
 
        template<class T, class Allocator> typename
 
558
 
                deque<T, Allocator>::const_iterator deque<T, Allocator>::end() const
 
560
 
                return deque_citer(this, elements);
 
563
 
        template<class T, class Allocator> typename
 
564
 
                deque<T, Allocator>::reverse_iterator deque<T, Allocator>::rbegin()
 
566
 
                return reverse_iterator(end());
 
569
 
        template<class T, class Allocator> typename
 
570
 
                deque<T, Allocator>::const_reverse_iterator deque<T, Allocator>::rbegin() const
 
572
 
                return const_reverse_iterator(end());
 
575
 
        template<class T, class Allocator> typename
 
576
 
                deque<T, Allocator>::reverse_iterator deque<T, Allocator>::rend()
 
578
 
                return reverse_iterator(begin());
 
581
 
        template<class T, class Allocator> typename
 
582
 
                deque<T, Allocator>::const_reverse_iterator deque<T, Allocator>::rend() const
 
584
 
                return const_reverse_iterator(begin());
 
587
 
        template<class T, class Allocator> typename
 
588
 
                deque<T, Allocator>::size_type deque<T, Allocator>::size() const
 
593
 
        template<class T, class Allocator> typename
 
594
 
                deque<T, Allocator>::size_type deque<T, Allocator>::max_size() const
 
596
 
                return ((size_type)(-1)) / sizeof(T);
 
599
 
        template<class T, class Allocator> void deque<T, Allocator>::resize(size_type sz, T c){
 
609
 
        template<class T, class Allocator> bool deque<T, Allocator>::empty() const{
 
610
 
                return (elements == 0);
 
613
 
        template<class T, class Allocator> typename
 
614
 
                deque<T, Allocator>::reference deque<T, Allocator>::operator[](size_type n)
 
616
 
                return data[array_element(n)];
 
619
 
        template<class T, class Allocator> typename
 
620
 
                deque<T, Allocator>::const_reference deque<T, Allocator>::operator[](size_type n) const
 
622
 
                return data[array_element(n)];
 
625
 
        template<class T, class Allocator> typename
 
626
 
                deque<T, Allocator>::reference deque<T, Allocator>::at(size_type n)
 
629
 
                        __throw_out_of_range("Out of deque range");
 
631
 
                return data[array_element(n)];
 
634
 
        template<class T, class Allocator> typename
 
635
 
                deque<T, Allocator>::const_reference deque<T, Allocator>::at(size_type n) const
 
638
 
                        __throw_out_of_range("Out of deque range");
 
640
 
                return data[array_element(n)];
 
643
 
        template<class T, class Allocator> typename
 
644
 
                deque<T, Allocator>::reference deque<T, Allocator>::front()
 
646
 
                return data[first_element];
 
649
 
        template<class T, class Allocator> typename
 
650
 
                deque<T, Allocator>::const_reference deque<T, Allocator>::front() const
 
652
 
                return data[first_element];
 
655
 
        template<class T, class Allocator> typename
 
656
 
                deque<T, Allocator>::reference deque<T, Allocator>::back()
 
658
 
                return data[array_element(elements-1)];
 
661
 
        template<class T, class Allocator> typename
 
662
 
                deque<T, Allocator>::const_reference deque<T, Allocator>::back() const
 
664
 
                return data[array_element(elements-1)];
 
667
 
        template<class T, class Allocator> void deque<T, Allocator>::push_front(const T& x){
 
668
 
                reserve(elements + 1);
 
669
 
                first_element = first_subtract(1);
 
670
 
                a.construct(data + first_element, x);
 
674
 
        template<class T, class Allocator> void deque<T, Allocator>::push_back(const T& x){
 
675
 
                reserve(elements + 1);
 
676
 
                a.construct(data + last_element, x);
 
678
 
                last_element = array_element(elements);
 
681
 
        template<class T, class Allocator> typename
 
682
 
                deque<T, Allocator>::iterator deque<T, Allocator>::insert(iterator position, const T& x)
 
685
 
                if(position.element > (elements/2)){
 
686
 
                        //Push all elements back 1
 
688
 
                        for(size_type i = elements-1; i > position.element; --i){
 
692
 
                        //Push all elements forward 1
 
694
 
                        for(size_type i = 0; i < position.element; ++i){
 
698
 
                at(position.element) = x;
 
699
 
                return deque_iter(this, position.element);
 
702
 
        template<class T, class Allocator> void deque<T, Allocator>::
 
703
 
                insert(typename deque<T, Allocator>::iterator position, size_type n, const T& x)
 
705
 
                reserve(elements + n);
 
706
 
                for(size_t i =0; i < n; ++i){
 
707
 
                        position = insert(position, x);
 
711
 
        template<class T, class Allocator> template <class InputIterator> 
 
712
 
                void deque<T, Allocator>::insert (iterator position, InputIterator first, InputIterator last)
 
714
 
                while(first != last){
 
715
 
                        position = insert(position, *first);
 
720
 
        template<class T, class Allocator> void deque<T, Allocator>::pop_front(){
 
722
 
                        __throw_out_of_range("deque pop_front");
 
724
 
                a.destroy(data + first_element);
 
725
 
                first_element = array_element(1);
 
729
 
        template<class T, class Allocator> void deque<T, Allocator>::pop_back(){
 
730
 
                last_element = array_element(elements - 1);
 
731
 
                a.destroy(data + last_element);
 
735
 
        template<class T, class Allocator> typename
 
736
 
                deque<T, Allocator>::iterator deque<T, Allocator>::erase(typename deque<T, Allocator>::iterator position)
 
738
 
                if(position.element > (elements /2)){
 
739
 
                        for(size_type i = position.element; i < elements - 1; ++i){
 
744
 
                        for(size_type i = position.element; i > 0; --i){
 
749
 
                return deque_iter(this, position.element);
 
752
 
        template<class T, class Allocator> typename deque<T, Allocator>::iterator 
 
753
 
                deque<T, Allocator>::
 
754
 
                erase(typename deque<T, Allocator>::iterator first, typename deque<T, Allocator>::iterator last)
 
757
 
                size_type num_move = last.element - first.element;
 
758
 
                if( first.element > (elements - last.element) ){
 
759
 
                        for(size_type i = last.element; i < elements ; ++i){
 
760
 
                                at(i-num_move) = at(i);
 
762
 
                        for(size_type i = 0; i < num_move ; ++i){
 
766
 
                        for(size_type i = 0; i < first.element ; ++i){
 
767
 
                                at(last.element - i - 1) = at(first.element - i - 1);
 
769
 
                        for(size_type i = 0; i < num_move ; ++i){
 
773
 
                return deque_iter(this, first.element);
 
776
 
        template<class T, class Allocator> void deque<T, Allocator>::swap(deque<T,Allocator>& x)
 
779
 
                typename deque<T,Allocator>::size_type temp_size;
 
787
 
                temp_size = x.data_size;
 
788
 
                x.data_size = data_size;
 
789
 
                data_size = temp_size;
 
791
 
                //Swap num array elements
 
792
 
                temp_size  = x.elements;
 
793
 
                x.elements = elements;
 
794
 
                elements = temp_size;
 
797
 
                temp_size = x.first_element;
 
798
 
                x.first_element = first_element;
 
799
 
                first_element = temp_size;
 
802
 
                temp_size = x.last_element;
 
803
 
                x.last_element = last_element;
 
804
 
                last_element = temp_size;
 
807
 
        template<class T, class Allocator> void deque<T, Allocator>::clear()
 
809
 
                while(elements > 0 ){
 
815
 
        template<class T, class Allocator> void deque<T, Allocator>::reserve(typename deque<T, Allocator>::size_type n)
 
822
 
                size_type first_temp;
 
824
 
                size_temp = n + __UCLIBCXX_STL_BUFFER_SIZE__;           //Reserve extra 'cause we can
 
825
 
                data_temp = a.allocate(size_temp);
 
827
 
                first_temp = (size_temp - elements) / 2;
 
828
 
                for(size_type i = 0; i < elements; ++i){
 
829
 
                        a.construct(data_temp + first_temp + i, data[array_element(i)]);
 
830
 
                        a.destroy(data + array_element(i));
 
833
 
                //Now shuffle pointers
 
834
 
                a.deallocate(data, data_size);
 
836
 
                data_size = size_temp;
 
837
 
                first_element = first_temp;
 
838
 
                last_element = first_element + elements;
 
842
 
        template <class T, class Allocator> _UCXXEXPORT 
 
844
 
                operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y)
 
846
 
                if(x.elements != y.elements){
 
849
 
                for(typename deque<T,Allocator>::size_type i = 0; i < x.elements; ++i){
 
850
 
                        if(x[i] < y[i] || y[i] < x[i]){
 
857
 
        template <class T, class Allocator> bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
858
 
        template <class T, class Allocator> _UCXXEXPORT
 
860
 
                operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y)
 
867
 
        template <class T, class Allocator> bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
868
 
        template <class T, class Allocator> bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
869
 
        template <class T, class Allocator> bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y);
 
870
 
        template <class T, class Allocator> _UCXXEXPORT void swap(deque<T,Allocator>& x, deque<T,Allocator>& y){
 
878
 
#pragma GCC visibility pop