All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ExposedVector.h
Go to the documentation of this file.
1 // Copyright (c) 2002-present, OpenMS Inc. -- EKU Tuebingen, ETH Zurich, and FU Berlin
2 // SPDX-License-Identifier: BSD-3-Clause
3 //
4 // --------------------------------------------------------------------------
5 // $Maintainer: Chris Bielow $
6 // $Authors: Chris Bielow $
7 // --------------------------------------------------------------------------
8 
9 #pragma once
10 
11 
12 #include <cstddef> // for size_t
13 #include <vector>
14 #include <algorithm>
15 #include <concepts>
16 
17 namespace OpenMS
18 {
19  template<typename T>
20  concept LessThanComparable = requires(const T& a, const T& b) { // less and greater
21  { a < b } -> std::convertible_to<bool>;
22  };
23 
24 
26 #define EXPOSED_VECTOR_INTERFACE(InnerElement) \
27  using ExpVec = ExposedVector< InnerElement >; \
28  using ExpVec::ExposedVector; \
29  using value_type = typename ExpVec::value_type; \
30  using iterator = typename ExpVec::iterator; \
31  using const_iterator = typename ExpVec::const_iterator; \
32  using reverse_iterator = typename ExpVec::reverse_iterator; \
33  using const_reverse_iterator = typename ExpVec::const_reverse_iterator; \
34  using size_type = typename ExpVec::size_type; \
35  using pointer = typename ExpVec::pointer; \
36  using reference = typename ExpVec::reference; \
37  using const_reference = typename ExpVec::const_reference; \
38  using difference_type = typename ExpVec::difference_type; \
39 
40 
60  template<class VectorElement>
62  {
63  public:
64  using VecMember = std::vector<VectorElement>;
65 
66  // types
67  using value_type = typename VecMember::value_type;
68  using iterator = typename VecMember::iterator;
69  using const_iterator = typename VecMember::const_iterator;
70  using reverse_iterator = typename VecMember::reverse_iterator;
71  using const_reverse_iterator = typename VecMember::const_reverse_iterator;
72  using size_type = typename VecMember::size_type;
73  using pointer = typename VecMember::pointer;
74  using reference = typename VecMember::reference;
75  using const_reference = typename VecMember::const_reference;
76  using difference_type = typename VecMember::difference_type;
77 
78  protected:
80 
81  public:
82  ExposedVector() = default;
83  explicit ExposedVector(const size_t n)
84  : data_(n)
85  {
86  }
87  ExposedVector(const size_t n, const VectorElement& val) : data_(n, val)
88  {
89  }
90  template <class Iter> ExposedVector(Iter begin, Iter end)
91  : data_(begin, end)
92  {
93  }
95  ExposedVector(const ExposedVector& rhs) = default;
97  ExposedVector(ExposedVector&& rhs) noexcept = default;
98 
100  ExposedVector& operator=(const ExposedVector& rhs) = default;
102  ExposedVector& operator=(ExposedVector&& rhs) noexcept = default;
103 
104  iterator begin() noexcept
105  {
106  return data_.begin();
107  }
108  iterator end() noexcept
109  {
110  return data_.end();
111  }
112  const_iterator begin() const noexcept
113  {
114  return data_.begin();
115  }
116  const_iterator end() const noexcept
117  {
118  return data_.end();
119  }
120  const_iterator cbegin() const noexcept
121  {
122  return data_.cbegin();
123  }
124  const_iterator cend() const noexcept
125  {
126  return data_.cend();
127  }
128  size_t size() const noexcept
129  {
130  return data_.size();
131  }
132  void resize(const size_t new_size)
133  {
134  data_.resize(new_size);
135  }
136  void reserve(const size_t new_size)
137  {
138  data_.reserve(new_size);
139  }
140  bool empty() const noexcept
141  {
142  return data_.empty();
143  }
144  VectorElement& operator[](size_t i) noexcept
145  {
146  return data_[i];
147  }
148  const VectorElement& operator[](size_t i) const noexcept
149  {
150  return data_[i];
151  }
152  VectorElement& at(size_t i)
153  {
154  return data_.at(i);
155  }
156  const VectorElement& at(size_t i) const
157  {
158  return data_.at(i);
159  }
160  VectorElement& back() noexcept
161  {
162  return data_.back();
163  }
164  const VectorElement& back() const noexcept
165  {
166  return data_.back();
167  }
168  void push_back(const VectorElement& f)
169  {
170  data_.push_back(f);
171  }
172  void push_back(VectorElement&& f)
173  {
174  data_.push_back(std::move(f));
175  }
176  template<typename... Args>
177  decltype(auto) emplace_back(Args&&... args)
178  {
179  return data_.emplace_back(std::forward<Args>(args)...);
180  }
181  void pop_back() noexcept
182  {
183  data_.pop_back();
184  }
185  iterator erase(const_iterator where) noexcept
186  {
187  return data_.erase(where);
188  }
190  {
191  return data_.erase(from, to);
192  }
193  template<typename T>
194  iterator insert(const_iterator where, T from, T to)
195  {
196  return data_.insert(where, from, to);
197  }
198 
200  void clear() noexcept
201  {
202  data_.clear();
203  }
204 
207  {
208  return data_.rbegin();
209  }
210 
213  {
214  return data_.rbegin();
215  }
216 
219  {
220  return data_.rend();
221  }
222 
224  const_reverse_iterator rend() const noexcept
225  {
226  return data_.rend();
227  }
228 
231  {
232  return data_.crbegin();
233  }
234 
236  const_reverse_iterator crend() const noexcept
237  {
238  return data_.crend();
239  }
240 
242  void swap(ExposedVector& other) noexcept
243  {
244  data_.swap(other.data_);
245  }
246 
248  template<typename InputIt>
249  void assign(InputIt first, InputIt last)
250  {
251  data_.assign(first, last);
252  }
253 
255  void assign(size_type count, const VectorElement& value)
256  {
257  data_.assign(count, value);
258  }
259 
261  void assign(std::initializer_list<VectorElement> init)
262  {
263  data_.assign(init);
264  }
265 
267  VectorElement& front() noexcept
268  {
269  return data_.front();
270  }
271 
273  const VectorElement& front() const noexcept
274  {
275  return data_.front();
276  }
277 
279  size_type max_size() const noexcept
280  {
281  return data_.max_size();
282  }
283 
285  size_type capacity() const noexcept
286  {
287  return data_.capacity();
288  }
289 
292  {
293  data_.shrink_to_fit();
294  }
295 
297  iterator insert(const_iterator pos, const VectorElement& value)
298  {
299  return data_.insert(pos, value);
300  }
301 
303  iterator insert(const_iterator pos, VectorElement&& value)
304  {
305  return data_.insert(pos, std::move(value));
306  }
307 
309  iterator insert(const_iterator pos, size_type count, const VectorElement& value)
310  {
311  return data_.insert(pos, count, value);
312  }
313 
315  iterator insert(const_iterator pos, std::initializer_list<VectorElement> init)
316  {
317  return data_.insert(pos, init);
318  }
319 
321  template<typename... Args>
323  {
324  return data_.emplace(pos, std::forward<Args>(args)...);
325  }
326 
328  const VecMember& getData() const
329  {
330  return data_;
331  }
334  {
335  return data_;
336  }
337 
339  bool operator==(const ExposedVector& other) const
340  {
341  return data_ == other.data_;
342  }
343 
345  bool operator!=(const ExposedVector& other) const
346  {
347  return data_ != other.data_;
348  }
349 
350  // Define operators only if underlying vector supports them
351  bool operator<(const ExposedVector& other) const requires LessThanComparable<VectorElement>
352  {
353  return data_ < other.data_;
354  }
355 
356  bool operator<=(const ExposedVector& other) const requires LessThanComparable<VectorElement>
357  {
358  return data_ <= other.data_;
359  }
360 
361  bool operator>(const ExposedVector& other) const requires LessThanComparable<VectorElement>
362  {
363  return data_ > other.data_;
364  }
365 
366  bool operator>=(const ExposedVector& other) const requires LessThanComparable<VectorElement>
367  {
368  return data_ >= other.data_;
369  }
370  };
371 } // namespace OpenMS
Definition: ExposedVector.h:62
iterator insert(const_iterator where, T from, T to)
Definition: ExposedVector.h:194
void clear() noexcept
Clear all elements.
Definition: ExposedVector.h:200
std::vector< VectorElement > VecMember
Definition: ExposedVector.h:64
iterator insert(const_iterator pos, std::initializer_list< VectorElement > init)
Insert from initializer list.
Definition: ExposedVector.h:315
typename VecMember::iterator iterator
Definition: ExposedVector.h:68
const_iterator begin() const noexcept
Definition: ExposedVector.h:112
iterator insert(const_iterator pos, size_type count, const VectorElement &value)
Insert n copies of value.
Definition: ExposedVector.h:309
typename VecMember::const_iterator const_iterator
Definition: ExposedVector.h:69
const VectorElement & front() const noexcept
Get first element (const)
Definition: ExposedVector.h:273
bool operator==(const ExposedVector &other) const
Equality comparison.
Definition: ExposedVector.h:339
bool operator<=(const ExposedVector &other) const requires LessThanComparable< VectorElement >
Definition: ExposedVector.h:356
void assign(size_type count, const VectorElement &value)
Assign n copies of value.
Definition: ExposedVector.h:255
void reserve(const size_t new_size)
Definition: ExposedVector.h:136
typename VecMember::pointer pointer
Definition: ExposedVector.h:73
bool operator!=(const ExposedVector &other) const
Inequality comparison.
Definition: ExposedVector.h:345
size_t size() const noexcept
Definition: ExposedVector.h:128
bool empty() const noexcept
Definition: ExposedVector.h:140
bool operator<(const ExposedVector &other) const requires LessThanComparable< VectorElement >
Definition: ExposedVector.h:351
ExposedVector(const size_t n)
Definition: ExposedVector.h:83
bool operator>=(const ExposedVector &other) const requires LessThanComparable< VectorElement >
Definition: ExposedVector.h:366
void swap(ExposedVector &other) noexcept
Swap contents with another ExposedVector.
Definition: ExposedVector.h:242
decltype(auto) emplace_back(Args &&... args)
Definition: ExposedVector.h:177
typename VecMember::size_type size_type
Definition: ExposedVector.h:72
VectorElement & back() noexcept
Definition: ExposedVector.h:160
bool operator>(const ExposedVector &other) const requires LessThanComparable< VectorElement >
Definition: ExposedVector.h:361
typename VecMember::value_type value_type
Definition: ExposedVector.h:67
const_iterator end() const noexcept
Definition: ExposedVector.h:116
iterator emplace(const_iterator pos, Args &&... args)
Emplace element at position.
Definition: ExposedVector.h:322
VectorElement & front() noexcept
Get first element.
Definition: ExposedVector.h:267
void shrink_to_fit()
Shrink capacity to fit size.
Definition: ExposedVector.h:291
typename VecMember::reverse_iterator reverse_iterator
Definition: ExposedVector.h:70
iterator insert(const_iterator pos, const VectorElement &value)
Insert single element.
Definition: ExposedVector.h:297
iterator insert(const_iterator pos, VectorElement &&value)
Insert single element (move)
Definition: ExposedVector.h:303
typename VecMember::const_reference const_reference
Definition: ExposedVector.h:75
ExposedVector(ExposedVector &&rhs) noexcept=default
Move C'tor.
const VectorElement & back() const noexcept
Definition: ExposedVector.h:164
typename VecMember::difference_type difference_type
Definition: ExposedVector.h:76
VecMember data_
the container which holds all the data
Definition: ExposedVector.h:79
ExposedVector & operator=(ExposedVector &&rhs) noexcept=default
Move Assignment.
const VectorElement & operator[](size_t i) const noexcept
Definition: ExposedVector.h:148
void pop_back() noexcept
Definition: ExposedVector.h:181
iterator begin() noexcept
Definition: ExposedVector.h:104
const_iterator cend() const noexcept
Definition: ExposedVector.h:124
void resize(const size_t new_size)
Definition: ExposedVector.h:132
void push_back(VectorElement &&f)
Definition: ExposedVector.h:172
ExposedVector & operator=(const ExposedVector &rhs)=default
Assignment.
VectorElement & at(size_t i)
Definition: ExposedVector.h:152
typename VecMember::reference reference
Definition: ExposedVector.h:74
void assign(std::initializer_list< VectorElement > init)
Assign from initializer list.
Definition: ExposedVector.h:261
VectorElement & operator[](size_t i) noexcept
Definition: ExposedVector.h:144
const VectorElement & at(size_t i) const
Definition: ExposedVector.h:156
const_reverse_iterator crbegin() const noexcept
Get const reverse iterator to beginning.
Definition: ExposedVector.h:230
void assign(InputIt first, InputIt last)
Assign values from iterators.
Definition: ExposedVector.h:249
ExposedVector(const size_t n, const VectorElement &val)
Definition: ExposedVector.h:87
const_iterator cbegin() const noexcept
Definition: ExposedVector.h:120
size_type max_size() const noexcept
Get maximum possible size.
Definition: ExposedVector.h:279
const_reverse_iterator rend() const noexcept
Get const reverse iterator to end.
Definition: ExposedVector.h:224
reverse_iterator rbegin() noexcept
Get reverse iterator to beginning.
Definition: ExposedVector.h:206
const_reverse_iterator crend() const noexcept
Get const reverse iterator to end.
Definition: ExposedVector.h:236
void push_back(const VectorElement &f)
Definition: ExposedVector.h:168
VecMember & getData()
read access to the underlying data
Definition: ExposedVector.h:333
reverse_iterator rend() noexcept
Get reverse iterator to end.
Definition: ExposedVector.h:218
ExposedVector(const ExposedVector &rhs)=default
Copy C'tor.
ExposedVector(Iter begin, Iter end)
Definition: ExposedVector.h:90
size_type capacity() const noexcept
Get current capacity.
Definition: ExposedVector.h:285
typename VecMember::const_reverse_iterator const_reverse_iterator
Definition: ExposedVector.h:71
const VecMember & getData() const
read-only access to the underlying data
Definition: ExposedVector.h:328
iterator erase(const_iterator where) noexcept
Definition: ExposedVector.h:185
iterator erase(const_iterator from, const_iterator to) noexcept
Definition: ExposedVector.h:189
iterator end() noexcept
Definition: ExposedVector.h:108
const_reverse_iterator rbegin() const noexcept
Get const reverse iterator to beginning.
Definition: ExposedVector.h:212
custom arguments to allow for looping calls
Definition: WizardHelper.h:47
Main OpenMS namespace.
Definition: openswathalgo/include/OpenMS/OPENSWATHALGO/DATAACCESS/ISpectrumAccess.h:19
concept LessThanComparable
Definition: ExposedVector.h:20