14#include <initializer_list>
28 template<
typename... T>
29 inline constexpr bool is_tuple<std::tuple<T...>> =
true;
33 template<std::
size_t I = 0,
typename A,
typename B>
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;
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);
60template<
typename Value,
typename Key,
typename Prefix = Key,
auto... KeyMembers>
63 static_assert(
sizeof...(KeyMembers) > 0,
"the key members of the record type are required");
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);
76 template<
typename A,
typename B>
80 using Set = std::set<Value, Compare>;
95 for (
const auto& value : values)
123 std::pair<iterator, bool>
insert(
const Value& 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>
132 {
return emplace(std::forward<Args>(args)...); }
134 {
return records_.erase(position); }
141 template<
typename Modifier>
145 modifier(
const_cast<Value&
>(*position));
147 auto next = std::next(position);
148 auto node =
records_.extract(position);
149 auto result =
records_.insert(std::move(node));
152 position = result.position;
160 std::pair<iterator, iterator>
equal_range(
const Prefix& key)
const
161 {
return records_.equal_range(key); }
165 requires std::equality_comparable<Value>
166 {
return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()); }
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);
185template<
typename Value,
typename Key, auto KeyMember>
194 using iterator =
typename std::vector<Value>::const_iterator;
202 for (
const auto& value : values)
233 auto position =
find(value.*KeyMember);
234 if (position !=
end())
return {position,
false};
236 return {std::prev(
end()),
true};
238 std::pair<iterator, bool>
insert(
const Value& value)
240 template<
typename... Args>
242 {
return push_back(Value(std::forward<Args>(args)...)); }
243 template<
typename... Args>
244 std::pair<iterator, bool>
emplace(Args&&... args)
247 {
return records_.erase(position); }
250 return std::find_if(
records_.begin(),
records_.end(), [&key](
const Value& value) { return value.*KeyMember == key; });
254 auto position =
find(key);
255 return {position, position ==
end() ? position : std::next(position)};
258 template<
typename Modifier>
263 for (
auto it =
begin(); it !=
end(); ++it)
265 if (it != position && (*it).*KeyMember == value.*KeyMember)
267 position =
erase(position);
301 template<
typename Modifier>
308 static_assert(
Index == 1);
314 static_assert(
Index == 1);
320 static_assert(
Index == 1);
326 requires std::equality_comparable<Value>
327 {
return lhs.records_ == rhs.records_; }
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
IDDataContainer()=default
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
bool empty() const
Definition IDDataContainer.h:290
iterator end() const
Definition IDDataContainer.h:286
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
Definition IDDataContainer.h:294
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
IDSequencedContainer()=default
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 IDDataContainer.h:307
Definition AhoCorasickAmbiguous.h:218
@ A
a-ion (N-terminal, loses CO)
constexpr bool is_tuple
Definition IDDataContainer.h:27
bool tupleLess(const A &a, const B &b)
Definition IDDataContainer.h:34
Definition AppliedProcessingStep.h:22
Definition IDDataContainer.h:74
void is_transparent
Definition IDDataContainer.h:75
bool operator()(const A &a, const B &b) const
Definition IDDataContainer.h:77