6#include <unordered_map>
16template<
typename Key,
typename T,
typename Compare = std::less<T>>
17 requires std::predicate<Compare, T, T>
20template<
typename Key,
typename T,
typename Compare,
typename Predicate>
23template<
typename Key,
typename T,
typename Predicate>
26template<
typename Key,
typename T,
typename Compare,
typename Predicate>
35template<
typename Key,
typename T,
typename Compare,
typename Predicate>
45 const Iterator end = lm.
cend();
60 if(pred(std::move(*it)))
84template<
typename Key,
typename T,
typename Compare>
85 requires std::predicate<Compare, T, T>
99 bool operator()(
const Data& lhs,
const Data& rhs)
const {
return cmp(lhs.value, rhs.value); }
104 using StorageContainer = std::multiset<Data, DataCompare>;
105 using StorageItr =
typename StorageContainer::const_iterator;
106 using StorageRevItr =
typename StorageContainer::const_reverse_iterator;
107 using LookupContainer = std::unordered_map<Key, StorageItr>;
112 friend class Lopmap<Key, T, Compare>;
119 StorageItr mStorageItr;
130 const Key&
key()
const {
return *mStorageItr->keyPtr; }
131 const T&
value()
const {
return mStorageItr->value; }
162 friend class Lopmap<Key, T, Compare>;
165 using iterator_category =
typename StorageRevItr::iterator_category;
169 StorageRevItr mStorageItr;
180 const Key&
key()
const {
return *mStorageItr->keyPtr; }
181 const T&
value()
const {
return mStorageItr->
value; }
186 const T& operator*()
const {
return value(); }
205 const T* operator->()
const {
return &mStorageItr->
value; }
225 StorageContainer mStorage;
226 LookupContainer mLookup;
232 Lopmap(std::initializer_list<std::pair<Key, T>> list)
234 for(
auto it = list.begin(); it != list.end(); ++it)
235 insert(it->first, it->second);
240 StorageItr lookupStorage(
const Key&
key)
const
242 auto lItr = mLookup.find(
key);
243 return lItr != mLookup.end() ? lItr->second : mStorage.cend();
246 iterator insert_impl(
const Key&
key,
const T&
value,
const StorageItr* hint)
251 auto [lItr, isNew] = mLookup.emplace(
key, StorageItr());
256 if(lItr->second->value ==
value)
260 mStorage.erase(lItr->second);
264 auto sItr = hint ? mStorage.emplace_hint(*hint, &lItr->first,
value) : mStorage.emplace(&lItr->first,
value);
298 return const_iterator(mStorage.lower_bound(Data{nullptr, value}));
306 return const_iterator(mStorage.upper_bound(Data{nullptr, value}));
314 auto sItrPair = mStorage.equal_range(Data{
nullptr,
value});
315 return std::make_pair<const_iterator, const_iterator>(sItrPair.first, sItrPair.second);
318 const T&
first()
const { Q_ASSERT(!mStorage.empty());
return mStorage.cbegin()->value; }
319 const Key&
firstKey()
const { Q_ASSERT(!mStorage.empty());
return *mStorage.cbegin()->keyPtr; }
321 const T&
last()
const { Q_ASSERT(!mStorage.empty());
return mStorage.cend()->value; }
322 const Key&
lastKey()
const { Q_ASSERT(!mStorage.empty());
return *mStorage.cend()->keyPtr; }
324 Key
key(
const T&
value,
const Key& defaultKey = Key())
const
326 for(
const auto& data : std::as_const(mStorage))
327 if(data.value ==
value)
336 mLookup.erase(pos.
key());
337 return iterator(mStorage.erase(pos.mStorageItr));
346 StorageItr sItr =
first.mStorageItr;
347 while(sItr !=
last.mStorageItr)
349 mLookup.erase(*sItr->keyPtr);
350 sItr = mStorage.erase(sItr);
359 insert(std::as_const(other));
361 other.mStorage.clear();
362 other.mLookup.clear();
370 for(
auto itr = other.mStorage.begin(); itr != other.mStorage.end(); itr++)
371 insert(*itr->keyPtr, itr->value);
380 auto lItr = mLookup.find(
key);
381 if(lItr != mLookup.cend())
383 auto sItr = lItr->second;
385 mStorage.erase(sItr);
392 template<
typename Predicate>
394 qsizetype
removeIf(Predicate pred) {
return _QxPrivate::_erase_if(*
this, pred); }
398 auto lItr = mLookup.find(
key);
399 if(lItr != mLookup.cend())
401 auto sItr = lItr->second;
404 mStorage.erase(sItr);
413 mLookup.swap(other.mLookup);
414 mStorage.swap(other.mStorage);
417 qsizetype
size()
const {
return mStorage.size(); }
422 void clear() { mLookup.clear(); mStorage.clear(); }
424 T
value(
const Key&
key,
const T& defaultValue = T())
const
426 auto sItr = lookupStorage(
key);
427 return sItr != mStorage.cend() ? sItr->value : defaultValue;
433 for(
const auto& data : std::as_const(mStorage))
441 for(
const auto& data : std::as_const(mStorage))
442 if(data.value ==
value)
450 for(
const auto& data : std::as_const(mStorage))
472template<
typename Key,
typename T,
typename Predicate>
The Lopmap::const_iterator class provides an STL-style const iterator for Lopmap.
Definition qx-lopmap.h:111
const T * operator->() const
Definition qx-lopmap.h:155
const_iterator operator--(int)
Definition qx-lopmap.h:148
const_iterator & operator++()
Definition qx-lopmap.h:137
bool operator==(const const_iterator &other) const =default
const_iterator operator++(int)
Definition qx-lopmap.h:139
typename StorageItr::iterator_category iterator_category
Definition qx-lopmap.h:115
const T & operator*() const
Definition qx-lopmap.h:136
const_iterator & operator--()
Definition qx-lopmap.h:146
const Key & key() const
Definition qx-lopmap.h:130
const_iterator()
Definition qx-lopmap.h:126
const T & value() const
Definition qx-lopmap.h:131
The Lopmap::const_reverse_iterator class provides an STL-style const reverse iterator for Lopmap.
Definition qx-lopmap.h:160
The Lopmap class is a template class that provides an "lopsided" associative array.
Definition qx-lopmap.h:87
std::pair< iterator, iterator > equal_range(const T &value)
Definition qx-lopmap.h:309
void insert(Lopmap &&other)
Definition qx-lopmap.h:356
Key key_type
Definition qx-lopmap.h:218
size_type remove(const Key &key)
Definition qx-lopmap.h:378
bool isEmpty() const
Definition qx-lopmap.h:419
bool contains(const Key &key) const
Definition qx-lopmap.h:376
const_iterator upperBound(const T &value) const
Definition qx-lopmap.h:303
iterator insert(const_iterator pos, const Key &key, const T &value)
Definition qx-lopmap.h:375
T operator[](const Key &key) const
Definition qx-lopmap.h:457
const_reverse_iterator rend() const
Definition qx-lopmap.h:286
void insert(const Lopmap &other)
Definition qx-lopmap.h:365
const_iterator begin() const
Definition qx-lopmap.h:274
const_reverse_iterator crend() const
Definition qx-lopmap.h:287
iterator erase(const_iterator first, const_iterator last)
Definition qx-lopmap.h:340
iterator end()
Definition qx-lopmap.h:277
const_iterator constBegin() const
Definition qx-lopmap.h:276
QList< T > values() const
Definition qx-lopmap.h:447
qsizetype size() const
Definition qx-lopmap.h:417
Key key(const T &value, const Key &defaultKey=Key()) const
Definition qx-lopmap.h:324
iterator lowerBound(const T &value)
Definition qx-lopmap.h:293
qsizetype count() const
Definition qx-lopmap.h:418
const_iterator cbegin() const
Definition qx-lopmap.h:275
const T & first() const
Definition qx-lopmap.h:318
void clear()
Definition qx-lopmap.h:422
iterator find(const Key &key)
Definition qx-lopmap.h:290
const_iterator end() const
Definition qx-lopmap.h:278
const Key & firstKey() const
Definition qx-lopmap.h:319
bool empty() const
Definition qx-lopmap.h:420
qsizetype removeIf(Predicate pred)
Definition qx-lopmap.h:394
Lopmap()
Definition qx-lopmap.h:230
iterator begin()
Definition qx-lopmap.h:273
T value(const Key &key, const T &defaultValue=T()) const
Definition qx-lopmap.h:424
reverse_iterator rend()
Definition qx-lopmap.h:285
T take(const Key &key)
Definition qx-lopmap.h:396
QList< Key > keys(const T &value) const
Definition qx-lopmap.h:438
const_iterator lowerBound(const T &value) const
Definition qx-lopmap.h:295
QList< Key > keys() const
Definition qx-lopmap.h:430
const_iterator find(const Key &key) const
Definition qx-lopmap.h:291
bool operator!=(const Lopmap &other) const =default
Compare value_compare
Definition qx-lopmap.h:221
const_reverse_iterator reverse_iterator
Definition qx-lopmap.h:214
const Key & lastKey() const
Definition qx-lopmap.h:322
typename StorageContainer::difference_type difference_type
Definition qx-lopmap.h:217
void swap(Lopmap< Key, T > &other)
Definition qx-lopmap.h:411
iterator upperBound(const T &value)
Definition qx-lopmap.h:301
std::pair< const_iterator, const_iterator > equal_range(const T &value) const
Definition qx-lopmap.h:311
const_reverse_iterator constReverseBegin() const
Definition qx-lopmap.h:284
const_iterator iterator
Definition qx-lopmap.h:211
const_iterator cend() const
Definition qx-lopmap.h:279
const_iterator constEnd() const
Definition qx-lopmap.h:280
const_iterator constFind(const Key &key) const
Definition qx-lopmap.h:292
bool operator==(const Lopmap &other) const
Definition qx-lopmap.h:459
reverse_iterator rbegin()
Definition qx-lopmap.h:281
typename StorageContainer::size_type size_type
Definition qx-lopmap.h:220
const_reverse_iterator rbegin() const
Definition qx-lopmap.h:282
const_reverse_iterator constReverseEnd() const
Definition qx-lopmap.h:288
Lopmap(std::initializer_list< std::pair< Key, T > > list)
Definition qx-lopmap.h:232
const_reverse_iterator crbegin() const
Definition qx-lopmap.h:283
iterator insert(const Key &key, const T &value)
Definition qx-lopmap.h:374
T mapped_Type
Definition qx-lopmap.h:219
const T & last() const
Definition qx-lopmap.h:321
iterator erase(const_iterator pos)
Definition qx-lopmap.h:333
Specifies that a type defines a call operator for the specified argument types (with strict return).
Definition qx-concepts.h:240
Specifies that a predicate is a valid, iterator based predicate for a lopmap.
Definition qx-lopmap.h:21
Specifies that a predicate is a valid, pair based predicate for a lopmap.
Definition qx-lopmap.h:24
Specifies that a predicate is a valid predicate for a lopmap.
Definition qx-lopmap.h:27
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
void append(QList< T > &&value)
The qx-concepts header file provides a library of general purpose concepts as an extension of the sta...