| Index: base/containers/flat_tree.h
|
| diff --git a/base/containers/flat_tree.h b/base/containers/flat_tree.h
|
| index c3a234fa784c4f0e0e151d9711d0265b756473fd..98b817cf02f941ffb32270a100123f805dbfa55a 100644
|
| --- a/base/containers/flat_tree.h
|
| +++ b/base/containers/flat_tree.h
|
| @@ -184,8 +184,7 @@ class flat_tree {
|
| // Insert operations.
|
| //
|
| // Assume that every operation invalidates iterators and references.
|
| - // Insertion of one element can take O(size). See the Notes section in the
|
| - // class comments on why we do not currently implement range insertion.
|
| + // Insertion of one element can take O(size).
|
| // Capacity of flat_tree grows in an implementation-defined manner.
|
| //
|
| // NOTE: Prefer to build a new flat_tree from a std::vector (or similar)
|
| @@ -197,6 +196,9 @@ class flat_tree {
|
| iterator insert(const_iterator position_hint, const value_type& x);
|
| iterator insert(const_iterator position_hint, value_type&& x);
|
|
|
| + template <class InputIterator>
|
| + void insert(InputIterator first, InputIterator last);
|
| +
|
| template <class... Args>
|
| std::pair<iterator, bool> emplace(Args&&... args);
|
|
|
| @@ -600,6 +602,30 @@ auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::insert(
|
| }
|
|
|
| template <class Key, class Value, class GetKeyFromValue, class KeyCompare>
|
| +template <class InputIterator>
|
| +void flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::insert(
|
| + InputIterator first,
|
| + InputIterator last) {
|
| + // Insert the values at the end.
|
| + auto size = impl_.body_.size();
|
| + impl_.body_.insert(end(), first, last);
|
| + auto mid = begin() + size;
|
| +
|
| + // Sort the newly inserted elements.
|
| + std::stable_sort(mid, end(), impl_.get_value_comp());
|
| +
|
| + // Merge the two sublists and unique them.
|
| + std::inplace_merge(begin(), mid, end(), impl_.get_value_comp());
|
| + auto comparator = [this](const value_type& lhs, const value_type& rhs) {
|
| + // lhs is already <= rhs due to sort, therefore
|
| + // !(lhs < rhs) <=> lhs == rhs.
|
| + return !impl_.get_value_comp()(lhs, rhs);
|
| + };
|
| + auto erase_after = std::unique(begin(), end(), comparator);
|
| + erase(erase_after, end());
|
| +}
|
| +
|
| +template <class Key, class Value, class GetKeyFromValue, class KeyCompare>
|
| template <class... Args>
|
| auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::emplace(Args&&... args)
|
| -> std::pair<iterator, bool> {
|
|
|