@@ -14,22 +14,36 @@ namespace ft {
1414
1515 };
1616
17- template <typename T, typename Category = std::bidirectional_iterator_tag>
17+ template <bool flag, class IsTrue , class IsFalse >
18+ struct choose ;
19+
20+ template <class IsTrue , class IsFalse >
21+ struct choose <true , IsTrue, IsFalse> {
22+ typedef IsTrue type;
23+ };
24+
25+ template <class IsTrue , class IsFalse >
26+ struct choose <false , IsTrue, IsFalse> {
27+ typedef IsFalse type;
28+ };
29+
30+ template <bool isConst, typename T, typename Category = std::bidirectional_iterator_tag>
1831 class IteratorSet {
1932
2033 private:
2134 SetNode<T>* _ptr;
2235
2336 public:
2437
25- typedef std::ptrdiff_t difference_type;
26- typedef T value_type;
27- typedef value_type* pointer ;
28- typedef value_type& reference ;
29- typedef Category iterator_category;
38+ typedef std::ptrdiff_t difference_type;
39+ typedef T value_type;
40+ typedef typename choose<isConst, const T&,T&>::type reference ;
41+ typedef typename choose<isConst, const T*,T*>::type pointer ;
42+ typedef Category iterator_category;
3043
3144 IteratorSet () {}
32- IteratorSet (const IteratorSet& other): _ptr(other._ptr) {}
45+ IteratorSet (const IteratorSet<false ,T,Category>& other): _ptr(other._ptr) {}
46+ IteratorSet (const IteratorSet<true ,T,Category>& other): _ptr(other.getPtr()) {}
3347 IteratorSet (SetNode<T>* node): _ptr(node) {}
3448 ~IteratorSet () {}
3549
@@ -63,7 +77,7 @@ namespace ft {
6377 }
6478
6579 IteratorSet operator ++(int ) {
66- IteratorSet<T,Category> tmp (*this );
80+ IteratorSet<isConst, T,Category> tmp (*this );
6781 operator ++();
6882 return (tmp);
6983 }
@@ -85,7 +99,7 @@ namespace ft {
8599 }
86100
87101 IteratorSet operator --(int ) {
88- IteratorSet<T,Category> tmp (*this );
102+ IteratorSet<isConst, T,Category> tmp (*this );
89103 operator --();
90104 return (tmp);
91105 }
@@ -107,7 +121,7 @@ namespace ft {
107121 typedef Category iterator_category;
108122
109123 ReverseIteratorSet () {}
110- ReverseIteratorSet (const IteratorSet<T,Category>& other): _ptr(other.getPtr()) {}
124+ ReverseIteratorSet (const IteratorSet<false , T,Category>& other): _ptr(other.getPtr()) {}
111125 ReverseIteratorSet (const ReverseIteratorSet& other): _ptr(other._ptr) {}
112126 ReverseIteratorSet (SetNode<T>* node): _ptr(node) {}
113127 ~ReverseIteratorSet () {}
@@ -187,19 +201,19 @@ namespace ft {
187201
188202 };
189203
190- template <typename T, typename Category = std::bidirectional_iterator_tag>
204+ /* template<typename T, typename Category = std::bidirectional_iterator_tag>
191205 class ConstIteratorSet {
192206
193207 private:
194208 SetNode<T>* _ptr;
195209
196210 public:
197211
198- typedef std::ptrdiff_t difference_type;
199- typedef T value_type;
200- typedef value_type* pointer;
201- typedef value_type& reference;
202- typedef Category iterator_category;
212+ typedef std::ptrdiff_t difference_type;
213+ typedef T value_type;
214+ typedef const value_type* pointer;
215+ typedef const value_type& reference;
216+ typedef Category iterator_category;
203217
204218 ConstIteratorSet() {}
205219 ConstIteratorSet(const IteratorSet<T,Category>& other): _ptr(other.getPtr()) {}
@@ -208,8 +222,8 @@ namespace ft {
208222 ~ConstIteratorSet() {}
209223
210224 SetNode<T>* getPtr() const { return (_ptr); }
211- const value_type* operator ->() const { return (_ptr->_data ); }
212- const value_type& operator *() const { return (*_ptr->_data ); }
225+ pointer operator->() const { return (_ptr->_data); }
226+ reference operator*() const { return (*_ptr->_data); }
213227 bool operator==(const ConstIteratorSet& other) const { return (_ptr == other._ptr); }
214228 bool operator!=(const ConstIteratorSet& other) const { return (_ptr != other._ptr); }
215229
@@ -264,7 +278,7 @@ namespace ft {
264278 return (tmp);
265279 }
266280
267- };
281+ };*/
268282
269283
270284 template <typename T, typename Category = std::bidirectional_iterator_tag>
@@ -282,8 +296,8 @@ namespace ft {
282296 typedef Category iterator_category;
283297
284298 ConstReverseIteratorSet () {}
285- ConstReverseIteratorSet (const IteratorSet<T,Category>& other): _ptr(other.getPtr()) {}
286- ConstReverseIteratorSet (const ConstIteratorSet<T ,Category>& other): _ptr(other.getPtr()) {}
299+ ConstReverseIteratorSet (const IteratorSet<false , T,Category>& other): _ptr(other.getPtr()) {}
300+ ConstReverseIteratorSet (const IteratorSet< true ,Category>& other): _ptr(other.getPtr()) {}
287301 ConstReverseIteratorSet (const ReverseIteratorSet<T,Category>& other): _ptr(other.getPtr()) {}
288302 ConstReverseIteratorSet (const ConstReverseIteratorSet& other): _ptr(other._ptr) {}
289303 ConstReverseIteratorSet (SetNode<T>* node): _ptr(node) {}
0 commit comments