mirror of
https://github.com/BlackMATov/flat.hpp.git
synced 2025-12-16 14:09:01 +07:00
add try_emplace and insert_or_assign functions #27
This commit is contained in:
@@ -399,6 +399,28 @@ namespace flat_hpp
|
||||
: insert(value).first;
|
||||
}
|
||||
|
||||
template < typename TT >
|
||||
std::pair<iterator, bool> insert_or_assign(key_type&& key, TT&& value) {
|
||||
iterator iter = lower_bound(key);
|
||||
if ( iter == end() || this->operator()(key, *iter) ) {
|
||||
iter = emplace_hint(iter, std::move(key), std::forward<TT>(value));
|
||||
return {iter, true};
|
||||
}
|
||||
(*iter).second = std::forward<TT>(value);
|
||||
return {iter, false};
|
||||
}
|
||||
|
||||
template < typename TT >
|
||||
std::pair<iterator, bool> insert_or_assign(const key_type& key, TT&& value) {
|
||||
iterator iter = lower_bound(key);
|
||||
if ( iter == end() || this->operator()(key, *iter) ) {
|
||||
iter = emplace_hint(iter, key, std::forward<TT>(value));
|
||||
return {iter, true};
|
||||
}
|
||||
(*iter).second = std::forward<TT>(value);
|
||||
return {iter, false};
|
||||
}
|
||||
|
||||
template < typename InputIter >
|
||||
void insert(InputIter first, InputIter last) {
|
||||
insert_range_(first, last);
|
||||
@@ -427,6 +449,26 @@ namespace flat_hpp
|
||||
return insert(hint, value_type(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
template < typename... Args >
|
||||
std::pair<iterator, bool> try_emplace(key_type&& key, Args&&... args) {
|
||||
iterator iter = lower_bound(key);
|
||||
if ( iter == end() || this->operator()(key, *iter) ) {
|
||||
iter = emplace_hint(iter, std::move(key), std::forward<Args>(args)...);
|
||||
return {iter, true};
|
||||
}
|
||||
return {iter, false};
|
||||
}
|
||||
|
||||
template < typename... Args >
|
||||
std::pair<iterator, bool> try_emplace(const key_type& key, Args&&... args) {
|
||||
iterator iter = lower_bound(key);
|
||||
if ( iter == end() || this->operator()(key, *iter) ) {
|
||||
iter = emplace_hint(iter, key, std::forward<Args>(args)...);
|
||||
return {iter, true};
|
||||
}
|
||||
return {iter, false};
|
||||
}
|
||||
|
||||
void clear()
|
||||
noexcept(noexcept(std::declval<container_type&>().clear())) {
|
||||
data_.clear();
|
||||
|
||||
Reference in New Issue
Block a user