1#ifndef QX_FLATMULTISET_H
2#define QX_FLATMULTISET_H
14template<
typename T,
typename Compare = std::less<T>>
15 requires std::predicate<Compare, T, T>
18template<
typename T,
typename Predicate>
27template<
typename T,
typename Compare,
typename Predicate>
35 Iterator it = fms.
begin();
36 while(it != fms.
end())
56template<
typename T,
typename Compare>
57 requires std::predicate<Compare, T, T>
62 using Container = QList<T>;
74 using pointer =
typename Container::pointer;
79 using key_type =
typename Container::value_type;
93 mContainer.reserve(list.size());
94 for(
const auto& e : list)
98 template<std::input_iterator InputIterator>
101 mContainer.reserve(std::distance(
first,
last));
112 for(
const auto& e : other)
121 qsizetype
size()
const {
return mContainer.size(); }
123 bool isEmpty()
const {
return mContainer.isEmpty(); }
126 const T&
constFirst()
const {
return mContainer.constFirst(); }
128 const T&
constLast()
const {
return mContainer.constLast(); }
131 qsizetype
capacity()
const {
return mContainer.capacity(); }
164 if(mCompare(*mid, value))
166 else if(mCompare(value, *mid))
177 std::pair<const_iterator, const_iterator>
equal_range(
const T& value)
const
186 void clear() { mContainer.clear(); }
191 template<
typename ...Args>
194 T value(std::forward<Args>(args)...);
195 mContainer.insert(
upperBound(value), std::move(value));
198 template<
typename ...Args>
201 T value(std::forward<Args>(args)...);
203 if(mContainer.isEmpty())
204 return mContainer.insert(0, std::move(value));
207 bool nextAfter = pos ==
cend() || mCompare(value, *pos);
208 bool previousBeforeOrSame = pos ==
cbegin() || !mCompare(value, *std::prev(pos));
211 if(!nextAfter || !previousBeforeOrSame)
216 Q_ASSERT(nextAfter || previousBeforeOrSame);
217 pos = !nextAfter ? std::upper_bound(pos,
cend(), value, mCompare) : std::upper_bound(
cbegin(), pos, value, mCompare);
220 return mContainer.insert(pos, std::move(value));
227 qsizetype removed = 0;
239 template<
typename Predicate>
241 qsizetype
removeIf(Predicate pred) {
return _QxPrivate::_erase_if(*
this, pred); }
249 QList<T>
values()
const {
return mContainer; };
291template<
typename T,
typename Compare,
typename Predicate>
The FlatMultiSet class is a container whose elements are always sorted.
Definition qx-flatmultiset.h:59
reverse_iterator ReverseIterator
Definition qx-flatmultiset.h:77
const_iterator ConstIterator
Definition qx-flatmultiset.h:67
typename Container::size_type size_type
Definition qx-flatmultiset.h:78
reverse_iterator rbegin() const
Definition qx-flatmultiset.h:142
bool contains(const T &value) const
Definition qx-flatmultiset.h:119
bool empty() const
Definition qx-flatmultiset.h:122
qsizetype size() const
Definition qx-flatmultiset.h:121
typename Container::const_reverse_iterator const_reverse_iterator
Definition qx-flatmultiset.h:71
const_iterator lowerBound(const T &value) const
Definition qx-flatmultiset.h:182
const_iterator constEnd() const
Definition qx-flatmultiset.h:141
typename Container::const_reference const_reference
Definition qx-flatmultiset.h:70
iterator end() const
Definition qx-flatmultiset.h:139
const_iterator find(const T &value) const
Definition qx-flatmultiset.h:148
const_iterator constFind(const T &value) const
Definition qx-flatmultiset.h:150
iterator erase(const_iterator pos)
Definition qx-flatmultiset.h:175
iterator emplace(const_iterator pos, Args &&... args)
Definition qx-flatmultiset.h:199
void clear()
Definition qx-flatmultiset.h:186
const_iterator iterator
Definition qx-flatmultiset.h:66
iterator rend() const
Definition qx-flatmultiset.h:145
bool contains(const FlatMultiSet &other) const
Definition qx-flatmultiset.h:110
void swap(FlatMultiSet &other)
Definition qx-flatmultiset.h:245
typename Container::pointer pointer
Definition qx-flatmultiset.h:74
typename Container::difference_type difference_type
Definition qx-flatmultiset.h:73
qsizetype removeIf(Predicate pred)
Definition qx-flatmultiset.h:241
const_reverse_iterator reverse_iterator
Definition qx-flatmultiset.h:76
const_reverse_iterator constReverseBegin() const
Definition qx-flatmultiset.h:144
const T & constFirst() const
Definition qx-flatmultiset.h:126
FlatMultiSet(std::initializer_list< T > list)
Definition qx-flatmultiset.h:91
bool isEmpty() const
Definition qx-flatmultiset.h:123
const T & last() const
Definition qx-flatmultiset.h:127
bool operator==(const FlatMultiSet &other) const =default
void reserve(qsizetype size)
Definition qx-flatmultiset.h:132
const_reverse_iterator ConstReverseIterator
Definition qx-flatmultiset.h:72
FlatMultiSet(InputIterator first, InputIterator last)
Definition qx-flatmultiset.h:99
typename Container::value_type key_type
Definition qx-flatmultiset.h:79
const_reverse_iterator crbegin() const
Definition qx-flatmultiset.h:143
const_iterator cend() const
Definition qx-flatmultiset.h:140
iterator insert(const_iterator pos, const T &value)
Definition qx-flatmultiset.h:188
typename Container::reference reference
Definition qx-flatmultiset.h:75
qsizetype capacity() const
Definition qx-flatmultiset.h:131
iterator begin() const
Definition qx-flatmultiset.h:136
const_iterator upperBound(const T &value) const
Definition qx-flatmultiset.h:183
const T & constLast() const
Definition qx-flatmultiset.h:128
iterator emplace(Args &&... args)
Definition qx-flatmultiset.h:192
typename Container::value_type value_type
Definition qx-flatmultiset.h:80
void squeeze()
Definition qx-flatmultiset.h:133
const_iterator constBegin() const
Definition qx-flatmultiset.h:138
qsizetype remove(const T &value)
Definition qx-flatmultiset.h:225
typename Container::const_iterator const_iterator
Definition qx-flatmultiset.h:65
const_reverse_iterator constReverseEnd() const
Definition qx-flatmultiset.h:147
const_reverse_iterator crend() const
Definition qx-flatmultiset.h:146
typename Container::const_pointer const_pointer
Definition qx-flatmultiset.h:69
QList< T > values() const
Definition qx-flatmultiset.h:249
const_iterator cbegin() const
Definition qx-flatmultiset.h:137
iterator insert(const T &value)
Definition qx-flatmultiset.h:187
qsizetype count() const
Definition qx-flatmultiset.h:120
std::pair< const_iterator, const_iterator > equal_range(const T &value) const
Definition qx-flatmultiset.h:177
const T & first() const
Definition qx-flatmultiset.h:125
iterator Iterator
Definition qx-flatmultiset.h:68
Specifies that a predicate is a valid predicate for a FlatMultiSet.
Definition qx-flatmultiset.h:19
The Qx namespace is the main namespace through which all non-global functionality of the Qx library i...
Definition qx-abstracterror.cpp:13
qsizetype erase_if(Bimap< Left, Right > &bimap, Predicate pred)
Definition qx-bimap.h:395