commonlib
insertion_ordered_set.h
Go to the documentation of this file.
1 #pragma once
2 
17 #include <vector>
18 #include <algorithm>
19 
20 #include "containers.h"
21 
22 
23 BEGIN_NAMESPACE_CONTAINERS
24 
25 template <typename T>
27 {
28 public:
29  using iterator = typename std::vector<T>::iterator;
30  using const_iterator = typename std::vector<T>::const_iterator;
31 
32 public:
33  InsertionOrderedSet() = default;
34  InsertionOrderedSet(std::initializer_list<T> elements);
35 
36  void insert(const T& element);
37  template<class InputIt>
38  void insert(InputIt first, InputIt last);
39  void insert(std::initializer_list<T> elements);
40  void clear();
41 
42  bool contains(const T& element) const;
43  iterator find(const T& element);
44  const_iterator find(const T& element) const;
45 
46  T& operator[](std::size_t index);
47  const T& operator[](std::size_t index) const;
48  std::size_t size() const;
49  bool empty() const;
50 
51  iterator begin();
52  iterator end();
53  const_iterator begin() const;
54  const_iterator end() const;
55 
56  bool operator==(const InsertionOrderedSet<T>& other) const;
57  bool operator!=(const InsertionOrderedSet<T>& other) const;
58  bool operator<(const InsertionOrderedSet<T>& other) const;
59 
60 private:
61  std::vector<T> elements;
62 };
63 
64 template <typename T>
65 InsertionOrderedSet<T>::InsertionOrderedSet(std::initializer_list<T> elements)
66 {
67  for (const auto& element : elements)
68  insert(element);
69 }
70 
71 template <typename T>
72 template <class InputIt>
73 void InsertionOrderedSet<T>::insert(InputIt first, InputIt last)
74 {
75  static_assert(std::is_same<typename std::iterator_traits<InputIt>::value_type, T>::value,
76  "InsertionOrderedSet InputIt must be an iterator of type T");
77  for (auto it = first; it != last; ++it)
78  insert(*it);
79 }
80 
81 template <typename T>
82 void InsertionOrderedSet<T>::insert(const T& element)
83 {
84  if (!contains(element))
85  elements.emplace_back(element);
86 }
87 
88 template <typename T>
89 void InsertionOrderedSet<T>::insert(std::initializer_list<T> elements)
90 {
91  for (const auto& element : elements)
92  insert(element);
93 }
94 
95 template <typename T>
97 {
98  elements.clear();
99 }
100 
101 template <typename T>
102 bool InsertionOrderedSet<T>::contains(const T& element) const
103 {
104  return std::find(elements.begin(), elements.end(), element) != elements.end();
105 }
106 
107 template <typename T>
108 typename InsertionOrderedSet<T>::iterator InsertionOrderedSet<T>::find(const T& element)
109 {
110  return std::find(elements.begin(), elements.end(), element);
111 }
112 
113 template <typename T>
114 typename InsertionOrderedSet<T>::const_iterator InsertionOrderedSet<T>::find(const T& element) const
115 {
116  return std::find(elements.begin(), elements.end(), element);
117 }
118 
119 template <typename T>
120 T& InsertionOrderedSet<T>::operator[](std::size_t index)
121 {
122  return elements[index];
123 }
124 
125 template <typename T>
126 const T& InsertionOrderedSet<T>::operator[](std::size_t index) const
127 {
128  return elements[index];
129 }
130 
131 template <typename T>
132 std::size_t InsertionOrderedSet<T>::size() const
133 {
134  return elements.size();
135 }
136 
137 template <typename T>
139 {
140  return elements.empty();
141 }
142 
143 template <typename T>
144 typename InsertionOrderedSet<T>::iterator InsertionOrderedSet<T>::begin()
145 {
146  return elements.begin();
147 }
148 
149 template <typename T>
150 typename InsertionOrderedSet<T>::iterator InsertionOrderedSet<T>::end()
151 {
152  return elements.end();
153 }
154 
155 template <typename T>
156 typename InsertionOrderedSet<T>::const_iterator InsertionOrderedSet<T>::begin() const
157 {
158  return elements.begin();
159 }
160 
161 template <typename T>
162 typename InsertionOrderedSet<T>::const_iterator InsertionOrderedSet<T>::end() const
163 {
164  return elements.end();
165 }
166 
167 template <typename T>
169 {
170  return elements == other.elements;
171 }
172 
173 template <typename T>
175 {
176  return !(*this == other);
177 }
178 
179 template <typename T>
181 {
182  return elements < other.elements;
183 }
184 
185 END_NAMESPACE_CONTAINERS
186 
187 
Definition: insertion_ordered_set.h:26