11#ifndef DEQUE_HPP
22#define DEQUE_HPP
33
4- #include " deque/__impl_data_ .hpp"
4+ #include " __types__ .hpp"
55#include " iterator.hpp"
66#include " type_traits.hpp"
77
8+ #define CHUNK_SIZE 8
9+
810namespace ft
911{
1012
11- template <class T > struct deque_iterator ;
12-
13- template <class T , class Alloc = std::allocator<T> >
14- class deque : protected _deque_impl_data <Alloc>
13+ template <class T > class deque_iterator ;
14+ template <class T , class Alloc = std::allocator<T> > class deque
1515{
16+ typedef T* chunk_t ;
17+ typedef chunk_t * map_t ;
18+
19+ typedef typename Alloc::template rebind<chunk_t >::other amap_t ;
20+
21+ map_t _map_ptr;
22+ size_t _begin_offset;
23+ size_t _past_end_offset;
24+ size_t _chunks_sz;
25+ Alloc _a;
26+ amap_t _a_map;
27+
28+ friend class deque_iterator <T>;
29+ friend class deque_iterator <const T>;
30+ friend class deque_iterator <volatile T>;
31+ friend class deque_iterator <const volatile T>;
32+
1633public:
1734 typedef Alloc allocator_type;
1835 typedef ptrdiff_t difference_type;
@@ -60,7 +77,7 @@ class deque : protected _deque_impl_data<Alloc>
6077 bool empty () const ;
6178 size_type max_size () const ;
6279 size_type size () const ;
63- void resize (size_type size , value_type val = value_type());
80+ void resize (size_type sz , value_type val = value_type());
6481
6582 const_reference at (size_type pos) const ;
6683 const_reference back () const ;
@@ -95,6 +112,15 @@ class deque : protected _deque_impl_data<Alloc>
95112 void swap (deque& other);
96113};
97114
115+ /* *
116+ * forbidden class specialization - begin
117+ * missing definition prevents the user from instantiation
118+ */
119+ template <class T > class deque <const T>;
120+ template <class T > class deque <volatile T>;
121+ template <class T > class deque <const volatile T>;
122+ /* * forbidden class specialization - end */
123+
98124template <class T , class Alloc >
99125bool operator ==(const deque<T, Alloc>& lhs, const deque<T, Alloc>& rhs);
100126template <class T , class Alloc >
@@ -112,54 +138,59 @@ template <class T, class Alloc>
112138void swap (deque<T, Alloc>& first, deque<T, Alloc>& second);
113139
114140template <class T >
115- struct deque_iterator : public ft ::iterator<random_access_iterator_tag, T>
141+ class deque_iterator : public ft ::iterator<random_access_iterator_tag, T>
116142{
143+ typedef deque<typename remove_cv<T>::type> data_t ;
144+ typedef typename conditional<is_const<T>::value, const data_t , data_t >::type deque_type;
145+
146+ deque_type* _deq;
147+ size_t _cur;
148+
149+ explicit deque_iterator (deque_type* _deq, size_t _cur = 0 );
150+
151+ public:
152+ template <class U > friend class deque_iterator ;
153+ friend class deque <typename remove_cv<T>::type>;
154+
117155 typedef ft::iterator<random_access_iterator_tag, T> _iterator;
118156
119157 using typename _iterator::difference_type;
120158 using typename _iterator::iterator_category;
121159 using typename _iterator::pointer;
122160 using typename _iterator::reference;
123161 using typename _iterator::value_type;
124-
125- typedef chunk<value_type>** data_t ;
126-
127162 deque_iterator ();
128163 deque_iterator (const deque_iterator& cpy);
129164 deque_iterator& operator =(const deque_iterator& cpy);
130165 template <class U > explicit deque_iterator (const deque_iterator<U>& cpy);
131166 template <class U > deque_iterator& operator =(const deque_iterator<U>& cpy);
132167 ~deque_iterator ();
133168
134- template <class U > operator deque_iterator<U>(); // NOLINT
135-
136- explicit deque_iterator (data_t _data, size_t _current = 0 );
137-
138- bool operator !=(const deque_iterator& rhs);
139- bool operator <(const deque_iterator& rhs);
140- bool operator <=(const deque_iterator& rhs);
141- bool operator ==(const deque_iterator& rhs);
142- bool operator >(const deque_iterator& rhs);
143- bool operator >=(const deque_iterator& rhs);
144- const pointer operator ->() const ;
145- const reference operator [](int post ) const ;
146- const reference operator *() const ;
147- pointer base () const ;
148- pointer operator ->();
149- reference operator [](int pos);
150- reference operator *();
151- template <class U > difference_type operator -(const deque_iterator<U>& rhs);
152- deque_iterator operator --(int ); // NOLINT
153- deque_iterator operator -(const difference_type n);
154- deque_iterator operator +(const difference_type n);
155- deque_iterator operator ++(int ); // NOLINT
156- deque_iterator& operator --();
157- deque_iterator& operator -=(const difference_type n);
158- deque_iterator& operator ++();
159- deque_iterator& operator +=(const difference_type n);
160-
161- size_t current;
162- data_t data;
169+ template <class U > operator deque_iterator<U>() const ;
170+
171+ bool operator !=(const deque_iterator& rhs) const ;
172+ bool operator <(const deque_iterator& rhs) const ;
173+ bool operator <=(const deque_iterator& rhs) const ;
174+ bool operator ==(const deque_iterator& rhs) const ;
175+ bool operator >(const deque_iterator& rhs) const ;
176+ bool operator >=(const deque_iterator& rhs) const ;
177+ const pointer operator ->() const ;
178+ const reference operator [](int post ) const ;
179+ const reference operator *() const ;
180+ pointer base () const ;
181+ pointer operator ->();
182+ reference operator [](int pos);
183+ reference operator *();
184+ template <class U >
185+ difference_type operator -(const deque_iterator<U>& rhs) const ;
186+ deque_iterator operator --(int );
187+ deque_iterator operator -(const difference_type n) const ;
188+ deque_iterator operator +(const difference_type n) const ;
189+ deque_iterator operator ++(int );
190+ deque_iterator& operator --();
191+ deque_iterator& operator -=(const difference_type n);
192+ deque_iterator& operator ++();
193+ deque_iterator& operator +=(const difference_type n);
163194};
164195
165196template <class T >
@@ -171,7 +202,7 @@ deque_iterator<T>& operator+(const typename deque_iterator<T>::difference_type l
171202#include " deque/__deque__.hpp" // IWYU pragma: export
172203
173204#ifdef TEST
174- // template class ft::deque< int >;
205+ // template class ft::deque<int>;
175206#endif
176207
177- #endif
208+ #endif
0 commit comments