-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathset.hpp
144 lines (106 loc) · 4.33 KB
/
set.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#ifndef FT_CONTAINERS_SET_HPP
#define FT_CONTAINERS_SET_HPP
#include <functional>
#include "rb_tree.hpp"
#include "functional.hpp"
namespace ft {
template <class T, class Compare = std::less<T>, class Alloc = std::allocator<T> >
class set {
public:
typedef T key_type;
typedef T value_type;
typedef Compare key_compare;
typedef Compare value_compare;
typedef Alloc allocator_type;
private:
typedef typename ft::rb_tree<key_type, value_type, identity<value_type>, key_compare, allocator_type> tree_type;
tree_type tree;
public:
typedef typename allocator_type::reference reference;
typedef typename allocator_type::const_reference const_reference;
typedef typename allocator_type::pointer pointer;
typedef typename allocator_type::const_pointer const_pointer;
typedef typename tree_type::iterator iterator;
typedef typename tree_type::const_iterator const_iterator;
typedef typename tree_type::reverse_iterator reverse_iterator;
typedef typename tree_type::const_reverse_iterator const_reverse_iterator;
typedef ptrdiff_t difference_type;
typedef size_t size_type;
explicit set(const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()) :
tree(comp, alloc) {}
template <class InputIterator>
set(InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()) :
tree(comp, alloc) {
tree.insert_unique(first, last);
}
set(const set& x) : tree(x.tree) {}
set& operator=(const set& x) {
tree = x.tree;
return *this;
}
iterator begin()
{ return tree.begin(); }
const_iterator begin() const
{ return tree.begin(); }
iterator end()
{ return tree.end(); }
const_iterator end() const
{ return tree.end(); }
reverse_iterator rbegin()
{ return tree.rbegin(); }
const_reverse_iterator rbegin() const
{ return tree.rbegin(); }
reverse_iterator rend()
{ return tree.rend(); }
const_reverse_iterator rend() const
{ return tree.rend(); }
bool empty() const
{ return tree.empty(); }
size_type size() const
{ return tree.size(); }
size_type max_size() const
{ return tree.max_size(); }
std::pair<iterator, bool> insert(const value_type& val)
{ return tree.insert_unique(val); }
iterator insert(iterator position, const value_type& val)
{ return tree.insert_unique(position, val); }
template <class InputIterator>
void insert(InputIterator first, InputIterator last)
{ tree.insert_unique(first, last); }
void erase(iterator position)
{ tree.erase(position); }
size_type erase(const key_type& key)
{ return tree.erase(key); }
void erase(iterator first, iterator last)
{ tree.erase(first, last); }
void swap(set& x)
{ tree.swap(x.tree); }
void clear()
{ tree.clear(); }
key_compare key_comp() const
{ return tree.key_comp(); }
value_compare value_comp() const
{ return value_compare(tree.key_comp()); }
iterator find(const key_type& key)
{ return tree.find(key); }
const_iterator find(const key_type& key) const
{ return tree.find(key); }
size_type count(const key_type& key) const
{ return tree.count(key); }
iterator lower_bound(const key_type& key)
{ return tree.lower_bound(key); }
const_iterator lower_bound(const key_type& key) const
{ return tree.lower_bound(key); }
iterator upper_bound(const key_type& key)
{ return tree.upper_bound(key); }
const_iterator upper_bound(const key_type& key) const
{ return tree.upper_bound(key); }
std::pair<iterator, iterator> equal_range(const key_type& key)
{ return tree.equal_range(key); }
std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const
{ return tree.equal_range(key); }
allocator_type get_allocator() const
{ return tree.get_allocator(); }
};
}
#endif