Skip to content

Commit d5997b8

Browse files
author
Mortalite
committed
feat: completed set
1 parent b6eb470 commit d5997b8

7 files changed

Lines changed: 84 additions & 69 deletions

File tree

Makefile

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
NAME = ft_containers
2-
SRCS = main.cpp
2+
SRCS = srcs/main.cpp
33
OBJS = $(SRCS:.cpp=.o)
44
DEPS = $(SRCS:.cpp=.d)
55

66
COMPILER = clang++
7-
FLAGS = -Wall -Werror -Wextra -MMD -std=c++98
8-
INCLUDES = -I.
7+
FLAGS = -Wall -Werror -Wextra -std=c++98
8+
INCLUDES = -Iincludes -Iincludes/containers -Iincludes/iterators
99

1010
%.o : %.cpp
11-
$(COMPILER) $(FLAGS) $(INCLUDES) -c $< -o $@
11+
$(COMPILER) $(FLAGS) $(INCLUDES) -MMD -c $< -o $@
1212

1313
$(NAME): $(OBJS)
1414
$(COMPILER) $(FLAGS) $(OBJS) -o $(NAME)
@@ -27,10 +27,10 @@ re:
2727
$(MAKE) fclean
2828
$(MAKE) all
2929

30-
leak_sanitizer:
30+
leak_sanitizer_address:
3131
$(MAKE) fclean
32-
$(COMPILER) -Wall -Werror -Wextra -std=c++98 -fsanitize=address -g3 $(SRCS) -o $(NAME)
33-
ASAN_OPTIONS=detect_leaks=1 ./${NAME} ${LEAK_TEST_CASE}
32+
$(COMPILER) $(FLAGS) $(INCLUDES) -fsanitize=address -g3 $(SRCS) -o $(NAME)
33+
ASAN_OPTIONS=detect_leaks=1 ASAN_OPTIONS=atexit=1 ./${NAME}
3434

3535
leak_valgrind:
3636
$(MAKE) re

includes/containers/set.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ namespace ft {
2424
typedef typename allocator_type::const_reference const_reference;
2525
typedef typename allocator_type::pointer pointer;
2626
typedef typename allocator_type::const_pointer const_pointer;
27-
typedef IteratorSet<T> iterator;
27+
typedef IteratorSet<false,T> iterator;
2828
typedef ReverseIteratorSet<T> reverse_iterator;
29-
typedef ConstIteratorSet<T> const_iterator;
29+
typedef IteratorSet<true,T> const_iterator;
3030
typedef ConstReverseIteratorSet<T> const_reverse_iterator;
3131
typedef std::ptrdiff_t difference_type;
3232
typedef std::size_t size_type;

includes/iterators/iteratorList.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ namespace ft {
141141

142142
typedef std::ptrdiff_t difference_type;
143143
typedef T value_type;
144-
typedef T* pointer;
145-
typedef T& reference;
144+
typedef const T* pointer;
145+
typedef const T& reference;
146146
typedef Category iterator_category;
147147

148148
ConstIteratorList() {}
@@ -154,8 +154,8 @@ namespace ft {
154154
DLLNode<T>* getPtr() const { return (_ptr); }
155155
bool operator==(const ConstIteratorList& other) const { return (_ptr == other._ptr); }
156156
bool operator!=(const ConstIteratorList& other) const { return (_ptr != other._ptr); }
157-
const T& operator*() const { return (*_ptr->_data); }
158-
const T* operator->() const { return (_ptr->_data); }
157+
reference operator*() const { return (*_ptr->_data); }
158+
pointer operator->() const { return (_ptr->_data); }
159159

160160
ConstIteratorList& operator=(const ConstIteratorList& other) {
161161
_ptr = other._ptr;

includes/iterators/iteratorMap.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ namespace ft {
193193

194194
typedef std::ptrdiff_t difference_type;
195195
typedef std::pair<const Key,T> value_type;
196-
typedef value_type* pointer;
197-
typedef value_type& reference;
196+
typedef const value_type* pointer;
197+
typedef const value_type& reference;
198198
typedef Category iterator_category;
199199

200200
ConstIteratorMap() {}
@@ -204,8 +204,8 @@ namespace ft {
204204
~ConstIteratorMap() {}
205205

206206
TreeNode<const Key,T>* getPtr() const { return (_ptr); }
207-
const value_type* operator->() const { return (_ptr->_data); }
208-
const value_type& operator*() const { return (*_ptr->_data); }
207+
pointer operator->() const { return (_ptr->_data); }
208+
reference operator*() const { return (*_ptr->_data); }
209209
bool operator==(const ConstIteratorMap& other) const { return (_ptr == other._ptr); }
210210
bool operator!=(const ConstIteratorMap& other) const { return (_ptr != other._ptr); }
211211

includes/iterators/iteratorSet.hpp

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {}

includes/iterators/iteratorVector.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,19 @@ namespace ft {
186186

187187
typedef std::ptrdiff_t difference_type;
188188
typedef T value_type;
189-
typedef T* pointer;
190-
typedef T& reference;
189+
typedef const T* pointer;
190+
typedef const T& reference;
191191
typedef Category iterator_category;
192192

193193
ConstIteratorVector() {}
194194
ConstIteratorVector(const IteratorVector<T,Category>& other):_ptr(other.getPtr()) {}
195195
ConstIteratorVector(const ConstIteratorVector& other):_ptr(other._ptr) {}
196-
ConstIteratorVector(pointer ptr):_ptr(ptr) {}
196+
ConstIteratorVector(T* ptr):_ptr(ptr) {}
197197
~ConstIteratorVector() {}
198198

199199
pointer getPtr() const { return (_ptr); }
200-
const value_type* operator->() const { return (_ptr); }
201-
const value_type& operator*() const { return (*_ptr); }
200+
pointer operator->() const { return (_ptr); }
201+
reference operator*() const { return (*_ptr); }
202202
reference operator[](int n) const { return (*(_ptr + n)); }
203203
difference_type operator-(const ConstIteratorVector& other) const { return (_ptr - other._ptr); }
204204
bool operator==(const ConstIteratorVector& other) const { return (_ptr == other._ptr); }

srcs/main.cpp

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -110,20 +110,20 @@ void testMultiMap() {
110110

111111
}
112112

113-
/*void testSet() {
114-
std::cout << RED << "||||||||||SET||||||||||" << RESET << std::endl;
113+
void testSet() {
114+
std::cout << RED << "||||||||||SET||||||||||" << RESET << std::endl;
115115

116-
typedef ft::set<cType> ftType;
117-
typedef std::set<cType> stdType;
116+
typedef ft::set<cType> ftType;
117+
typedef std::set<cType> stdType;
118118

119-
ft::testSetConstructors<ftType, stdType>();
120-
ft::testSetIterators<ftType, stdType>();
121-
ft::testSetInsert<ftType, stdType>();
122-
ft::testSetErase<ftType, stdType>();
123-
ft::testSetSwap<ftType, ftType>();
124-
ft::testSetOperations<ftType, stdType>();
125-
ft::testSetNonMember<ftType, stdType>();
126-
}*/
119+
ft::testSetConstructors<ftType, stdType>();
120+
ft::testSetIterators<ftType, stdType>();
121+
ft::testSetInsert<ftType, stdType>();
122+
ft::testSetErase<ftType, stdType>();
123+
ft::testSetSwap<ftType, ftType>();
124+
ft::testSetOperations<ftType, stdType>();
125+
ft::testSetNonMember<ftType, stdType>();
126+
}
127127

128128
int main() {
129129
srand(time(NULL));
@@ -136,23 +136,24 @@ int main() {
136136
// testMap();
137137
// testStack();
138138
// testQueue();
139-
//
139+
140140
std::cout << RED << "Bonus part" << RESET << std::endl;
141141
// testMultiMap();
142-
// testSet();
143-
typedef std::set<int> setType;
144-
145-
setType set;
146-
set.insert(1);
147-
set.insert(976);
148-
set.insert(1000);
142+
testSet();
149143

150-
setType::iterator it = set.begin();
151-
setType::const_iterator itConst = set.begin();
152-
setType::reverse_iterator itRev = set.rbegin();
153-
setType::const_reverse_iterator itConstRev = set.rbegin();
154-
155-
setType::iterator itT(it);
144+
/* typedef std::set<int> setType;
145+
//
146+
setType set;
147+
set.insert(1);
148+
set.insert(976);
149+
set.insert(1000);
150+
151+
setType::iterator it = set.begin();
152+
setType::const_iterator itConst = set.begin();
153+
setType::reverse_iterator itRev = set.rbegin();
154+
setType::const_reverse_iterator itConstRev = set.rbegin();
155+
//
156+
setType::iterator itT(itConst);*/
156157

157158

158159
return (0);

0 commit comments

Comments
 (0)