|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_CONTAINERS_FLAT_SET_H_ | 
|  | #define BASE_CONTAINERS_FLAT_SET_H_ | 
|  |  | 
|  | #include <functional> | 
|  |  | 
|  | #include "base/containers/flat_tree.h" | 
|  | #include "base/template_util.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // flat_set is a container with a std::set-like interface that stores its | 
|  | // contents in a sorted vector. | 
|  | // | 
|  | // Please see //base/containers/README.md for an overview of which container | 
|  | // to select. | 
|  | // | 
|  | // PROS | 
|  | // | 
|  | //  - Good memory locality. | 
|  | //  - Low overhead, especially for smaller sets. | 
|  | //  - Performance is good for more workloads than you might expect (see | 
|  | //    overview link above). | 
|  | //  - Supports C++14 set interface. | 
|  | // | 
|  | // CONS | 
|  | // | 
|  | //  - Inserts and removals are O(n). | 
|  | // | 
|  | // IMPORTANT NOTES | 
|  | // | 
|  | //  - Iterators are invalidated across mutations. | 
|  | //  - If possible, construct a flat_set in one operation by inserting into | 
|  | //    a std::vector and moving that vector into the flat_set constructor. | 
|  | //  - For multiple removals use base::EraseIf() which is O(n) rather than | 
|  | //    O(n * removed_items). | 
|  | // | 
|  | // QUICK REFERENCE | 
|  | // | 
|  | // Most of the core functionality is inherited from flat_tree. Please see | 
|  | // flat_tree.h for more details for most of these functions. As a quick | 
|  | // reference, the functions available are: | 
|  | // | 
|  | // Constructors (inputs need not be sorted): | 
|  | //   flat_set(InputIterator first, InputIterator last, | 
|  | //            FlatContainerDupes = KEEP_FIRST_OF_DUPES, | 
|  | //            const Compare& compare = Compare()); | 
|  | //   flat_set(const flat_set&); | 
|  | //   flat_set(flat_set&&); | 
|  | //   flat_set(std::vector<Key>, | 
|  | //            FlatContainerDupes = KEEP_FIRST_OF_DUPES, | 
|  | //            const Compare& compare = Compare());  // Re-use storage. | 
|  | //   flat_set(std::initializer_list<value_type> ilist, | 
|  | //            FlatContainerDupes = KEEP_FIRST_OF_DUPES, | 
|  | //            const Compare& comp = Compare()); | 
|  | // | 
|  | // Assignment functions: | 
|  | //   flat_set& operator=(const flat_set&); | 
|  | //   flat_set& operator=(flat_set&&); | 
|  | //   flat_set& operator=(initializer_list<Key>); | 
|  | // | 
|  | // Memory management functions: | 
|  | //   void   reserve(size_t); | 
|  | //   size_t capacity() const; | 
|  | //   void   shrink_to_fit(); | 
|  | // | 
|  | // Size management functions: | 
|  | //   void   clear(); | 
|  | //   size_t size() const; | 
|  | //   size_t max_size() const; | 
|  | //   bool   empty() const; | 
|  | // | 
|  | // Iterator functions: | 
|  | //   iterator               begin(); | 
|  | //   const_iterator         begin() const; | 
|  | //   const_iterator         cbegin() const; | 
|  | //   iterator               end(); | 
|  | //   const_iterator         end() const; | 
|  | //   const_iterator         cend() const; | 
|  | //   reverse_iterator       rbegin(); | 
|  | //   const reverse_iterator rbegin() const; | 
|  | //   const_reverse_iterator crbegin() const; | 
|  | //   reverse_iterator       rend(); | 
|  | //   const_reverse_iterator rend() const; | 
|  | //   const_reverse_iterator crend() const; | 
|  | // | 
|  | // Insert and accessor functions: | 
|  | //   pair<iterator, bool> insert(const key_type&); | 
|  | //   pair<iterator, bool> insert(key_type&&); | 
|  | //   void                 insert(InputIterator first, InputIterator last, | 
|  | //                               FlatContainerDupes = KEEP_FIRST_OF_DUPES); | 
|  | //   iterator             insert(const_iterator hint, const key_type&); | 
|  | //   iterator             insert(const_iterator hint, key_type&&); | 
|  | //   pair<iterator, bool> emplace(Args&&...); | 
|  | //   iterator             emplace_hint(const_iterator, Args&&...); | 
|  | // | 
|  | // Erase functions: | 
|  | //   iterator erase(iterator); | 
|  | //   iterator erase(const_iterator); | 
|  | //   iterator erase(const_iterator first, const_iterator& last); | 
|  | //   template <typename K> size_t erase(const K& key); | 
|  | // | 
|  | // Comparators (see std::set documentation). | 
|  | //   key_compare   key_comp() const; | 
|  | //   value_compare value_comp() const; | 
|  | // | 
|  | // Search functions: | 
|  | //   template <typename K> size_t                   count(const K&) const; | 
|  | //   template <typename K> iterator                 find(const K&); | 
|  | //   template <typename K> const_iterator           find(const K&) const; | 
|  | //   template <typename K> pair<iterator, iterator> equal_range(K&); | 
|  | //   template <typename K> iterator                 lower_bound(const K&); | 
|  | //   template <typename K> const_iterator           lower_bound(const K&) const; | 
|  | //   template <typename K> iterator                 upper_bound(const K&); | 
|  | //   template <typename K> const_iterator           upper_bound(const K&) const; | 
|  | // | 
|  | // General functions: | 
|  | //   void swap(flat_set&&); | 
|  | // | 
|  | // Non-member operators: | 
|  | //   bool operator==(const flat_set&, const flat_set); | 
|  | //   bool operator!=(const flat_set&, const flat_set); | 
|  | //   bool operator<(const flat_set&, const flat_set); | 
|  | //   bool operator>(const flat_set&, const flat_set); | 
|  | //   bool operator>=(const flat_set&, const flat_set); | 
|  | //   bool operator<=(const flat_set&, const flat_set); | 
|  | // | 
|  | template <class Key, class Compare = std::less<>> | 
|  | using flat_set = typename ::base::internal::flat_tree< | 
|  | Key, | 
|  | Key, | 
|  | ::base::internal::GetKeyFromValueIdentity<Key>, | 
|  | Compare>; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_CONTAINERS_FLAT_SET_H_ |