49class QMinimalFlatSet : QtPrivate::CompactStorage<Compare>
52 using CompareStorage = QtPrivate::CompactStorage<Compare>;
54 QMinimalFlatSet() =
default;
55 explicit QMinimalFlatSet(
const Compare &cmp) : CompareStorage{cmp} {}
56 explicit QMinimalFlatSet(std::initializer_list<T> init,
const Compare &cmp = Compare())
57 : QMinimalFlatSet(init.begin(), init.end(), cmp)
60 explicit QMinimalFlatSet(Container init,
const Compare &cmp = Compare())
61 : CompareStorage{cmp}, c(std::move(init))
63 std::sort(c.begin(), c.end(), comparisonObject());
64 c.erase(std::unique(c.begin(), c.end()), c.end());
66 template <
typename InputIt>
67 QMinimalFlatSet(InputIt first, InputIt last,
const Compare &cmp = Compare())
68 : CompareStorage{cmp}, c(first, last)
70 std::sort(c.begin(), c.end(), comparisonObject());
71 c.erase(std::unique(c.begin(), c.end()), c.end());
76 using const_iterator =
typename Container::const_iterator;
77 using iterator = const_iterator;
78 using const_reverse_iterator =
typename Container::const_reverse_iterator;
79 using reverse_iterator = const_reverse_iterator;
81 using key_compare = Compare;
82 using value_compare = Compare;
84 key_compare key_comp()
const {
return this->object(); }
85 value_compare value_comp()
const {
return key_comp(); }
87 iterator begin()
const {
return c.cbegin(); }
88 iterator end()
const {
return c.cend(); }
89 iterator cbegin()
const {
return begin(); }
90 iterator cend()
const {
return end(); }
92 reverse_iterator rbegin()
const {
return c.crbegin(); }
93 reverse_iterator rend()
const {
return c.crend(); }
94 reverse_iterator crbegin()
const {
return rbegin(); }
95 reverse_iterator crend()
const {
return rend(); }
101 auto size()
const {
return c.size(); }
102 auto count()
const {
return size(); }
103 bool isEmpty()
const {
return size() == 0; }
105 std::pair<iterator,
bool> insert(value_type &&v)
108 const auto r = lookup(v);
110 return {r.it,
false};
112 return {c.insert(r.it, std::move(v)),
true};
115 std::pair<iterator,
bool> insert(
const value_type &v)
118 const auto r = lookup(v);
120 return {r.it,
false};
122 return {c.insert(r.it, v),
true};
125 void erase(
const value_type &v)
128 const auto r = lookup(v);
132 void remove(
const value_type &v) { erase(v); }
134 bool contains(
const value_type &v)
const
136 return lookup(v).exists;
139 const Container &values()
const & {
return c; }
140 Container values() && {
return std::move(c); }
143 auto comparisonObject()
const {
return std::cref(
this->object()); }
145 auto lookup(
const value_type &v)
const
152 const auto it = std::lower_bound(c.cbegin(), c.cend(), v, comparisonObject());
153 return R{it, it != c.cend() && !comparisonObject()(v, *it)};
156#ifdef QMINIMAL_FLAT_SET_DEBUG
157 friend QDebug operator<<(QDebug dbg,
const QMinimalFlatSet &set)
159 const QDebugStateSaver saver(dbg);
160 dbg.nospace() <<
"QMinimalFlatSet{";
171using QMinimalVarLengthFlatSet = QMinimalFlatSet<T, QVarLengthArray<T, N>, Compare>;