22 mutable std::vector<Item> items;
23 mutable size_t dirty = 0;
25 typedef typename std::vector<Item>::const_iterator const_iterator;
26 typedef typename std::vector<Item>::iterator iterator;
27 typedef typename std::vector<Item>::const_reverse_iterator
28 const_reverse_iterator;
29 typedef typename std::vector<Item>::reverse_iterator reverse_iterator;
31 iterator begin() {
return items.begin(); }
32 iterator end() {
return items.end(); }
33 const_iterator begin()
const {
return items.begin(); }
34 const_iterator end()
const {
return items.end(); }
35 reverse_iterator rbegin() {
return items.rbegin(); }
36 reverse_iterator rend() {
return items.rend(); }
37 const_reverse_iterator rbegin()
const {
return items.rbegin(); }
38 const_reverse_iterator rend()
const {
return items.rend(); }
39 size_t size()
const {
return items.size(); }
40 bool empty()
const {
return items.empty(); }
42 bool operator==(
const SmallSet& o)
const
48 return items == o.items;
51 bool operator!=(
const SmallSet& o)
const
57 return items == o.items;
66 int binary_search(
const Value& value)
const
69 begin = -1, end = items.size();
70 while (end - begin > 1)
72 int cur = (end + begin) / 2;
73 if (value < get_value(items[cur]))
78 if (begin == -1 || get_value(items[begin]) != value)
84 const_iterator find(
const Value& value)
const
92 for (
auto it = std::begin(items); it != std::end(items); ++it)
93 if (get_value(*it) == value)
102 std::sort(items.begin(), items.end(),
103 [](
const Item& a,
const Item& b) {
104 return get_value(a) < get_value(b);
115 int pos = binary_search(value);
119 return items.begin() + pos;
122 iterator find(
const Value& value)
128 if (items.size() < 6)
130 for (
auto it = std::begin(items); it != std::end(items); ++it)
131 if (get_value(*it) == value)
140 std::sort(items.begin(), items.end(),
141 [](
const Item& a,
const Item& b) {
142 return get_value(a) < get_value(b);
153 int pos = binary_search(value);
157 return items.begin() + pos;
160 Item& add(
const Item& item)
163 items.emplace_back(item);
169 void rearrange_dirty()
const
172 for (
size_t i = items.size() - dirty; i < items.size(); ++i)
174 j > 0 && get_value(items[j]) < get_value(items[j - 1]); --j)
175 std::swap(items[j], items[j - 1]);
216 typedef typename SmallUniqueValueSet<Value>::iterator iterator;
217 typedef typename SmallUniqueValueSet<Value>::const_iterator const_iterator;
219 typename SmallUniqueValueSet<Value>::reverse_iterator reverse_iterator;
220 typedef typename SmallUniqueValueSet<Value>::const_reverse_iterator
221 const_reverse_iterator;
233 this->rearrange_dirty();
234 return SmallUniqueValueSet<Value>::begin();
236 const_iterator begin()
const
239 this->rearrange_dirty();
240 return SmallUniqueValueSet<Value>::begin();
242 reverse_iterator rbegin()
245 this->rearrange_dirty();
246 return SmallUniqueValueSet<Value>::rbegin();
248 const_reverse_iterator rbegin()
const
251 this->rearrange_dirty();
252 return SmallUniqueValueSet<Value>::rbegin();
255 void add(
const Value& val)
257 auto i = this->find(val);
258 if (i != this->end())
260 SmallUniqueValueSet<Value>::add(val);
263 bool has(
const Value& val)
const {
return this->find(val) != this->end(); }