swift
setbuilder.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2021 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_SETBUILDER_H
7 #define SWIFT_MISC_SETBUILDER_H
8 
9 #include <algorithm>
10 #include <iterator>
11 #include <set>
12 #include <vector>
13 
14 #include <QList>
15 #include <QSet>
16 #include <QStringList>
17 
18 namespace swift::misc
19 {
23  template <typename T>
25  {
26  public:
29  void insert(const T &value) { m_list.push_back(value); }
30  void insert(T &&value) { m_list.push_back(std::move(value)); }
32 
34  bool isEmpty() const { return m_list.isEmpty(); }
35 
38  operator QList<T>() const & { return sortAndDeduplicate(m_list); }
39  operator QList<T>() && { return sortAndDeduplicate(std::move(m_list)); }
40  operator QSet<T>() const & { return convertTo<QSet>(sortAndDeduplicate(m_list)); }
41  operator QSet<T>() && { return convertTo<QSet>(sortAndDeduplicate(std::move(m_list))); }
42  operator std::set<T>() const & { return convertTo<std::set>(sortAndDeduplicate(m_list)); }
43  operator std::set<T>() && { return convertTo<std::set>(sortAndDeduplicate(std::move(m_list))); }
44  operator std::vector<T>() const & { return convertTo<std::vector>(sortAndDeduplicate(m_list)); }
45  operator std::vector<T>() && { return convertTo<std::vector>(sortAndDeduplicate(std::move(m_list))); }
46  template <typename U = T, typename = std::enable_if_t<std::is_same_v<U, QString>>>
47  operator QStringList() const &
48  {
49  return sortAndDeduplicate(m_list);
50  }
51  template <typename U = T, typename = std::enable_if_t<std::is_same_v<U, QString>>>
52  operator QStringList() &&
53  {
54  return sortAndDeduplicate(std::move(m_list));
55  }
57 
58  private:
59  QList<T> m_list;
60 
61  static QList<T> sortAndDeduplicate(QList<T> list)
62  {
63  std::sort(list.begin(), list.end());
64  list.erase(std::unique(list.begin(), list.end()), list.end());
65  return list;
66  }
67 
68  template <template <typename...> class C>
69  static C<T> convertTo(QList<T> &&list)
70  {
71  return C<T>(std::make_move_iterator(list.begin()), std::make_move_iterator(list.end()));
72  }
73  };
74 } // namespace swift::misc
75 
76 #endif // SWIFT_MISC_SETBUILDER_H
Build a QSet more efficiently when calling insert() in a for loop.
Definition: setbuilder.h:25
bool isEmpty() const
True if no elements have been inserted.
Definition: setbuilder.h:34
void insert(T &&value)
Add an element to the set. Runs in amortized constant time.
Definition: setbuilder.h:30
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Definition: setbuilder.h:29
Free functions in swift::misc.