| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_CONTAINERS_FLAT_TREE_H_ | 5 #ifndef BASE_CONTAINERS_FLAT_TREE_H_ |
| 6 #define BASE_CONTAINERS_FLAT_TREE_H_ | 6 #define BASE_CONTAINERS_FLAT_TREE_H_ |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 const_reverse_iterator crbegin() const; | 177 const_reverse_iterator crbegin() const; |
| 178 | 178 |
| 179 reverse_iterator rend(); | 179 reverse_iterator rend(); |
| 180 const_reverse_iterator rend() const; | 180 const_reverse_iterator rend() const; |
| 181 const_reverse_iterator crend() const; | 181 const_reverse_iterator crend() const; |
| 182 | 182 |
| 183 // -------------------------------------------------------------------------- | 183 // -------------------------------------------------------------------------- |
| 184 // Insert operations. | 184 // Insert operations. |
| 185 // | 185 // |
| 186 // Assume that every operation invalidates iterators and references. | 186 // Assume that every operation invalidates iterators and references. |
| 187 // Insertion of one element can take O(size). See the Notes section in the | 187 // Insertion of one element can take O(size). |
| 188 // class comments on why we do not currently implement range insertion. | |
| 189 // Capacity of flat_tree grows in an implementation-defined manner. | 188 // Capacity of flat_tree grows in an implementation-defined manner. |
| 190 // | 189 // |
| 191 // NOTE: Prefer to build a new flat_tree from a std::vector (or similar) | 190 // NOTE: Prefer to build a new flat_tree from a std::vector (or similar) |
| 192 // instead of calling insert() repeatedly. | 191 // instead of calling insert() repeatedly. |
| 193 | 192 |
| 194 std::pair<iterator, bool> insert(const value_type& val); | 193 std::pair<iterator, bool> insert(const value_type& val); |
| 195 std::pair<iterator, bool> insert(value_type&& val); | 194 std::pair<iterator, bool> insert(value_type&& val); |
| 196 | 195 |
| 197 iterator insert(const_iterator position_hint, const value_type& x); | 196 iterator insert(const_iterator position_hint, const value_type& x); |
| 198 iterator insert(const_iterator position_hint, value_type&& x); | 197 iterator insert(const_iterator position_hint, value_type&& x); |
| 199 | 198 |
| 199 template <class InputIterator> |
| 200 void insert(InputIterator first, InputIterator last); |
| 201 |
| 200 template <class... Args> | 202 template <class... Args> |
| 201 std::pair<iterator, bool> emplace(Args&&... args); | 203 std::pair<iterator, bool> emplace(Args&&... args); |
| 202 | 204 |
| 203 template <class... Args> | 205 template <class... Args> |
| 204 iterator emplace_hint(const_iterator position_hint, Args&&... args); | 206 iterator emplace_hint(const_iterator position_hint, Args&&... args); |
| 205 | 207 |
| 206 // -------------------------------------------------------------------------- | 208 // -------------------------------------------------------------------------- |
| 207 // Erase operations. | 209 // Erase operations. |
| 208 // | 210 // |
| 209 // Assume that every operation invalidates iterators and references. | 211 // Assume that every operation invalidates iterators and references. |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 if (position_hint == end() || impl_.get_value_comp()(val, *position_hint)) { | 595 if (position_hint == end() || impl_.get_value_comp()(val, *position_hint)) { |
| 594 if (position_hint == begin() || | 596 if (position_hint == begin() || |
| 595 impl_.get_value_comp()(*(position_hint - 1), val)) | 597 impl_.get_value_comp()(*(position_hint - 1), val)) |
| 596 // We have to cast away const because of crbug.com/677044. | 598 // We have to cast away const because of crbug.com/677044. |
| 597 return impl_.body_.insert(const_cast_it(position_hint), std::move(val)); | 599 return impl_.body_.insert(const_cast_it(position_hint), std::move(val)); |
| 598 } | 600 } |
| 599 return insert(std::move(val)).first; | 601 return insert(std::move(val)).first; |
| 600 } | 602 } |
| 601 | 603 |
| 602 template <class Key, class Value, class GetKeyFromValue, class KeyCompare> | 604 template <class Key, class Value, class GetKeyFromValue, class KeyCompare> |
| 605 template <class InputIterator> |
| 606 void flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::insert( |
| 607 InputIterator first, |
| 608 InputIterator last) { |
| 609 // Insert the values at the end. |
| 610 auto size = impl_.body_.size(); |
| 611 impl_.body_.insert(end(), first, last); |
| 612 auto mid = begin() + size; |
| 613 |
| 614 // Sort the newly inserted elements. |
| 615 std::stable_sort(mid, end(), impl_.get_value_comp()); |
| 616 |
| 617 // Merge the two sublists and unique them. |
| 618 std::inplace_merge(begin(), mid, end(), impl_.get_value_comp()); |
| 619 auto comparator = [this](const value_type& lhs, const value_type& rhs) { |
| 620 // lhs is already <= rhs due to sort, therefore |
| 621 // !(lhs < rhs) <=> lhs == rhs. |
| 622 return !impl_.get_value_comp()(lhs, rhs); |
| 623 }; |
| 624 auto erase_after = std::unique(begin(), end(), comparator); |
| 625 erase(erase_after, end()); |
| 626 } |
| 627 |
| 628 template <class Key, class Value, class GetKeyFromValue, class KeyCompare> |
| 603 template <class... Args> | 629 template <class... Args> |
| 604 auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::emplace(Args&&... args) | 630 auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::emplace(Args&&... args) |
| 605 -> std::pair<iterator, bool> { | 631 -> std::pair<iterator, bool> { |
| 606 return insert(value_type(std::forward<Args>(args)...)); | 632 return insert(value_type(std::forward<Args>(args)...)); |
| 607 } | 633 } |
| 608 | 634 |
| 609 template <class Key, class Value, class GetKeyFromValue, class KeyCompare> | 635 template <class Key, class Value, class GetKeyFromValue, class KeyCompare> |
| 610 template <class... Args> | 636 template <class... Args> |
| 611 auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::emplace_hint( | 637 auto flat_tree<Key, Value, GetKeyFromValue, KeyCompare>::emplace_hint( |
| 612 const_iterator position_hint, | 638 const_iterator position_hint, |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 void EraseIf(base::internal::flat_tree<Key, Value, GetKeyFromValue, KeyCompare>& | 791 void EraseIf(base::internal::flat_tree<Key, Value, GetKeyFromValue, KeyCompare>& |
| 766 container, | 792 container, |
| 767 Predicate pred) { | 793 Predicate pred) { |
| 768 container.erase(std::remove_if(container.begin(), container.end(), pred), | 794 container.erase(std::remove_if(container.begin(), container.end(), pred), |
| 769 container.end()); | 795 container.end()); |
| 770 } | 796 } |
| 771 | 797 |
| 772 } // namespace base | 798 } // namespace base |
| 773 | 799 |
| 774 #endif // BASE_CONTAINERS_FLAT_TREE_H_ | 800 #endif // BASE_CONTAINERS_FLAT_TREE_H_ |
| OLD | NEW |