OpenMS
Loading...
Searching...
No Matches
IDDataContainer.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: Timo Sachsenberg $
6// $Authors: Timo Sachsenberg $
7// --------------------------------------------------------------------------
8
9#pragma once
10
11#include <algorithm>
12#include <concepts>
13#include <cstddef>
14#include <initializer_list>
15#include <iterator>
16#include <set>
17#include <tuple>
18#include <type_traits>
19#include <utility>
20#include <vector>
21
23{
24namespace Detail
25{
26 template<typename T>
27 inline constexpr bool is_tuple = false;
28 template<typename... T>
29 inline constexpr bool is_tuple<std::tuple<T...>> = true;
30
33 template<std::size_t I = 0, typename A, typename B>
34 bool tupleLess(const A& a, const B& b)
35 {
36 constexpr std::size_t n = std::min(std::tuple_size_v<A>, std::tuple_size_v<B>);
37 if constexpr (I == n) return false;
38 else
39 {
40 if (std::get<I>(a) < std::get<I>(b)) return true;
41 if (std::get<I>(b) < std::get<I>(a)) return false;
42 return tupleLess<I + 1>(a, b);
43 }
44 }
45} // namespace Detail
46
60template<typename Value, typename Key, typename Prefix = Key, auto... KeyMembers>
62{
63 static_assert(sizeof...(KeyMembers) > 0, "the key members of the record type are required");
64
65 // A record compares by its key members, a key or prefix by itself, both as tuples.
66 template<typename T>
67 static decltype(auto) keyView(const T& x)
68 {
69 if constexpr (std::is_same_v<T, Value>) return std::tie(x.*KeyMembers...);
70 else if constexpr (Detail::is_tuple<T>) return (x);
71 else return std::tie(x);
72 }
73 struct Compare
74 {
75 using is_transparent = void;
76 template<typename A, typename B>
77 bool operator()(const A& a, const B& b) const
78 { return Detail::tupleLess(keyView(a), keyView(b)); }
79 };
80 using Set = std::set<Value, Compare>;
82
83public:
84 using value_type = Value;
85 using key_type = Key;
86 using size_type = std::size_t;
87 using iterator = typename Set::const_iterator;
89 using reverse_iterator = std::reverse_iterator<iterator>;
91
92 IDDataContainer() = default;
93 IDDataContainer(std::initializer_list<Value> values)
94 {
95 for (const auto& value : values)
96 insert(value);
97 }
98
100 { return records_.begin(); }
101 iterator end() const
102 { return records_.end(); }
104 { return begin(); }
106 { return end(); }
108 { return reverse_iterator(end()); }
110 { return reverse_iterator(begin()); }
111 const Value& front() const
112 { return *begin(); }
113 const Value& back() const
114 { return *--end(); }
115 bool empty() const
116 { return records_.empty(); }
118 { return records_.size(); }
119 void clear()
120 { records_.clear(); }
121 void swap(IDDataContainer& other) noexcept
122 { records_.swap(other.records_); }
123 std::pair<iterator, bool> insert(const Value& value)
124 { return records_.insert(value); }
125 std::pair<iterator, bool> push_back(const Value& value)
126 { return insert(value); }
127 template<typename... Args>
128 std::pair<iterator, bool> emplace(Args&&... args)
129 { return insert(Value(std::forward<Args>(args)...)); }
130 template<typename... Args>
131 std::pair<iterator, bool> emplace_back(Args&&... args)
132 { return emplace(std::forward<Args>(args)...); }
134 { return records_.erase(position); }
141 template<typename Modifier>
142 bool modify(iterator& position, Modifier&& modifier)
143 {
144 // The set exposes its records as const to protect their order; the key is checked below.
145 modifier(const_cast<Value&>(*position));
146 if (stillOrdered_(position)) return true;
147 auto next = std::next(position);
148 auto node = records_.extract(position);
149 auto result = records_.insert(std::move(node));
150 if (result.inserted)
151 {
152 position = result.position;
153 return true;
154 }
155 position = next;
156 return false;
157 }
158 iterator find(const Key& key) const
159 { return records_.find(key); }
160 std::pair<iterator, iterator> equal_range(const Prefix& key) const
161 { return records_.equal_range(key); }
162
164 friend bool operator==(const IDDataContainer& lhs, const IDDataContainer& rhs)
165 requires std::equality_comparable<Value>
166 { return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()); }
167
168private:
170 bool stillOrdered_(iterator position) const
171 {
172 const auto& less = records_.key_comp();
173 if (position != records_.begin() && ! less(*std::prev(position), *position)) return false;
174 auto next = std::next(position);
175 return next == records_.end() || less(*position, *next);
176 }
177};
178
185template<typename Value, typename Key, auto KeyMember>
187{
188 std::vector<Value> records_;
189
190public:
191 using value_type = Value;
192 using key_type = Key;
193 using size_type = std::size_t;
194 using iterator = typename std::vector<Value>::const_iterator;
196 using reverse_iterator = std::reverse_iterator<iterator>;
198
200 IDSequencedContainer(std::initializer_list<Value> values)
201 {
202 for (const auto& value : values)
203 push_back(value);
204 }
205
207 { return records_.begin(); }
208 iterator end() const
209 { return records_.end(); }
211 { return begin(); }
213 { return end(); }
215 { return reverse_iterator(end()); }
217 { return reverse_iterator(begin()); }
218 const Value& front() const
219 { return records_.front(); }
220 const Value& back() const
221 { return records_.back(); }
222 bool empty() const
223 { return records_.empty(); }
225 { return records_.size(); }
226 void clear()
227 { records_.clear(); }
228 void swap(IDSequencedContainer& other) noexcept
229 { records_.swap(other.records_); }
231 std::pair<iterator, bool> push_back(const Value& value)
232 {
233 auto position = find(value.*KeyMember);
234 if (position != end()) return {position, false};
235 records_.push_back(value);
236 return {std::prev(end()), true};
237 }
238 std::pair<iterator, bool> insert(const Value& value)
239 { return push_back(value); }
240 template<typename... Args>
241 std::pair<iterator, bool> emplace_back(Args&&... args)
242 { return push_back(Value(std::forward<Args>(args)...)); }
243 template<typename... Args>
244 std::pair<iterator, bool> emplace(Args&&... args)
245 { return emplace_back(std::forward<Args>(args)...); }
247 { return records_.erase(position); }
248 iterator find(const Key& key) const
249 {
250 return std::find_if(records_.begin(), records_.end(), [&key](const Value& value) { return value.*KeyMember == key; });
251 }
252 std::pair<iterator, iterator> equal_range(const Key& key) const
253 {
254 auto position = find(key);
255 return {position, position == end() ? position : std::next(position)};
256 }
258 template<typename Modifier>
259 bool modify(iterator& position, Modifier&& modifier)
260 {
261 Value& value = records_[position - begin()];
262 modifier(value);
263 for (auto it = begin(); it != end(); ++it)
264 {
265 if (it != position && (*it).*KeyMember == value.*KeyMember)
266 {
267 position = erase(position);
268 return false;
269 }
270 }
271 return true;
272 }
273
276 {
277 protected:
279
280 public:
281 explicit ConstOrderedView(const IDSequencedContainer* owner): owner_(owner)
282 {
283 }
284 iterator find(const Key& key) const
285 { return owner_->find(key); }
286 iterator end() const
287 { return owner_->end(); }
289 { return owner_->size(); }
290 bool empty() const
291 { return owner_->empty(); }
292 };
294 {
296
297 public:
299 {
300 }
301 template<typename Modifier>
302 bool modify(iterator& position, Modifier&& modifier)
303 { return mutable_owner_->modify(position, std::forward<Modifier>(modifier)); }
304 };
305 template<int Index>
307 {
308 static_assert(Index == 1);
310 };
311 template<int Index>
313 {
314 static_assert(Index == 1);
315 return OrderedView(this);
316 }
317 template<int Index>
319 {
320 static_assert(Index == 1);
321 return ConstOrderedView(this);
322 }
323
325 friend bool operator==(const IDSequencedContainer& lhs, const IDSequencedContainer& rhs)
326 requires std::equality_comparable<Value>
327 { return lhs.records_ == rhs.records_; }
328};
329} // namespace OpenMS::IdentificationDataInternal
A collection of identification records, unique and ordered by the key formed from the members KeyMemb...
Definition IDDataContainer.h:62
iterator begin() const
Definition IDDataContainer.h:99
Value value_type
Definition IDDataContainer.h:84
reverse_iterator const_reverse_iterator
Definition IDDataContainer.h:90
bool stillOrdered_(iterator position) const
True if the record at position still sorts strictly between its neighbours.
Definition IDDataContainer.h:170
static decltype(auto) keyView(const T &x)
Definition IDDataContainer.h:67
reverse_iterator rbegin() const
Definition IDDataContainer.h:107
std::pair< iterator, bool > insert(const Value &value)
Definition IDDataContainer.h:123
std::pair< iterator, iterator > equal_range(const Prefix &key) const
Definition IDDataContainer.h:160
iterator cbegin() const
Definition IDDataContainer.h:103
friend bool operator==(const IDDataContainer &lhs, const IDDataContainer &rhs)
Value equality is available only for equality-comparable record types.
Definition IDDataContainer.h:164
Set records_
Definition IDDataContainer.h:81
size_type size() const
Definition IDDataContainer.h:117
bool empty() const
Definition IDDataContainer.h:115
iterator const_iterator
Definition IDDataContainer.h:88
typename Set::const_iterator iterator
Definition IDDataContainer.h:87
iterator end() const
Definition IDDataContainer.h:101
std::pair< iterator, bool > emplace_back(Args &&... args)
Definition IDDataContainer.h:131
std::set< Value, Compare > Set
Definition IDDataContainer.h:80
iterator erase(iterator position)
Definition IDDataContainer.h:133
bool modify(iterator &position, Modifier &&modifier)
Calls modifier(Value&) on the record at position.
Definition IDDataContainer.h:142
std::pair< iterator, bool > push_back(const Value &value)
Definition IDDataContainer.h:125
void swap(IDDataContainer &other) noexcept
Definition IDDataContainer.h:121
IDDataContainer(std::initializer_list< Value > values)
Definition IDDataContainer.h:93
reverse_iterator rend() const
Definition IDDataContainer.h:109
const Value & back() const
Definition IDDataContainer.h:113
std::pair< iterator, bool > emplace(Args &&... args)
Definition IDDataContainer.h:128
void clear()
Definition IDDataContainer.h:119
Key key_type
Definition IDDataContainer.h:85
std::reverse_iterator< iterator > reverse_iterator
Definition IDDataContainer.h:89
iterator find(const Key &key) const
Definition IDDataContainer.h:158
iterator cend() const
Definition IDDataContainer.h:105
std::size_t size_type
Definition IDDataContainer.h:86
const Value & front() const
Definition IDDataContainer.h:111
Lookup of records by key.
Definition IDDataContainer.h:276
size_type size() const
Definition IDDataContainer.h:288
const IDSequencedContainer * owner_
Definition IDDataContainer.h:278
ConstOrderedView(const IDSequencedContainer *owner)
Definition IDDataContainer.h:281
iterator find(const Key &key) const
Definition IDDataContainer.h:284
OrderedView(IDSequencedContainer *owner)
Definition IDDataContainer.h:298
bool modify(iterator &position, Modifier &&modifier)
Definition IDDataContainer.h:302
IDSequencedContainer * mutable_owner_
Definition IDDataContainer.h:295
Records kept in the order they were added, unique by the member KeyMember.
Definition IDDataContainer.h:187
friend bool operator==(const IDSequencedContainer &lhs, const IDSequencedContainer &rhs)
Value equality is available only for equality-comparable record types.
Definition IDDataContainer.h:325
iterator begin() const
Definition IDDataContainer.h:206
Value value_type
Definition IDDataContainer.h:191
reverse_iterator const_reverse_iterator
Definition IDDataContainer.h:197
reverse_iterator rbegin() const
Definition IDDataContainer.h:214
std::pair< iterator, bool > insert(const Value &value)
Definition IDDataContainer.h:238
ConstOrderedView get() const
Definition IDDataContainer.h:318
iterator cbegin() const
Definition IDDataContainer.h:210
size_type size() const
Definition IDDataContainer.h:224
bool empty() const
Definition IDDataContainer.h:222
iterator const_iterator
Definition IDDataContainer.h:195
iterator end() const
Definition IDDataContainer.h:208
std::pair< iterator, bool > emplace_back(Args &&... args)
Definition IDDataContainer.h:241
iterator erase(iterator position)
Definition IDDataContainer.h:246
bool modify(iterator &position, Modifier &&modifier)
As IDDataContainer::modify(): a modification that duplicates another record's key erases the record.
Definition IDDataContainer.h:259
OrderedView get()
Definition IDDataContainer.h:312
std::pair< iterator, bool > push_back(const Value &value)
Appends value unless a record with its key exists; then that record and false.
Definition IDDataContainer.h:231
reverse_iterator rend() const
Definition IDDataContainer.h:216
typename std::vector< Value >::const_iterator iterator
Definition IDDataContainer.h:194
const Value & back() const
Definition IDDataContainer.h:220
std::pair< iterator, bool > emplace(Args &&... args)
Definition IDDataContainer.h:244
void swap(IDSequencedContainer &other) noexcept
Definition IDDataContainer.h:228
void clear()
Definition IDDataContainer.h:226
Key key_type
Definition IDDataContainer.h:192
std::vector< Value > records_
Definition IDDataContainer.h:188
std::reverse_iterator< iterator > reverse_iterator
Definition IDDataContainer.h:196
IDSequencedContainer(std::initializer_list< Value > values)
Definition IDDataContainer.h:200
iterator find(const Key &key) const
Definition IDDataContainer.h:248
iterator cend() const
Definition IDDataContainer.h:212
std::size_t size_type
Definition IDDataContainer.h:193
std::pair< iterator, iterator > equal_range(const Key &key) const
Definition IDDataContainer.h:252
const Value & front() const
Definition IDDataContainer.h:218
Definition AhoCorasickAmbiguous.h:218
@ A
a-ion (N-terminal, loses CO)
@ B
b-ion (N-terminal)
constexpr bool is_tuple
Definition IDDataContainer.h:27
bool tupleLess(const A &a, const B &b)
Definition IDDataContainer.h:34
Definition AppliedProcessingStep.h:22
bool operator()(const A &a, const B &b) const
Definition IDDataContainer.h:77