6 #ifndef SWIFT_MISC_MAPBUILDER_H
7 #define SWIFT_MISC_MAPBUILDER_H
24 template <
typename K,
typename V>
29 template <
typename... Ts>
32 m_list.push_back(std::make_pair(std::forward<Ts>(keyAndValue)...));
36 bool isEmpty()
const {
return m_list.isEmpty(); }
40 operator QMap<K, V>() const & {
return convertToMap(sortAndDeduplicate(m_list)); }
41 operator QMap<K, V>() && {
return convertToMap(sortAndDeduplicate(std::move(m_list))); }
42 operator QHash<K, V>() const & {
return convertTo<QHash>(sortAndDeduplicate(m_list)); }
43 operator QHash<K, V>() && {
return convertTo<QHash>(sortAndDeduplicate(std::move(m_list))); }
44 operator std::map<K, V>() const & {
return convertTo<std::map>(sortAndDeduplicate(m_list)); }
45 operator std::map<K, V>() && {
return convertTo<std::map>(sortAndDeduplicate(std::move(m_list))); }
49 QList<std::pair<K, V>> m_list;
51 static QList<std::pair<K, V>> sortAndDeduplicate(QList<std::pair<K, V>> list)
53 std::sort(list.begin(), list.end(), [](
auto &&a,
auto &&b) { return std::less<>()(a.first, b.first); });
54 list.erase(std::unique(list.begin(), list.end(), [](
auto &&a,
auto &&b) { return a.first == b.first; }),
59 template <
template <
typename...>
class C>
60 static C<K, V> convertTo(QList<std::pair<K, V>> &&list)
62 return C<K, V>(std::make_move_iterator(list.begin()), std::make_move_iterator(list.end()));
65 static QMap<K, V> convertToMap(QList<std::pair<K, V>> &&list)
68 for (
auto &pair :
makeRange(list).reverse())
70 map.insert(map.cbegin(), std::move(pair.first), std::move(pair.second));
Build a QMap more efficiently when calling insert() in a for loop.
bool isEmpty() const
True if no pairs have been inserted.
void insert(Ts &&...keyAndValue)
Add an key/value pair to the map. Runs in amortized constant time.
Free functions in swift::misc.
auto makeRange(I begin, I2 end) -> CRange< I >
Returns a CRange constructed from begin and end iterators of deduced types.