1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_tree.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker // Following tests are ported and extended tests from libcpp for std::set.
8*6777b538SAndroid Build Coastguard Worker // They can be found here:
9*6777b538SAndroid Build Coastguard Worker // https://github.com/llvm/llvm-project/tree/main/libcxx/test/std/containers/associative/set
10*6777b538SAndroid Build Coastguard Worker //
11*6777b538SAndroid Build Coastguard Worker // Not ported tests:
12*6777b538SAndroid Build Coastguard Worker // * No tests with PrivateConstructor and std::less<> changed to std::less<T>
13*6777b538SAndroid Build Coastguard Worker // These tests have to do with C++14 std::less<>
14*6777b538SAndroid Build Coastguard Worker // http://en.cppreference.com/w/cpp/utility/functional/less_void
15*6777b538SAndroid Build Coastguard Worker // and add support for templated versions of lookup functions.
16*6777b538SAndroid Build Coastguard Worker // Because we use same implementation, we figured that it's OK just to check
17*6777b538SAndroid Build Coastguard Worker // compilation and this is what we do in flat_set_unittest/flat_map_unittest.
18*6777b538SAndroid Build Coastguard Worker // * No tests for max_size()
19*6777b538SAndroid Build Coastguard Worker // Has to do with allocator support.
20*6777b538SAndroid Build Coastguard Worker // * No tests with DefaultOnly.
21*6777b538SAndroid Build Coastguard Worker // Standard containers allocate each element in the separate node on the heap
22*6777b538SAndroid Build Coastguard Worker // and then manipulate these nodes. Flat containers store their elements in
23*6777b538SAndroid Build Coastguard Worker // contiguous memory and move them around, type is required to be movable.
24*6777b538SAndroid Build Coastguard Worker // * No tests for N3644.
25*6777b538SAndroid Build Coastguard Worker // This proposal suggests that all default constructed iterators compare
26*6777b538SAndroid Build Coastguard Worker // equal. Currently we use std::vector iterators and they don't implement
27*6777b538SAndroid Build Coastguard Worker // this.
28*6777b538SAndroid Build Coastguard Worker // * No tests with min_allocator and no tests counting allocations.
29*6777b538SAndroid Build Coastguard Worker // Flat sets currently don't support allocators.
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker #include <deque>
32*6777b538SAndroid Build Coastguard Worker #include <forward_list>
33*6777b538SAndroid Build Coastguard Worker #include <functional>
34*6777b538SAndroid Build Coastguard Worker #include <iterator>
35*6777b538SAndroid Build Coastguard Worker #include <list>
36*6777b538SAndroid Build Coastguard Worker #include <string>
37*6777b538SAndroid Build Coastguard Worker #include <vector>
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
40*6777b538SAndroid Build Coastguard Worker #include "base/template_util.h"
41*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
42*6777b538SAndroid Build Coastguard Worker #include "base/test/move_only_int.h"
43*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
44*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker namespace base {
47*6777b538SAndroid Build Coastguard Worker namespace internal {
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker namespace {
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker template <class It>
52*6777b538SAndroid Build Coastguard Worker class InputIterator {
53*6777b538SAndroid Build Coastguard Worker public:
54*6777b538SAndroid Build Coastguard Worker using iterator_category = std::input_iterator_tag;
55*6777b538SAndroid Build Coastguard Worker using value_type = typename std::iterator_traits<It>::value_type;
56*6777b538SAndroid Build Coastguard Worker using difference_type = typename std::iterator_traits<It>::difference_type;
57*6777b538SAndroid Build Coastguard Worker using pointer = It;
58*6777b538SAndroid Build Coastguard Worker using reference = typename std::iterator_traits<It>::reference;
59*6777b538SAndroid Build Coastguard Worker
InputIterator()60*6777b538SAndroid Build Coastguard Worker InputIterator() : it_() {}
InputIterator(It it)61*6777b538SAndroid Build Coastguard Worker explicit InputIterator(It it) : it_(it) {}
62*6777b538SAndroid Build Coastguard Worker
operator *() const63*6777b538SAndroid Build Coastguard Worker reference operator*() const { return *it_; }
operator ->() const64*6777b538SAndroid Build Coastguard Worker pointer operator->() const { return it_; }
65*6777b538SAndroid Build Coastguard Worker
operator ++()66*6777b538SAndroid Build Coastguard Worker InputIterator& operator++() {
67*6777b538SAndroid Build Coastguard Worker ++it_;
68*6777b538SAndroid Build Coastguard Worker return *this;
69*6777b538SAndroid Build Coastguard Worker }
operator ++(int)70*6777b538SAndroid Build Coastguard Worker InputIterator operator++(int) {
71*6777b538SAndroid Build Coastguard Worker InputIterator tmp(*this);
72*6777b538SAndroid Build Coastguard Worker ++(*this);
73*6777b538SAndroid Build Coastguard Worker return tmp;
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
operator ==(const InputIterator & lhs,const InputIterator & rhs)76*6777b538SAndroid Build Coastguard Worker friend bool operator==(const InputIterator& lhs, const InputIterator& rhs) {
77*6777b538SAndroid Build Coastguard Worker return lhs.it_ == rhs.it_;
78*6777b538SAndroid Build Coastguard Worker }
operator !=(const InputIterator & lhs,const InputIterator & rhs)79*6777b538SAndroid Build Coastguard Worker friend bool operator!=(const InputIterator& lhs, const InputIterator& rhs) {
80*6777b538SAndroid Build Coastguard Worker return !(lhs == rhs);
81*6777b538SAndroid Build Coastguard Worker }
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker private:
84*6777b538SAndroid Build Coastguard Worker It it_;
85*6777b538SAndroid Build Coastguard Worker };
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker template <typename It>
MakeInputIterator(It it)88*6777b538SAndroid Build Coastguard Worker InputIterator<It> MakeInputIterator(It it) {
89*6777b538SAndroid Build Coastguard Worker return InputIterator<It>(it);
90*6777b538SAndroid Build Coastguard Worker }
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker class Emplaceable {
93*6777b538SAndroid Build Coastguard Worker public:
Emplaceable()94*6777b538SAndroid Build Coastguard Worker Emplaceable() : Emplaceable(0, 0.0) {}
Emplaceable(int i,double d)95*6777b538SAndroid Build Coastguard Worker Emplaceable(int i, double d) : int_(i), double_(d) {}
Emplaceable(Emplaceable && other)96*6777b538SAndroid Build Coastguard Worker Emplaceable(Emplaceable&& other) : int_(other.int_), double_(other.double_) {
97*6777b538SAndroid Build Coastguard Worker other.int_ = 0;
98*6777b538SAndroid Build Coastguard Worker other.double_ = 0.0;
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker Emplaceable(const Emplaceable&) = delete;
101*6777b538SAndroid Build Coastguard Worker Emplaceable& operator=(const Emplaceable&) = delete;
102*6777b538SAndroid Build Coastguard Worker
operator =(Emplaceable && other)103*6777b538SAndroid Build Coastguard Worker Emplaceable& operator=(Emplaceable&& other) {
104*6777b538SAndroid Build Coastguard Worker int_ = other.int_;
105*6777b538SAndroid Build Coastguard Worker other.int_ = 0;
106*6777b538SAndroid Build Coastguard Worker double_ = other.double_;
107*6777b538SAndroid Build Coastguard Worker other.double_ = 0.0;
108*6777b538SAndroid Build Coastguard Worker return *this;
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker
operator ==(const Emplaceable & lhs,const Emplaceable & rhs)111*6777b538SAndroid Build Coastguard Worker friend bool operator==(const Emplaceable& lhs, const Emplaceable& rhs) {
112*6777b538SAndroid Build Coastguard Worker return std::tie(lhs.int_, lhs.double_) == std::tie(rhs.int_, rhs.double_);
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker
operator <(const Emplaceable & lhs,const Emplaceable & rhs)115*6777b538SAndroid Build Coastguard Worker friend bool operator<(const Emplaceable& lhs, const Emplaceable& rhs) {
116*6777b538SAndroid Build Coastguard Worker return std::tie(lhs.int_, lhs.double_) < std::tie(rhs.int_, rhs.double_);
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker
119*6777b538SAndroid Build Coastguard Worker private:
120*6777b538SAndroid Build Coastguard Worker int int_;
121*6777b538SAndroid Build Coastguard Worker double double_;
122*6777b538SAndroid Build Coastguard Worker };
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker struct TemplateConstructor {
125*6777b538SAndroid Build Coastguard Worker template <typename T>
TemplateConstructorbase::internal::__anonabfb52190111::TemplateConstructor126*6777b538SAndroid Build Coastguard Worker TemplateConstructor(const T&) {}
127*6777b538SAndroid Build Coastguard Worker
operator <(const TemplateConstructor &,const TemplateConstructor &)128*6777b538SAndroid Build Coastguard Worker friend bool operator<(const TemplateConstructor&,
129*6777b538SAndroid Build Coastguard Worker const TemplateConstructor&) {
130*6777b538SAndroid Build Coastguard Worker return false;
131*6777b538SAndroid Build Coastguard Worker }
132*6777b538SAndroid Build Coastguard Worker };
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker class NonDefaultConstructibleCompare {
135*6777b538SAndroid Build Coastguard Worker public:
NonDefaultConstructibleCompare(int)136*6777b538SAndroid Build Coastguard Worker explicit NonDefaultConstructibleCompare(int) {}
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker template <typename T>
operator ()(const T & lhs,const T & rhs) const139*6777b538SAndroid Build Coastguard Worker bool operator()(const T& lhs, const T& rhs) const {
140*6777b538SAndroid Build Coastguard Worker return std::less<T>()(lhs, rhs);
141*6777b538SAndroid Build Coastguard Worker }
142*6777b538SAndroid Build Coastguard Worker };
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker template <class PairType>
145*6777b538SAndroid Build Coastguard Worker struct LessByFirst {
operator ()base::internal::__anonabfb52190111::LessByFirst146*6777b538SAndroid Build Coastguard Worker bool operator()(const PairType& lhs, const PairType& rhs) const {
147*6777b538SAndroid Build Coastguard Worker return lhs.first < rhs.first;
148*6777b538SAndroid Build Coastguard Worker }
149*6777b538SAndroid Build Coastguard Worker };
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker // Common test trees.
152*6777b538SAndroid Build Coastguard Worker template <typename ContainerT>
153*6777b538SAndroid Build Coastguard Worker using TypedTree = flat_tree<typename ContainerT::value_type,
154*6777b538SAndroid Build Coastguard Worker std::identity,
155*6777b538SAndroid Build Coastguard Worker std::less<>,
156*6777b538SAndroid Build Coastguard Worker ContainerT>;
157*6777b538SAndroid Build Coastguard Worker using IntTree = TypedTree<std::vector<int>>;
158*6777b538SAndroid Build Coastguard Worker using IntPair = std::pair<int, int>;
159*6777b538SAndroid Build Coastguard Worker using IntPairTree = flat_tree<IntPair,
160*6777b538SAndroid Build Coastguard Worker std::identity,
161*6777b538SAndroid Build Coastguard Worker LessByFirst<IntPair>,
162*6777b538SAndroid Build Coastguard Worker std::vector<IntPair>>;
163*6777b538SAndroid Build Coastguard Worker using MoveOnlyTree = flat_tree<MoveOnlyInt,
164*6777b538SAndroid Build Coastguard Worker std::identity,
165*6777b538SAndroid Build Coastguard Worker std::less<>,
166*6777b538SAndroid Build Coastguard Worker std::vector<MoveOnlyInt>>;
167*6777b538SAndroid Build Coastguard Worker using EmplaceableTree = flat_tree<Emplaceable,
168*6777b538SAndroid Build Coastguard Worker std::identity,
169*6777b538SAndroid Build Coastguard Worker std::less<>,
170*6777b538SAndroid Build Coastguard Worker std::vector<Emplaceable>>;
171*6777b538SAndroid Build Coastguard Worker using ReversedTree =
172*6777b538SAndroid Build Coastguard Worker flat_tree<int, std::identity, std::greater<int>, std::vector<int>>;
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker using TreeWithStrangeCompare = flat_tree<int,
175*6777b538SAndroid Build Coastguard Worker std::identity,
176*6777b538SAndroid Build Coastguard Worker NonDefaultConstructibleCompare,
177*6777b538SAndroid Build Coastguard Worker std::vector<int>>;
178*6777b538SAndroid Build Coastguard Worker
179*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
180*6777b538SAndroid Build Coastguard Worker using ::testing::IsEmpty;
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker } // namespace
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker template <typename T>
185*6777b538SAndroid Build Coastguard Worker class FlatTreeTest : public testing::Test {};
186*6777b538SAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(FlatTreeTest);
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker // Tests that the compiler generated move operators propagrate noexcept
189*6777b538SAndroid Build Coastguard Worker // specifiers.
TEST(FlatTree,NoExcept)190*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, NoExcept) {
191*6777b538SAndroid Build Coastguard Worker struct MoveThrows {
192*6777b538SAndroid Build Coastguard Worker MoveThrows(MoveThrows&&) noexcept(false) {}
193*6777b538SAndroid Build Coastguard Worker MoveThrows& operator=(MoveThrows&&) noexcept(false) { return *this; }
194*6777b538SAndroid Build Coastguard Worker };
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker using MoveThrowsTree = flat_tree<MoveThrows, std::identity, std::less<>,
197*6777b538SAndroid Build Coastguard Worker std::array<MoveThrows, 1>>;
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker static_assert(std::is_nothrow_move_constructible_v<IntTree>,
200*6777b538SAndroid Build Coastguard Worker "Error: IntTree is not nothrow move constructible");
201*6777b538SAndroid Build Coastguard Worker static_assert(std::is_nothrow_move_assignable_v<IntTree>,
202*6777b538SAndroid Build Coastguard Worker "Error: IntTree is not nothrow move assignable");
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker static_assert(!std::is_nothrow_move_constructible_v<MoveThrowsTree>,
205*6777b538SAndroid Build Coastguard Worker "Error: MoveThrowsTree is nothrow move constructible");
206*6777b538SAndroid Build Coastguard Worker static_assert(!std::is_nothrow_move_assignable_v<MoveThrowsTree>,
207*6777b538SAndroid Build Coastguard Worker "Error: MoveThrowsTree is nothrow move assignable");
208*6777b538SAndroid Build Coastguard Worker }
209*6777b538SAndroid Build Coastguard Worker
210*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
211*6777b538SAndroid Build Coastguard Worker // Class.
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker // Check that flat_tree and its iterators can be instantiated with an
214*6777b538SAndroid Build Coastguard Worker // incomplete type.
215*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,IncompleteType)216*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, IncompleteType) {
217*6777b538SAndroid Build Coastguard Worker struct A {
218*6777b538SAndroid Build Coastguard Worker using Tree = flat_tree<A, std::identity, std::less<A>, std::vector<A>>;
219*6777b538SAndroid Build Coastguard Worker int data;
220*6777b538SAndroid Build Coastguard Worker Tree set_with_incomplete_type;
221*6777b538SAndroid Build Coastguard Worker Tree::iterator it;
222*6777b538SAndroid Build Coastguard Worker Tree::const_iterator cit;
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard Worker // We do not declare operator< because clang complains that it's unused.
225*6777b538SAndroid Build Coastguard Worker };
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard Worker A a;
228*6777b538SAndroid Build Coastguard Worker }
229*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,Stability)230*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, Stability) {
231*6777b538SAndroid Build Coastguard Worker using Pair = std::pair<int, int>;
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker using Tree =
234*6777b538SAndroid Build Coastguard Worker flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker // Constructors are stable.
237*6777b538SAndroid Build Coastguard Worker Tree cont({{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}});
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker auto AllOfSecondsAreZero = [&cont] {
240*6777b538SAndroid Build Coastguard Worker return ranges::all_of(cont,
241*6777b538SAndroid Build Coastguard Worker [](const Pair& elem) { return elem.second == 0; });
242*6777b538SAndroid Build Coastguard Worker };
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AllOfSecondsAreZero()) << "constructor should be stable";
245*6777b538SAndroid Build Coastguard Worker
246*6777b538SAndroid Build Coastguard Worker // Should not replace existing.
247*6777b538SAndroid Build Coastguard Worker cont.insert(Pair(0, 2));
248*6777b538SAndroid Build Coastguard Worker cont.insert(Pair(1, 2));
249*6777b538SAndroid Build Coastguard Worker cont.insert(Pair(2, 2));
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker cont.insert(Pair(3, 0));
254*6777b538SAndroid Build Coastguard Worker cont.insert(Pair(3, 2));
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
257*6777b538SAndroid Build Coastguard Worker }
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
260*6777b538SAndroid Build Coastguard Worker // Types.
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker // key_type
263*6777b538SAndroid Build Coastguard Worker // key_compare
264*6777b538SAndroid Build Coastguard Worker // value_type
265*6777b538SAndroid Build Coastguard Worker // value_compare
266*6777b538SAndroid Build Coastguard Worker // pointer
267*6777b538SAndroid Build Coastguard Worker // const_pointer
268*6777b538SAndroid Build Coastguard Worker // reference
269*6777b538SAndroid Build Coastguard Worker // const_reference
270*6777b538SAndroid Build Coastguard Worker // size_type
271*6777b538SAndroid Build Coastguard Worker // difference_type
272*6777b538SAndroid Build Coastguard Worker // iterator
273*6777b538SAndroid Build Coastguard Worker // const_iterator
274*6777b538SAndroid Build Coastguard Worker // reverse_iterator
275*6777b538SAndroid Build Coastguard Worker // const_reverse_iterator
276*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,Types)277*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, Types) {
278*6777b538SAndroid Build Coastguard Worker // These are guaranteed to be portable.
279*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<int, IntTree::key_type>), "");
280*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<int, IntTree::value_type>), "");
281*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<std::less<>, IntTree::key_compare>), "");
282*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<int&, IntTree::reference>), "");
283*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<const int&, IntTree::const_reference>), "");
284*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<int*, IntTree::pointer>), "");
285*6777b538SAndroid Build Coastguard Worker static_assert((std::is_same_v<const int*, IntTree::const_pointer>), "");
286*6777b538SAndroid Build Coastguard Worker }
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
289*6777b538SAndroid Build Coastguard Worker // Lifetime.
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Worker // flat_tree()
292*6777b538SAndroid Build Coastguard Worker // flat_tree(const Compare& comp)
293*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,DefaultConstructor)294*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, DefaultConstructor) {
295*6777b538SAndroid Build Coastguard Worker {
296*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
297*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre());
298*6777b538SAndroid Build Coastguard Worker }
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker {
301*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare cont(NonDefaultConstructibleCompare(0));
302*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre());
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker }
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Worker // flat_tree(const flat_tree& x)
307*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,CopyConstructor)308*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, CopyConstructor) {
309*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> original({1, 2, 3, 4});
310*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> copied(original);
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
315*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
316*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(original, copied);
317*6777b538SAndroid Build Coastguard Worker }
318*6777b538SAndroid Build Coastguard Worker
319*6777b538SAndroid Build Coastguard Worker // flat_tree(flat_tree&& x)
320*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,MoveConstructor)321*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, MoveConstructor) {
322*6777b538SAndroid Build Coastguard Worker int input_range[] = {1, 2, 3, 4};
323*6777b538SAndroid Build Coastguard Worker
324*6777b538SAndroid Build Coastguard Worker MoveOnlyTree original(std::begin(input_range), std::end(input_range));
325*6777b538SAndroid Build Coastguard Worker MoveOnlyTree moved(std::move(original));
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
328*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
329*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
330*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
331*6777b538SAndroid Build Coastguard Worker }
332*6777b538SAndroid Build Coastguard Worker
333*6777b538SAndroid Build Coastguard Worker // flat_tree(InputIterator first,
334*6777b538SAndroid Build Coastguard Worker // InputIterator last,
335*6777b538SAndroid Build Coastguard Worker // const Compare& comp = Compare())
336*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,RangeConstructor)337*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, RangeConstructor) {
338*6777b538SAndroid Build Coastguard Worker {
339*6777b538SAndroid Build Coastguard Worker IntPair input_vals[] = {{1, 1}, {1, 2}, {2, 1}, {2, 2}, {1, 3},
340*6777b538SAndroid Build Coastguard Worker {2, 3}, {3, 1}, {3, 2}, {3, 3}};
341*6777b538SAndroid Build Coastguard Worker
342*6777b538SAndroid Build Coastguard Worker IntPairTree first_of(MakeInputIterator(std::begin(input_vals)),
343*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::end(input_vals)));
344*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(first_of,
345*6777b538SAndroid Build Coastguard Worker ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1)));
346*6777b538SAndroid Build Coastguard Worker }
347*6777b538SAndroid Build Coastguard Worker {
348*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare::value_type input_vals[] = {1, 1, 1, 2, 2,
349*6777b538SAndroid Build Coastguard Worker 2, 3, 3, 3};
350*6777b538SAndroid Build Coastguard Worker
351*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare cont(MakeInputIterator(std::begin(input_vals)),
352*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::end(input_vals)),
353*6777b538SAndroid Build Coastguard Worker NonDefaultConstructibleCompare(0));
354*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3));
355*6777b538SAndroid Build Coastguard Worker }
356*6777b538SAndroid Build Coastguard Worker }
357*6777b538SAndroid Build Coastguard Worker
358*6777b538SAndroid Build Coastguard Worker // flat_tree(const container_type&)
359*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,ContainerCopyConstructor)360*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, ContainerCopyConstructor) {
361*6777b538SAndroid Build Coastguard Worker TypeParam items = {1, 2, 3, 4};
362*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> tree(items);
363*6777b538SAndroid Build Coastguard Worker
364*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(tree, ElementsAre(1, 2, 3, 4));
365*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(items, ElementsAre(1, 2, 3, 4));
366*6777b538SAndroid Build Coastguard Worker }
367*6777b538SAndroid Build Coastguard Worker
368*6777b538SAndroid Build Coastguard Worker // flat_tree(container_type&&)
369*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,ContainerMoveConstructor)370*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, ContainerMoveConstructor) {
371*6777b538SAndroid Build Coastguard Worker using Pair = std::pair<int, MoveOnlyInt>;
372*6777b538SAndroid Build Coastguard Worker
373*6777b538SAndroid Build Coastguard Worker // Construct an unsorted vector with a duplicate item in it. Sorted by the
374*6777b538SAndroid Build Coastguard Worker // first item, the second allows us to test for stability. Using a move
375*6777b538SAndroid Build Coastguard Worker // only type to ensure the vector is not copied.
376*6777b538SAndroid Build Coastguard Worker std::vector<Pair> storage;
377*6777b538SAndroid Build Coastguard Worker storage.push_back(Pair(2, MoveOnlyInt(0)));
378*6777b538SAndroid Build Coastguard Worker storage.push_back(Pair(1, MoveOnlyInt(0)));
379*6777b538SAndroid Build Coastguard Worker storage.push_back(Pair(2, MoveOnlyInt(1)));
380*6777b538SAndroid Build Coastguard Worker
381*6777b538SAndroid Build Coastguard Worker using Tree =
382*6777b538SAndroid Build Coastguard Worker flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
383*6777b538SAndroid Build Coastguard Worker Tree tree(std::move(storage));
384*6777b538SAndroid Build Coastguard Worker
385*6777b538SAndroid Build Coastguard Worker // The list should be two items long, with only the first "2" saved.
386*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, tree.size());
387*6777b538SAndroid Build Coastguard Worker const Pair& zeroth = *tree.begin();
388*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1, zeroth.first);
389*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, zeroth.second.data());
390*6777b538SAndroid Build Coastguard Worker
391*6777b538SAndroid Build Coastguard Worker const Pair& first = *(tree.begin() + 1);
392*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2, first.first);
393*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, first.second.data());
394*6777b538SAndroid Build Coastguard Worker }
395*6777b538SAndroid Build Coastguard Worker
396*6777b538SAndroid Build Coastguard Worker // flat_tree(std::initializer_list<value_type> ilist,
397*6777b538SAndroid Build Coastguard Worker // const Compare& comp = Compare())
398*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,InitializerListConstructor)399*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, InitializerListConstructor) {
400*6777b538SAndroid Build Coastguard Worker {
401*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 10, 8});
402*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
403*6777b538SAndroid Build Coastguard Worker }
404*6777b538SAndroid Build Coastguard Worker {
405*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 10, 8});
406*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
407*6777b538SAndroid Build Coastguard Worker }
408*6777b538SAndroid Build Coastguard Worker {
409*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare cont({1, 2, 3, 4, 5, 6, 10, 8},
410*6777b538SAndroid Build Coastguard Worker NonDefaultConstructibleCompare(0));
411*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
412*6777b538SAndroid Build Coastguard Worker }
413*6777b538SAndroid Build Coastguard Worker {
414*6777b538SAndroid Build Coastguard Worker IntPairTree first_of({{1, 1}, {2, 1}, {1, 2}});
415*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(first_of, ElementsAre(IntPair(1, 1), IntPair(2, 1)));
416*6777b538SAndroid Build Coastguard Worker }
417*6777b538SAndroid Build Coastguard Worker }
418*6777b538SAndroid Build Coastguard Worker
419*6777b538SAndroid Build Coastguard Worker // flat_tree(sorted_unique_t,
420*6777b538SAndroid Build Coastguard Worker // InputIterator first,
421*6777b538SAndroid Build Coastguard Worker // InputIterator last,
422*6777b538SAndroid Build Coastguard Worker // const Compare& comp = Compare())
423*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,SortedUniqueRangeConstructor)424*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, SortedUniqueRangeConstructor) {
425*6777b538SAndroid Build Coastguard Worker {
426*6777b538SAndroid Build Coastguard Worker IntPair input_vals[] = {{1, 1}, {2, 1}, {3, 1}};
427*6777b538SAndroid Build Coastguard Worker
428*6777b538SAndroid Build Coastguard Worker IntPairTree first_of(sorted_unique,
429*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::begin(input_vals)),
430*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::end(input_vals)));
431*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(first_of,
432*6777b538SAndroid Build Coastguard Worker ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1)));
433*6777b538SAndroid Build Coastguard Worker }
434*6777b538SAndroid Build Coastguard Worker {
435*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare::value_type input_vals[] = {1, 2, 3};
436*6777b538SAndroid Build Coastguard Worker
437*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare cont(sorted_unique,
438*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::begin(input_vals)),
439*6777b538SAndroid Build Coastguard Worker MakeInputIterator(std::end(input_vals)),
440*6777b538SAndroid Build Coastguard Worker NonDefaultConstructibleCompare(0));
441*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3));
442*6777b538SAndroid Build Coastguard Worker }
443*6777b538SAndroid Build Coastguard Worker }
444*6777b538SAndroid Build Coastguard Worker
445*6777b538SAndroid Build Coastguard Worker // flat_tree(sorted_unique_t, const container_type&)
446*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,SortedUniqueContainerCopyConstructor)447*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueContainerCopyConstructor) {
448*6777b538SAndroid Build Coastguard Worker TypeParam items = {1, 2, 3, 4};
449*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> tree(sorted_unique, items);
450*6777b538SAndroid Build Coastguard Worker
451*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(tree, ElementsAre(1, 2, 3, 4));
452*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(items, ElementsAre(1, 2, 3, 4));
453*6777b538SAndroid Build Coastguard Worker }
454*6777b538SAndroid Build Coastguard Worker
455*6777b538SAndroid Build Coastguard Worker // flat_tree(sorted_unique_t, std::vector<value_type>&&)
456*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,SortedUniqueVectorMoveConstructor)457*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, SortedUniqueVectorMoveConstructor) {
458*6777b538SAndroid Build Coastguard Worker using Pair = std::pair<int, MoveOnlyInt>;
459*6777b538SAndroid Build Coastguard Worker
460*6777b538SAndroid Build Coastguard Worker std::vector<Pair> storage;
461*6777b538SAndroid Build Coastguard Worker storage.push_back(Pair(1, MoveOnlyInt(0)));
462*6777b538SAndroid Build Coastguard Worker storage.push_back(Pair(2, MoveOnlyInt(0)));
463*6777b538SAndroid Build Coastguard Worker
464*6777b538SAndroid Build Coastguard Worker using Tree =
465*6777b538SAndroid Build Coastguard Worker flat_tree<Pair, std::identity, LessByFirst<Pair>, std::vector<Pair>>;
466*6777b538SAndroid Build Coastguard Worker Tree tree(sorted_unique, std::move(storage));
467*6777b538SAndroid Build Coastguard Worker
468*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, tree.size());
469*6777b538SAndroid Build Coastguard Worker const Pair& zeroth = *tree.begin();
470*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1, zeroth.first);
471*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, zeroth.second.data());
472*6777b538SAndroid Build Coastguard Worker
473*6777b538SAndroid Build Coastguard Worker const Pair& first = *(tree.begin() + 1);
474*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2, first.first);
475*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, first.second.data());
476*6777b538SAndroid Build Coastguard Worker }
477*6777b538SAndroid Build Coastguard Worker
478*6777b538SAndroid Build Coastguard Worker // flat_tree(sorted_unique_t,
479*6777b538SAndroid Build Coastguard Worker // std::initializer_list<value_type> ilist,
480*6777b538SAndroid Build Coastguard Worker // const Compare& comp = Compare())
481*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,SortedUniqueInitializerListConstructor)482*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueInitializerListConstructor) {
483*6777b538SAndroid Build Coastguard Worker {
484*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont(sorted_unique, {1, 2, 3, 4, 5, 6, 8, 10});
485*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
486*6777b538SAndroid Build Coastguard Worker }
487*6777b538SAndroid Build Coastguard Worker {
488*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont(sorted_unique, {1, 2, 3, 4, 5, 6, 8, 10});
489*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
490*6777b538SAndroid Build Coastguard Worker }
491*6777b538SAndroid Build Coastguard Worker {
492*6777b538SAndroid Build Coastguard Worker TreeWithStrangeCompare cont(sorted_unique, {1, 2, 3, 4, 5, 6, 8, 10},
493*6777b538SAndroid Build Coastguard Worker NonDefaultConstructibleCompare(0));
494*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
495*6777b538SAndroid Build Coastguard Worker }
496*6777b538SAndroid Build Coastguard Worker {
497*6777b538SAndroid Build Coastguard Worker IntPairTree first_of(sorted_unique, {{1, 1}, {2, 1}});
498*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(first_of, ElementsAre(IntPair(1, 1), IntPair(2, 1)));
499*6777b538SAndroid Build Coastguard Worker }
500*6777b538SAndroid Build Coastguard Worker }
501*6777b538SAndroid Build Coastguard Worker
502*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
503*6777b538SAndroid Build Coastguard Worker // Assignments.
504*6777b538SAndroid Build Coastguard Worker
505*6777b538SAndroid Build Coastguard Worker // flat_tree& operator=(const flat_tree&)
506*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,CopyAssignable)507*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, CopyAssignable) {
508*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> original({1, 2, 3, 4});
509*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> copied;
510*6777b538SAndroid Build Coastguard Worker copied = original;
511*6777b538SAndroid Build Coastguard Worker
512*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
513*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
514*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(original, copied);
515*6777b538SAndroid Build Coastguard Worker }
516*6777b538SAndroid Build Coastguard Worker
517*6777b538SAndroid Build Coastguard Worker // flat_tree& operator=(flat_tree&&)
518*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,MoveAssignable)519*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, MoveAssignable) {
520*6777b538SAndroid Build Coastguard Worker int input_range[] = {1, 2, 3, 4};
521*6777b538SAndroid Build Coastguard Worker
522*6777b538SAndroid Build Coastguard Worker MoveOnlyTree original(std::begin(input_range), std::end(input_range));
523*6777b538SAndroid Build Coastguard Worker MoveOnlyTree moved;
524*6777b538SAndroid Build Coastguard Worker moved = std::move(original);
525*6777b538SAndroid Build Coastguard Worker
526*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
527*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
528*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
529*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
530*6777b538SAndroid Build Coastguard Worker }
531*6777b538SAndroid Build Coastguard Worker
532*6777b538SAndroid Build Coastguard Worker // flat_tree& operator=(std::initializer_list<value_type> ilist)
533*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,InitializerListAssignable)534*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, InitializerListAssignable) {
535*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({0});
536*6777b538SAndroid Build Coastguard Worker cont = {1, 2, 3, 4, 5, 6, 10, 8};
537*6777b538SAndroid Build Coastguard Worker
538*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cont.count(0));
539*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
540*6777b538SAndroid Build Coastguard Worker }
541*6777b538SAndroid Build Coastguard Worker
542*6777b538SAndroid Build Coastguard Worker // --------------------------------------------------------------------------
543*6777b538SAndroid Build Coastguard Worker // Memory management.
544*6777b538SAndroid Build Coastguard Worker
545*6777b538SAndroid Build Coastguard Worker // void reserve(size_type new_capacity)
546*6777b538SAndroid Build Coastguard Worker
TEST(FlatTreeTest,Reserve)547*6777b538SAndroid Build Coastguard Worker TEST(FlatTreeTest, Reserve) {
548*6777b538SAndroid Build Coastguard Worker IntTree cont({1, 2, 3});
549*6777b538SAndroid Build Coastguard Worker
550*6777b538SAndroid Build Coastguard Worker cont.reserve(5);
551*6777b538SAndroid Build Coastguard Worker EXPECT_LE(5U, cont.capacity());
552*6777b538SAndroid Build Coastguard Worker }
553*6777b538SAndroid Build Coastguard Worker
554*6777b538SAndroid Build Coastguard Worker // size_type capacity() const
555*6777b538SAndroid Build Coastguard Worker
TEST(FlatTreeTest,Capacity)556*6777b538SAndroid Build Coastguard Worker TEST(FlatTreeTest, Capacity) {
557*6777b538SAndroid Build Coastguard Worker IntTree cont({1, 2, 3});
558*6777b538SAndroid Build Coastguard Worker
559*6777b538SAndroid Build Coastguard Worker EXPECT_LE(cont.size(), cont.capacity());
560*6777b538SAndroid Build Coastguard Worker cont.reserve(5);
561*6777b538SAndroid Build Coastguard Worker EXPECT_LE(cont.size(), cont.capacity());
562*6777b538SAndroid Build Coastguard Worker }
563*6777b538SAndroid Build Coastguard Worker
564*6777b538SAndroid Build Coastguard Worker // void shrink_to_fit()
565*6777b538SAndroid Build Coastguard Worker
TEST(FlatTreeTest,ShrinkToFit)566*6777b538SAndroid Build Coastguard Worker TEST(FlatTreeTest, ShrinkToFit) {
567*6777b538SAndroid Build Coastguard Worker IntTree cont({1, 2, 3});
568*6777b538SAndroid Build Coastguard Worker
569*6777b538SAndroid Build Coastguard Worker IntTree::size_type capacity_before = cont.capacity();
570*6777b538SAndroid Build Coastguard Worker cont.shrink_to_fit();
571*6777b538SAndroid Build Coastguard Worker EXPECT_GE(capacity_before, cont.capacity());
572*6777b538SAndroid Build Coastguard Worker }
573*6777b538SAndroid Build Coastguard Worker
574*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
575*6777b538SAndroid Build Coastguard Worker // Size management.
576*6777b538SAndroid Build Coastguard Worker
577*6777b538SAndroid Build Coastguard Worker // void clear()
578*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Clear)579*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Clear) {
580*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 7, 8});
581*6777b538SAndroid Build Coastguard Worker cont.clear();
582*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre());
583*6777b538SAndroid Build Coastguard Worker }
584*6777b538SAndroid Build Coastguard Worker
585*6777b538SAndroid Build Coastguard Worker // size_type size() const
586*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Size)587*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Size) {
588*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
589*6777b538SAndroid Build Coastguard Worker
590*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cont.size());
591*6777b538SAndroid Build Coastguard Worker cont.insert(2);
592*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
593*6777b538SAndroid Build Coastguard Worker cont.insert(1);
594*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
595*6777b538SAndroid Build Coastguard Worker cont.insert(3);
596*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
597*6777b538SAndroid Build Coastguard Worker cont.erase(cont.begin());
598*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
599*6777b538SAndroid Build Coastguard Worker cont.erase(cont.begin());
600*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
601*6777b538SAndroid Build Coastguard Worker cont.erase(cont.begin());
602*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cont.size());
603*6777b538SAndroid Build Coastguard Worker }
604*6777b538SAndroid Build Coastguard Worker
605*6777b538SAndroid Build Coastguard Worker // bool empty() const
606*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Empty)607*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Empty) {
608*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
609*6777b538SAndroid Build Coastguard Worker
610*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.empty());
611*6777b538SAndroid Build Coastguard Worker cont.insert(1);
612*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cont.empty());
613*6777b538SAndroid Build Coastguard Worker cont.clear();
614*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.empty());
615*6777b538SAndroid Build Coastguard Worker }
616*6777b538SAndroid Build Coastguard Worker
617*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
618*6777b538SAndroid Build Coastguard Worker // Iterators.
619*6777b538SAndroid Build Coastguard Worker
620*6777b538SAndroid Build Coastguard Worker // iterator begin()
621*6777b538SAndroid Build Coastguard Worker // const_iterator begin() const
622*6777b538SAndroid Build Coastguard Worker // iterator end()
623*6777b538SAndroid Build Coastguard Worker // const_iterator end() const
624*6777b538SAndroid Build Coastguard Worker //
625*6777b538SAndroid Build Coastguard Worker // reverse_iterator rbegin()
626*6777b538SAndroid Build Coastguard Worker // const_reverse_iterator rbegin() const
627*6777b538SAndroid Build Coastguard Worker // reverse_iterator rend()
628*6777b538SAndroid Build Coastguard Worker // const_reverse_iterator rend() const
629*6777b538SAndroid Build Coastguard Worker //
630*6777b538SAndroid Build Coastguard Worker // const_iterator cbegin() const
631*6777b538SAndroid Build Coastguard Worker // const_iterator cend() const
632*6777b538SAndroid Build Coastguard Worker // const_reverse_iterator crbegin() const
633*6777b538SAndroid Build Coastguard Worker // const_reverse_iterator crend() const
634*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Iterators)635*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Iterators) {
636*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 7, 8});
637*6777b538SAndroid Build Coastguard Worker
638*6777b538SAndroid Build Coastguard Worker auto size =
639*6777b538SAndroid Build Coastguard Worker static_cast<typename TypedTree<TypeParam>::difference_type>(cont.size());
640*6777b538SAndroid Build Coastguard Worker
641*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size, std::distance(cont.begin(), cont.end()));
642*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size, std::distance(cont.cbegin(), cont.cend()));
643*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size, std::distance(cont.rbegin(), cont.rend()));
644*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size, std::distance(cont.crbegin(), cont.crend()));
645*6777b538SAndroid Build Coastguard Worker
646*6777b538SAndroid Build Coastguard Worker {
647*6777b538SAndroid Build Coastguard Worker auto it = cont.begin();
648*6777b538SAndroid Build Coastguard Worker auto c_it = cont.cbegin();
649*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(it, c_it);
650*6777b538SAndroid Build Coastguard Worker for (int j = 1; it != cont.end(); ++it, ++c_it, ++j) {
651*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(j, *it);
652*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(j, *c_it);
653*6777b538SAndroid Build Coastguard Worker }
654*6777b538SAndroid Build Coastguard Worker }
655*6777b538SAndroid Build Coastguard Worker {
656*6777b538SAndroid Build Coastguard Worker auto rit = cont.rbegin();
657*6777b538SAndroid Build Coastguard Worker auto c_rit = cont.crbegin();
658*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(rit, c_rit);
659*6777b538SAndroid Build Coastguard Worker for (int j = static_cast<int>(size); rit != cont.rend();
660*6777b538SAndroid Build Coastguard Worker ++rit, ++c_rit, --j) {
661*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(j, *rit);
662*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(j, *c_rit);
663*6777b538SAndroid Build Coastguard Worker }
664*6777b538SAndroid Build Coastguard Worker }
665*6777b538SAndroid Build Coastguard Worker }
666*6777b538SAndroid Build Coastguard Worker
667*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
668*6777b538SAndroid Build Coastguard Worker // Insert operations.
669*6777b538SAndroid Build Coastguard Worker
670*6777b538SAndroid Build Coastguard Worker // pair<iterator, bool> insert(const value_type& val)
671*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,InsertLValue)672*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, InsertLValue) {
673*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
674*6777b538SAndroid Build Coastguard Worker
675*6777b538SAndroid Build Coastguard Worker int value = 2;
676*6777b538SAndroid Build Coastguard Worker std::pair<typename TypedTree<TypeParam>::iterator, bool> result =
677*6777b538SAndroid Build Coastguard Worker cont.insert(value);
678*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
679*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
680*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
681*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, *result.first);
682*6777b538SAndroid Build Coastguard Worker
683*6777b538SAndroid Build Coastguard Worker value = 1;
684*6777b538SAndroid Build Coastguard Worker result = cont.insert(value);
685*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
686*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
687*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
688*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, *result.first);
689*6777b538SAndroid Build Coastguard Worker
690*6777b538SAndroid Build Coastguard Worker value = 3;
691*6777b538SAndroid Build Coastguard Worker result = cont.insert(value);
692*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
693*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result.first);
694*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
695*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, *result.first);
696*6777b538SAndroid Build Coastguard Worker
697*6777b538SAndroid Build Coastguard Worker value = 3;
698*6777b538SAndroid Build Coastguard Worker result = cont.insert(value);
699*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(result.second);
700*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result.first);
701*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
702*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, *result.first);
703*6777b538SAndroid Build Coastguard Worker }
704*6777b538SAndroid Build Coastguard Worker
705*6777b538SAndroid Build Coastguard Worker // pair<iterator, bool> insert(value_type&& val)
706*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,InsertRValue)707*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, InsertRValue) {
708*6777b538SAndroid Build Coastguard Worker MoveOnlyTree cont;
709*6777b538SAndroid Build Coastguard Worker
710*6777b538SAndroid Build Coastguard Worker std::pair<MoveOnlyTree::iterator, bool> result = cont.insert(MoveOnlyInt(2));
711*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
712*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
713*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
714*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, result.first->data());
715*6777b538SAndroid Build Coastguard Worker
716*6777b538SAndroid Build Coastguard Worker result = cont.insert(MoveOnlyInt(1));
717*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
718*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
719*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
720*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, result.first->data());
721*6777b538SAndroid Build Coastguard Worker
722*6777b538SAndroid Build Coastguard Worker result = cont.insert(MoveOnlyInt(3));
723*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
724*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result.first);
725*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
726*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, result.first->data());
727*6777b538SAndroid Build Coastguard Worker
728*6777b538SAndroid Build Coastguard Worker result = cont.insert(MoveOnlyInt(3));
729*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(result.second);
730*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result.first);
731*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
732*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, result.first->data());
733*6777b538SAndroid Build Coastguard Worker }
734*6777b538SAndroid Build Coastguard Worker
735*6777b538SAndroid Build Coastguard Worker // iterator insert(const_iterator position_hint, const value_type& val)
736*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,InsertPositionLValue)737*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, InsertPositionLValue) {
738*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
739*6777b538SAndroid Build Coastguard Worker
740*6777b538SAndroid Build Coastguard Worker auto result = cont.insert(cont.cend(), 2);
741*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
742*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
743*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, *result);
744*6777b538SAndroid Build Coastguard Worker
745*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), 1);
746*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
747*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
748*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, *result);
749*6777b538SAndroid Build Coastguard Worker
750*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), 3);
751*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result);
752*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
753*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, *result);
754*6777b538SAndroid Build Coastguard Worker
755*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), 3);
756*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result);
757*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
758*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, *result);
759*6777b538SAndroid Build Coastguard Worker }
760*6777b538SAndroid Build Coastguard Worker
761*6777b538SAndroid Build Coastguard Worker // iterator insert(const_iterator position_hint, value_type&& val)
762*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,InsertPositionRValue)763*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, InsertPositionRValue) {
764*6777b538SAndroid Build Coastguard Worker MoveOnlyTree cont;
765*6777b538SAndroid Build Coastguard Worker
766*6777b538SAndroid Build Coastguard Worker auto result = cont.insert(cont.cend(), MoveOnlyInt(2));
767*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
768*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
769*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, result->data());
770*6777b538SAndroid Build Coastguard Worker
771*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), MoveOnlyInt(1));
772*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
773*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
774*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, result->data());
775*6777b538SAndroid Build Coastguard Worker
776*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), MoveOnlyInt(3));
777*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result);
778*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
779*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, result->data());
780*6777b538SAndroid Build Coastguard Worker
781*6777b538SAndroid Build Coastguard Worker result = cont.insert(cont.cend(), MoveOnlyInt(3));
782*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::prev(cont.end()), result);
783*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3U, cont.size());
784*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, result->data());
785*6777b538SAndroid Build Coastguard Worker }
786*6777b538SAndroid Build Coastguard Worker
787*6777b538SAndroid Build Coastguard Worker // template <class InputIterator>
788*6777b538SAndroid Build Coastguard Worker // void insert(InputIterator first, InputIterator last);
789*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,InsertIterIter)790*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, InsertIterIter) {
791*6777b538SAndroid Build Coastguard Worker struct GetKeyFromIntIntPair {
792*6777b538SAndroid Build Coastguard Worker const int& operator()(const std::pair<int, int>& p) const {
793*6777b538SAndroid Build Coastguard Worker return p.first;
794*6777b538SAndroid Build Coastguard Worker }
795*6777b538SAndroid Build Coastguard Worker };
796*6777b538SAndroid Build Coastguard Worker
797*6777b538SAndroid Build Coastguard Worker using IntIntMap = flat_tree<int, GetKeyFromIntIntPair, std::less<int>,
798*6777b538SAndroid Build Coastguard Worker std::vector<IntPair>>;
799*6777b538SAndroid Build Coastguard Worker
800*6777b538SAndroid Build Coastguard Worker {
801*6777b538SAndroid Build Coastguard Worker IntIntMap cont;
802*6777b538SAndroid Build Coastguard Worker IntPair int_pairs[] = {{3, 1}, {1, 1}, {4, 1}, {2, 1}};
803*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
804*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
805*6777b538SAndroid Build Coastguard Worker IntPair(4, 1)));
806*6777b538SAndroid Build Coastguard Worker }
807*6777b538SAndroid Build Coastguard Worker
808*6777b538SAndroid Build Coastguard Worker {
809*6777b538SAndroid Build Coastguard Worker IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
810*6777b538SAndroid Build Coastguard Worker std::vector<IntPair> int_pairs;
811*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
812*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
813*6777b538SAndroid Build Coastguard Worker IntPair(4, 1)));
814*6777b538SAndroid Build Coastguard Worker }
815*6777b538SAndroid Build Coastguard Worker
816*6777b538SAndroid Build Coastguard Worker {
817*6777b538SAndroid Build Coastguard Worker IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
818*6777b538SAndroid Build Coastguard Worker IntPair int_pairs[] = {{1, 1}};
819*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
820*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
821*6777b538SAndroid Build Coastguard Worker IntPair(4, 1)));
822*6777b538SAndroid Build Coastguard Worker }
823*6777b538SAndroid Build Coastguard Worker
824*6777b538SAndroid Build Coastguard Worker {
825*6777b538SAndroid Build Coastguard Worker IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
826*6777b538SAndroid Build Coastguard Worker IntPair int_pairs[] = {{5, 1}};
827*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
828*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
829*6777b538SAndroid Build Coastguard Worker IntPair(4, 1), IntPair(5, 1)));
830*6777b538SAndroid Build Coastguard Worker }
831*6777b538SAndroid Build Coastguard Worker
832*6777b538SAndroid Build Coastguard Worker {
833*6777b538SAndroid Build Coastguard Worker IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
834*6777b538SAndroid Build Coastguard Worker IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}};
835*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
836*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
837*6777b538SAndroid Build Coastguard Worker IntPair(4, 1)));
838*6777b538SAndroid Build Coastguard Worker }
839*6777b538SAndroid Build Coastguard Worker
840*6777b538SAndroid Build Coastguard Worker {
841*6777b538SAndroid Build Coastguard Worker IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
842*6777b538SAndroid Build Coastguard Worker IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}, {7, 2}, {6, 2},
843*6777b538SAndroid Build Coastguard Worker {8, 2}, {5, 2}, {5, 3}, {6, 3}, {7, 3}, {8, 3}};
844*6777b538SAndroid Build Coastguard Worker cont.insert(std::begin(int_pairs), std::end(int_pairs));
845*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
846*6777b538SAndroid Build Coastguard Worker IntPair(4, 1), IntPair(5, 2), IntPair(6, 2),
847*6777b538SAndroid Build Coastguard Worker IntPair(7, 2), IntPair(8, 2)));
848*6777b538SAndroid Build Coastguard Worker }
849*6777b538SAndroid Build Coastguard Worker }
850*6777b538SAndroid Build Coastguard Worker
851*6777b538SAndroid Build Coastguard Worker // template <class... Args>
852*6777b538SAndroid Build Coastguard Worker // pair<iterator, bool> emplace(Args&&... args)
853*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Emplace)854*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Emplace) {
855*6777b538SAndroid Build Coastguard Worker {
856*6777b538SAndroid Build Coastguard Worker EmplaceableTree cont;
857*6777b538SAndroid Build Coastguard Worker
858*6777b538SAndroid Build Coastguard Worker std::pair<EmplaceableTree::iterator, bool> result = cont.emplace();
859*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
860*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
861*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
862*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(), *cont.begin());
863*6777b538SAndroid Build Coastguard Worker
864*6777b538SAndroid Build Coastguard Worker result = cont.emplace(2, 3.5);
865*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
866*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), result.first);
867*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
868*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(2, 3.5), *result.first);
869*6777b538SAndroid Build Coastguard Worker
870*6777b538SAndroid Build Coastguard Worker result = cont.emplace(2, 3.5);
871*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(result.second);
872*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), result.first);
873*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
874*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(2, 3.5), *result.first);
875*6777b538SAndroid Build Coastguard Worker }
876*6777b538SAndroid Build Coastguard Worker {
877*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
878*6777b538SAndroid Build Coastguard Worker
879*6777b538SAndroid Build Coastguard Worker std::pair<typename TypedTree<TypeParam>::iterator, bool> result =
880*6777b538SAndroid Build Coastguard Worker cont.emplace(2);
881*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.second);
882*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result.first);
883*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
884*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, *result.first);
885*6777b538SAndroid Build Coastguard Worker }
886*6777b538SAndroid Build Coastguard Worker }
887*6777b538SAndroid Build Coastguard Worker
888*6777b538SAndroid Build Coastguard Worker // template <class... Args>
889*6777b538SAndroid Build Coastguard Worker // iterator emplace_hint(const_iterator position_hint, Args&&... args)
890*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EmplacePosition)891*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EmplacePosition) {
892*6777b538SAndroid Build Coastguard Worker {
893*6777b538SAndroid Build Coastguard Worker EmplaceableTree cont;
894*6777b538SAndroid Build Coastguard Worker
895*6777b538SAndroid Build Coastguard Worker auto result = cont.emplace_hint(cont.cend());
896*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
897*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
898*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(), *cont.begin());
899*6777b538SAndroid Build Coastguard Worker
900*6777b538SAndroid Build Coastguard Worker result = cont.emplace_hint(cont.cend(), 2, 3.5);
901*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), result);
902*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
903*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(2, 3.5), *result);
904*6777b538SAndroid Build Coastguard Worker
905*6777b538SAndroid Build Coastguard Worker result = cont.emplace_hint(cont.cbegin(), 2, 3.5);
906*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), result);
907*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2U, cont.size());
908*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(Emplaceable(2, 3.5), *result);
909*6777b538SAndroid Build Coastguard Worker }
910*6777b538SAndroid Build Coastguard Worker {
911*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
912*6777b538SAndroid Build Coastguard Worker
913*6777b538SAndroid Build Coastguard Worker auto result = cont.emplace_hint(cont.cend(), 2);
914*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), result);
915*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.size());
916*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, *result);
917*6777b538SAndroid Build Coastguard Worker }
918*6777b538SAndroid Build Coastguard Worker }
919*6777b538SAndroid Build Coastguard Worker
920*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
921*6777b538SAndroid Build Coastguard Worker // Underlying type operations.
922*6777b538SAndroid Build Coastguard Worker
923*6777b538SAndroid Build Coastguard Worker // underlying_type extract() &&
TYPED_TEST_P(FlatTreeTest,Extract)924*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Extract) {
925*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
926*6777b538SAndroid Build Coastguard Worker cont.emplace(3);
927*6777b538SAndroid Build Coastguard Worker cont.emplace(1);
928*6777b538SAndroid Build Coastguard Worker cont.emplace(2);
929*6777b538SAndroid Build Coastguard Worker cont.emplace(4);
930*6777b538SAndroid Build Coastguard Worker
931*6777b538SAndroid Build Coastguard Worker TypeParam body = std::move(cont).extract();
932*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, IsEmpty());
933*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(body, ElementsAre(1, 2, 3, 4));
934*6777b538SAndroid Build Coastguard Worker }
935*6777b538SAndroid Build Coastguard Worker
936*6777b538SAndroid Build Coastguard Worker // replace(underlying_type&&)
TYPED_TEST_P(FlatTreeTest,Replace)937*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Replace) {
938*6777b538SAndroid Build Coastguard Worker TypeParam body = {1, 2, 3, 4};
939*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont;
940*6777b538SAndroid Build Coastguard Worker cont.replace(std::move(body));
941*6777b538SAndroid Build Coastguard Worker
942*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4));
943*6777b538SAndroid Build Coastguard Worker }
944*6777b538SAndroid Build Coastguard Worker
945*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
946*6777b538SAndroid Build Coastguard Worker // Erase operations.
947*6777b538SAndroid Build Coastguard Worker
948*6777b538SAndroid Build Coastguard Worker // iterator erase(const_iterator position_hint)
949*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,ErasePosition)950*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, ErasePosition) {
951*6777b538SAndroid Build Coastguard Worker {
952*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 7, 8});
953*6777b538SAndroid Build Coastguard Worker
954*6777b538SAndroid Build Coastguard Worker auto it = cont.erase(std::next(cont.cbegin(), 3));
955*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), it);
956*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
957*6777b538SAndroid Build Coastguard Worker
958*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 0));
959*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), it);
960*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
961*6777b538SAndroid Build Coastguard Worker
962*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 5));
963*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.end(), it);
964*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7));
965*6777b538SAndroid Build Coastguard Worker
966*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 1));
967*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), it);
968*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5, 6, 7));
969*6777b538SAndroid Build Coastguard Worker
970*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 2));
971*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), it);
972*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5, 7));
973*6777b538SAndroid Build Coastguard Worker
974*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 2));
975*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), it);
976*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5));
977*6777b538SAndroid Build Coastguard Worker
978*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 0));
979*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), it);
980*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(5));
981*6777b538SAndroid Build Coastguard Worker
982*6777b538SAndroid Build Coastguard Worker it = cont.erase(cont.cbegin());
983*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), it);
984*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.end(), it);
985*6777b538SAndroid Build Coastguard Worker }
986*6777b538SAndroid Build Coastguard Worker // This is LWG #2059.
987*6777b538SAndroid Build Coastguard Worker // There is a potential ambiguity between erase with an iterator and erase
988*6777b538SAndroid Build Coastguard Worker // with a key, if key has a templated constructor.
989*6777b538SAndroid Build Coastguard Worker {
990*6777b538SAndroid Build Coastguard Worker using T = TemplateConstructor;
991*6777b538SAndroid Build Coastguard Worker
992*6777b538SAndroid Build Coastguard Worker flat_tree<T, std::identity, std::less<>, std::vector<T>> cont;
993*6777b538SAndroid Build Coastguard Worker T v(0);
994*6777b538SAndroid Build Coastguard Worker
995*6777b538SAndroid Build Coastguard Worker auto it = cont.find(v);
996*6777b538SAndroid Build Coastguard Worker if (it != cont.end())
997*6777b538SAndroid Build Coastguard Worker cont.erase(it);
998*6777b538SAndroid Build Coastguard Worker }
999*6777b538SAndroid Build Coastguard Worker }
1000*6777b538SAndroid Build Coastguard Worker
1001*6777b538SAndroid Build Coastguard Worker // iterator erase(const_iterator first, const_iterator last)
1002*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EraseRange)1003*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EraseRange) {
1004*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 7, 8});
1005*6777b538SAndroid Build Coastguard Worker
1006*6777b538SAndroid Build Coastguard Worker auto it =
1007*6777b538SAndroid Build Coastguard Worker cont.erase(std::next(cont.cbegin(), 5), std::next(cont.cbegin(), 5));
1008*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), it);
1009*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
1010*6777b538SAndroid Build Coastguard Worker
1011*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 3), std::next(cont.cbegin(), 4));
1012*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), it);
1013*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
1014*6777b538SAndroid Build Coastguard Worker
1015*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 2), std::next(cont.cbegin(), 5));
1016*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), it);
1017*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 7, 8));
1018*6777b538SAndroid Build Coastguard Worker
1019*6777b538SAndroid Build Coastguard Worker it = cont.erase(std::next(cont.cbegin(), 0), std::next(cont.cbegin(), 2));
1020*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), it);
1021*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(7, 8));
1022*6777b538SAndroid Build Coastguard Worker
1023*6777b538SAndroid Build Coastguard Worker it = cont.erase(cont.cbegin(), cont.cend());
1024*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), it);
1025*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.end(), it);
1026*6777b538SAndroid Build Coastguard Worker }
1027*6777b538SAndroid Build Coastguard Worker
1028*6777b538SAndroid Build Coastguard Worker // size_type erase(const key_type& key)
1029*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EraseKey)1030*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EraseKey) {
1031*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({1, 2, 3, 4, 5, 6, 7, 8});
1032*6777b538SAndroid Build Coastguard Worker
1033*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cont.erase(9));
1034*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
1035*6777b538SAndroid Build Coastguard Worker
1036*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(4));
1037*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
1038*6777b538SAndroid Build Coastguard Worker
1039*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(1));
1040*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
1041*6777b538SAndroid Build Coastguard Worker
1042*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(8));
1043*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7));
1044*6777b538SAndroid Build Coastguard Worker
1045*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(3));
1046*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5, 6, 7));
1047*6777b538SAndroid Build Coastguard Worker
1048*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(6));
1049*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5, 7));
1050*6777b538SAndroid Build Coastguard Worker
1051*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(7));
1052*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(2, 5));
1053*6777b538SAndroid Build Coastguard Worker
1054*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(2));
1055*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre(5));
1056*6777b538SAndroid Build Coastguard Worker
1057*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.erase(5));
1058*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(cont, ElementsAre());
1059*6777b538SAndroid Build Coastguard Worker }
1060*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EraseEndDeath)1061*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EraseEndDeath) {
1062*6777b538SAndroid Build Coastguard Worker {
1063*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> tree;
1064*6777b538SAndroid Build Coastguard Worker ASSERT_DEATH_IF_SUPPORTED(tree.erase(tree.cend()), "");
1065*6777b538SAndroid Build Coastguard Worker }
1066*6777b538SAndroid Build Coastguard Worker
1067*6777b538SAndroid Build Coastguard Worker {
1068*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> tree = {1, 2, 3, 4};
1069*6777b538SAndroid Build Coastguard Worker ASSERT_DEATH_IF_SUPPORTED(tree.erase(tree.find(5)), "");
1070*6777b538SAndroid Build Coastguard Worker }
1071*6777b538SAndroid Build Coastguard Worker }
1072*6777b538SAndroid Build Coastguard Worker
1073*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
1074*6777b538SAndroid Build Coastguard Worker // Comparators.
1075*6777b538SAndroid Build Coastguard Worker
1076*6777b538SAndroid Build Coastguard Worker // key_compare key_comp() const
1077*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,KeyComp)1078*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, KeyComp) {
1079*6777b538SAndroid Build Coastguard Worker ReversedTree cont({1, 2, 3, 4, 5});
1080*6777b538SAndroid Build Coastguard Worker
1081*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ranges::is_sorted(cont, cont.key_comp()));
1082*6777b538SAndroid Build Coastguard Worker int new_elements[] = {6, 7, 8, 9, 10};
1083*6777b538SAndroid Build Coastguard Worker ranges::copy(new_elements, std::inserter(cont, cont.end()));
1084*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ranges::is_sorted(cont, cont.key_comp()));
1085*6777b538SAndroid Build Coastguard Worker }
1086*6777b538SAndroid Build Coastguard Worker
1087*6777b538SAndroid Build Coastguard Worker // value_compare value_comp() const
1088*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,ValueComp)1089*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, ValueComp) {
1090*6777b538SAndroid Build Coastguard Worker ReversedTree cont({1, 2, 3, 4, 5});
1091*6777b538SAndroid Build Coastguard Worker
1092*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ranges::is_sorted(cont, cont.value_comp()));
1093*6777b538SAndroid Build Coastguard Worker int new_elements[] = {6, 7, 8, 9, 10};
1094*6777b538SAndroid Build Coastguard Worker ranges::copy(new_elements, std::inserter(cont, cont.end()));
1095*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ranges::is_sorted(cont, cont.value_comp()));
1096*6777b538SAndroid Build Coastguard Worker }
1097*6777b538SAndroid Build Coastguard Worker
1098*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
1099*6777b538SAndroid Build Coastguard Worker // Search operations.
1100*6777b538SAndroid Build Coastguard Worker
1101*6777b538SAndroid Build Coastguard Worker // size_type count(const key_type& key) const
1102*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Count)1103*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Count) {
1104*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 6, 7, 8, 9, 10, 11, 12});
1105*6777b538SAndroid Build Coastguard Worker
1106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(5));
1107*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(6));
1108*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(7));
1109*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(8));
1110*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(9));
1111*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(10));
1112*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(11));
1113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1U, cont.count(12));
1114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0U, cont.count(4));
1115*6777b538SAndroid Build Coastguard Worker }
1116*6777b538SAndroid Build Coastguard Worker
1117*6777b538SAndroid Build Coastguard Worker // iterator find(const key_type& key)
1118*6777b538SAndroid Build Coastguard Worker // const_iterator find(const key_type& key) const
1119*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Find)1120*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Find) {
1121*6777b538SAndroid Build Coastguard Worker {
1122*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({5, 6, 7, 8, 9, 10, 11, 12});
1123*6777b538SAndroid Build Coastguard Worker
1124*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), cont.find(5));
1125*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), cont.find(6));
1126*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
1127*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
1128*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
1129*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
1130*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
1131*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
1132*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
1133*6777b538SAndroid Build Coastguard Worker }
1134*6777b538SAndroid Build Coastguard Worker {
1135*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 6, 7, 8, 9, 10, 11, 12});
1136*6777b538SAndroid Build Coastguard Worker
1137*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), cont.find(5));
1138*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), cont.find(6));
1139*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
1140*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
1141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
1142*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
1143*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
1144*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
1145*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
1146*6777b538SAndroid Build Coastguard Worker }
1147*6777b538SAndroid Build Coastguard Worker }
1148*6777b538SAndroid Build Coastguard Worker
1149*6777b538SAndroid Build Coastguard Worker // bool contains(const key_type& key) const
1150*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Contains)1151*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Contains) {
1152*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 6, 7, 8, 9, 10, 11, 12});
1153*6777b538SAndroid Build Coastguard Worker
1154*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(5));
1155*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(6));
1156*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(7));
1157*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(8));
1158*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(9));
1159*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(10));
1160*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(11));
1161*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(cont.contains(12));
1162*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(cont.contains(4));
1163*6777b538SAndroid Build Coastguard Worker }
1164*6777b538SAndroid Build Coastguard Worker
1165*6777b538SAndroid Build Coastguard Worker // pair<iterator, iterator> equal_range(const key_type& key)
1166*6777b538SAndroid Build Coastguard Worker // pair<const_iterator, const_iterator> equal_range(const key_type& key) const
1167*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EqualRange)1168*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EqualRange) {
1169*6777b538SAndroid Build Coastguard Worker {
1170*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1171*6777b538SAndroid Build Coastguard Worker
1172*6777b538SAndroid Build Coastguard Worker std::pair<typename TypedTree<TypeParam>::iterator,
1173*6777b538SAndroid Build Coastguard Worker typename TypedTree<TypeParam>::iterator>
1174*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(5);
1175*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.first);
1176*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.second);
1177*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(7);
1178*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.first);
1179*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.second);
1180*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(9);
1181*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.first);
1182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.second);
1183*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(11);
1184*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.first);
1185*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.second);
1186*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(13);
1187*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.first);
1188*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.second);
1189*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(15);
1190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.first);
1191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.second);
1192*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(17);
1193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.first);
1194*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.second);
1195*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(19);
1196*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.first);
1197*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1198*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(4);
1199*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.first);
1200*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.second);
1201*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(6);
1202*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.first);
1203*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.second);
1204*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(8);
1205*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.first);
1206*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.second);
1207*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(10);
1208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.first);
1209*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.second);
1210*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(12);
1211*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.first);
1212*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.second);
1213*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(14);
1214*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.first);
1215*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.second);
1216*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(16);
1217*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.first);
1218*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.second);
1219*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(18);
1220*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.first);
1221*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.second);
1222*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(20);
1223*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.first);
1224*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1225*6777b538SAndroid Build Coastguard Worker }
1226*6777b538SAndroid Build Coastguard Worker {
1227*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1228*6777b538SAndroid Build Coastguard Worker
1229*6777b538SAndroid Build Coastguard Worker std::pair<typename TypedTree<TypeParam>::const_iterator,
1230*6777b538SAndroid Build Coastguard Worker typename TypedTree<TypeParam>::const_iterator>
1231*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(5);
1232*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.first);
1233*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.second);
1234*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(7);
1235*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.first);
1236*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.second);
1237*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(9);
1238*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.first);
1239*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.second);
1240*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(11);
1241*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.first);
1242*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.second);
1243*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(13);
1244*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.first);
1245*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.second);
1246*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(15);
1247*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.first);
1248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.second);
1249*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(17);
1250*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.first);
1251*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.second);
1252*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(19);
1253*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.first);
1254*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1255*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(4);
1256*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.first);
1257*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), result.second);
1258*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(6);
1259*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.first);
1260*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), result.second);
1261*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(8);
1262*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.first);
1263*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), result.second);
1264*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(10);
1265*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.first);
1266*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), result.second);
1267*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(12);
1268*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.first);
1269*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), result.second);
1270*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(14);
1271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.first);
1272*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), result.second);
1273*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(16);
1274*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.first);
1275*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), result.second);
1276*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(18);
1277*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.first);
1278*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), result.second);
1279*6777b538SAndroid Build Coastguard Worker result = cont.equal_range(20);
1280*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.first);
1281*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), result.second);
1282*6777b538SAndroid Build Coastguard Worker }
1283*6777b538SAndroid Build Coastguard Worker }
1284*6777b538SAndroid Build Coastguard Worker
1285*6777b538SAndroid Build Coastguard Worker // iterator lower_bound(const key_type& key);
1286*6777b538SAndroid Build Coastguard Worker // const_iterator lower_bound(const key_type& key) const;
1287*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,LowerBound)1288*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, LowerBound) {
1289*6777b538SAndroid Build Coastguard Worker {
1290*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1291*6777b538SAndroid Build Coastguard Worker
1292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), cont.lower_bound(5));
1293*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
1294*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
1295*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
1296*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
1297*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
1298*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
1299*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
1300*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
1301*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
1302*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
1303*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
1304*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
1305*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
1306*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
1307*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
1308*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
1309*6777b538SAndroid Build Coastguard Worker }
1310*6777b538SAndroid Build Coastguard Worker {
1311*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1312*6777b538SAndroid Build Coastguard Worker
1313*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(cont.begin(), cont.lower_bound(5));
1314*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
1315*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
1316*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
1317*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
1318*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
1319*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
1320*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
1321*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
1322*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
1323*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
1324*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
1325*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
1326*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
1327*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
1328*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
1329*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
1330*6777b538SAndroid Build Coastguard Worker }
1331*6777b538SAndroid Build Coastguard Worker }
1332*6777b538SAndroid Build Coastguard Worker
1333*6777b538SAndroid Build Coastguard Worker // iterator upper_bound(const key_type& key)
1334*6777b538SAndroid Build Coastguard Worker // const_iterator upper_bound(const key_type& key) const
1335*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,UpperBound)1336*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, UpperBound) {
1337*6777b538SAndroid Build Coastguard Worker {
1338*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1339*6777b538SAndroid Build Coastguard Worker
1340*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
1341*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
1342*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
1343*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
1344*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
1345*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
1346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
1347*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
1348*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
1349*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
1350*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
1351*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
1352*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
1353*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
1354*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
1355*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
1356*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
1357*6777b538SAndroid Build Coastguard Worker }
1358*6777b538SAndroid Build Coastguard Worker {
1359*6777b538SAndroid Build Coastguard Worker const TypedTree<TypeParam> cont({5, 7, 9, 11, 13, 15, 17, 19});
1360*6777b538SAndroid Build Coastguard Worker
1361*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
1362*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
1363*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
1364*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
1365*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
1366*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
1367*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
1368*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
1369*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
1370*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
1371*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
1372*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
1373*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
1374*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
1375*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
1376*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
1377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
1378*6777b538SAndroid Build Coastguard Worker }
1379*6777b538SAndroid Build Coastguard Worker }
1380*6777b538SAndroid Build Coastguard Worker
1381*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
1382*6777b538SAndroid Build Coastguard Worker // General operations.
1383*6777b538SAndroid Build Coastguard Worker
1384*6777b538SAndroid Build Coastguard Worker // void swap(flat_tree& other)
1385*6777b538SAndroid Build Coastguard Worker // void swap(flat_tree& lhs, flat_tree& rhs)
1386*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,Swap)1387*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, Swap) {
1388*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> x({1, 2, 3});
1389*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> y({4});
1390*6777b538SAndroid Build Coastguard Worker swap(x, y);
1391*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(x, ElementsAre(4));
1392*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(y, ElementsAre(1, 2, 3));
1393*6777b538SAndroid Build Coastguard Worker
1394*6777b538SAndroid Build Coastguard Worker y.swap(x);
1395*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(x, ElementsAre(1, 2, 3));
1396*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(y, ElementsAre(4));
1397*6777b538SAndroid Build Coastguard Worker }
1398*6777b538SAndroid Build Coastguard Worker
1399*6777b538SAndroid Build Coastguard Worker // bool operator==(const flat_tree& lhs, const flat_tree& rhs)
1400*6777b538SAndroid Build Coastguard Worker // bool operator!=(const flat_tree& lhs, const flat_tree& rhs)
1401*6777b538SAndroid Build Coastguard Worker // bool operator<(const flat_tree& lhs, const flat_tree& rhs)
1402*6777b538SAndroid Build Coastguard Worker // bool operator>(const flat_tree& lhs, const flat_tree& rhs)
1403*6777b538SAndroid Build Coastguard Worker // bool operator<=(const flat_tree& lhs, const flat_tree& rhs)
1404*6777b538SAndroid Build Coastguard Worker // bool operator>=(const flat_tree& lhs, const flat_tree& rhs)
1405*6777b538SAndroid Build Coastguard Worker
TEST(FlatTree,Comparison)1406*6777b538SAndroid Build Coastguard Worker TEST(FlatTree, Comparison) {
1407*6777b538SAndroid Build Coastguard Worker // Provided comparator does not participate in comparison.
1408*6777b538SAndroid Build Coastguard Worker ReversedTree biggest({3});
1409*6777b538SAndroid Build Coastguard Worker ReversedTree smallest({1});
1410*6777b538SAndroid Build Coastguard Worker ReversedTree middle({1, 2});
1411*6777b538SAndroid Build Coastguard Worker
1412*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(biggest, biggest);
1413*6777b538SAndroid Build Coastguard Worker EXPECT_NE(biggest, smallest);
1414*6777b538SAndroid Build Coastguard Worker EXPECT_LT(smallest, middle);
1415*6777b538SAndroid Build Coastguard Worker EXPECT_LE(smallest, middle);
1416*6777b538SAndroid Build Coastguard Worker EXPECT_LE(middle, middle);
1417*6777b538SAndroid Build Coastguard Worker EXPECT_GT(biggest, middle);
1418*6777b538SAndroid Build Coastguard Worker EXPECT_GE(biggest, middle);
1419*6777b538SAndroid Build Coastguard Worker EXPECT_GE(biggest, biggest);
1420*6777b538SAndroid Build Coastguard Worker }
1421*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,EraseIf)1422*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, EraseIf) {
1423*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> x;
1424*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, base::EraseIf(x, [](int) { return false; }));
1425*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(x, ElementsAre());
1426*6777b538SAndroid Build Coastguard Worker
1427*6777b538SAndroid Build Coastguard Worker x = {1, 2, 3};
1428*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, base::EraseIf(x, [](int elem) { return !(elem & 1); }));
1429*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(x, ElementsAre(1, 3));
1430*6777b538SAndroid Build Coastguard Worker
1431*6777b538SAndroid Build Coastguard Worker x = {1, 2, 3, 4};
1432*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, base::EraseIf(x, [](int elem) { return elem & 1; }));
1433*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(x, ElementsAre(2, 4));
1434*6777b538SAndroid Build Coastguard Worker }
1435*6777b538SAndroid Build Coastguard Worker
1436*6777b538SAndroid Build Coastguard Worker // Test unsorted containers or containers with repeated elements cause a DCHECK
1437*6777b538SAndroid Build Coastguard Worker // if used with the sorted_unique tag.
TYPED_TEST_P(FlatTreeTest,SortedUniqueRangeConstructorDCHECKs)1438*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueRangeConstructorDCHECKs) {
1439*6777b538SAndroid Build Coastguard Worker int unsorted[] = {2, 1};
1440*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, std::begin(unsorted),
1441*6777b538SAndroid Build Coastguard Worker std::end(unsorted)));
1442*6777b538SAndroid Build Coastguard Worker
1443*6777b538SAndroid Build Coastguard Worker int repeated[] = {1, 2, 2};
1444*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, std::begin(repeated),
1445*6777b538SAndroid Build Coastguard Worker std::end(repeated)));
1446*6777b538SAndroid Build Coastguard Worker }
1447*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,SortedUniqueVectorCopyConstructorDCHECKs)1448*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueVectorCopyConstructorDCHECKs) {
1449*6777b538SAndroid Build Coastguard Worker TypeParam unsorted = {2, 1};
1450*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, unsorted));
1451*6777b538SAndroid Build Coastguard Worker
1452*6777b538SAndroid Build Coastguard Worker TypeParam repeated = {1, 2, 2};
1453*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, repeated));
1454*6777b538SAndroid Build Coastguard Worker }
1455*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,SortedUniqueVectorMoveConstructorDCHECKs)1456*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueVectorMoveConstructorDCHECKs) {
1457*6777b538SAndroid Build Coastguard Worker TypeParam unsorted = {2, 1};
1458*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, std::move(unsorted)));
1459*6777b538SAndroid Build Coastguard Worker
1460*6777b538SAndroid Build Coastguard Worker TypeParam repeated = {1, 2, 2};
1461*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, std::move(repeated)));
1462*6777b538SAndroid Build Coastguard Worker }
1463*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,SortedUniqueInitializerListConstructorDCHECKs)1464*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, SortedUniqueInitializerListConstructorDCHECKs) {
1465*6777b538SAndroid Build Coastguard Worker std::initializer_list<int> unsorted = {2, 1};
1466*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, unsorted));
1467*6777b538SAndroid Build Coastguard Worker
1468*6777b538SAndroid Build Coastguard Worker std::initializer_list<int> repeated = {1, 2, 2};
1469*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(TypedTree<TypeParam>(sorted_unique, repeated));
1470*6777b538SAndroid Build Coastguard Worker }
1471*6777b538SAndroid Build Coastguard Worker
TYPED_TEST_P(FlatTreeTest,ReplaceDCHECKs)1472*6777b538SAndroid Build Coastguard Worker TYPED_TEST_P(FlatTreeTest, ReplaceDCHECKs) {
1473*6777b538SAndroid Build Coastguard Worker TypedTree<TypeParam> tree;
1474*6777b538SAndroid Build Coastguard Worker TypeParam unsorted = {2, 1};
1475*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(tree.replace(std::move(unsorted)));
1476*6777b538SAndroid Build Coastguard Worker
1477*6777b538SAndroid Build Coastguard Worker TypeParam repeated = {1, 2, 2};
1478*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(tree.replace(std::move(repeated)));
1479*6777b538SAndroid Build Coastguard Worker }
1480*6777b538SAndroid Build Coastguard Worker
1481*6777b538SAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(FlatTreeTest,
1482*6777b538SAndroid Build Coastguard Worker DefaultConstructor,
1483*6777b538SAndroid Build Coastguard Worker CopyConstructor,
1484*6777b538SAndroid Build Coastguard Worker ContainerCopyConstructor,
1485*6777b538SAndroid Build Coastguard Worker InitializerListConstructor,
1486*6777b538SAndroid Build Coastguard Worker SortedUniqueContainerCopyConstructor,
1487*6777b538SAndroid Build Coastguard Worker SortedUniqueInitializerListConstructor,
1488*6777b538SAndroid Build Coastguard Worker CopyAssignable,
1489*6777b538SAndroid Build Coastguard Worker InitializerListAssignable,
1490*6777b538SAndroid Build Coastguard Worker Clear,
1491*6777b538SAndroid Build Coastguard Worker Size,
1492*6777b538SAndroid Build Coastguard Worker Empty,
1493*6777b538SAndroid Build Coastguard Worker Iterators,
1494*6777b538SAndroid Build Coastguard Worker InsertLValue,
1495*6777b538SAndroid Build Coastguard Worker InsertPositionLValue,
1496*6777b538SAndroid Build Coastguard Worker Emplace,
1497*6777b538SAndroid Build Coastguard Worker EmplacePosition,
1498*6777b538SAndroid Build Coastguard Worker Extract,
1499*6777b538SAndroid Build Coastguard Worker Replace,
1500*6777b538SAndroid Build Coastguard Worker ErasePosition,
1501*6777b538SAndroid Build Coastguard Worker EraseRange,
1502*6777b538SAndroid Build Coastguard Worker EraseKey,
1503*6777b538SAndroid Build Coastguard Worker EraseEndDeath,
1504*6777b538SAndroid Build Coastguard Worker Count,
1505*6777b538SAndroid Build Coastguard Worker Find,
1506*6777b538SAndroid Build Coastguard Worker Contains,
1507*6777b538SAndroid Build Coastguard Worker EqualRange,
1508*6777b538SAndroid Build Coastguard Worker LowerBound,
1509*6777b538SAndroid Build Coastguard Worker UpperBound,
1510*6777b538SAndroid Build Coastguard Worker Swap,
1511*6777b538SAndroid Build Coastguard Worker EraseIf,
1512*6777b538SAndroid Build Coastguard Worker SortedUniqueRangeConstructorDCHECKs,
1513*6777b538SAndroid Build Coastguard Worker SortedUniqueVectorCopyConstructorDCHECKs,
1514*6777b538SAndroid Build Coastguard Worker SortedUniqueVectorMoveConstructorDCHECKs,
1515*6777b538SAndroid Build Coastguard Worker SortedUniqueInitializerListConstructorDCHECKs,
1516*6777b538SAndroid Build Coastguard Worker ReplaceDCHECKs);
1517*6777b538SAndroid Build Coastguard Worker
1518*6777b538SAndroid Build Coastguard Worker using IntSequenceContainers =
1519*6777b538SAndroid Build Coastguard Worker ::testing::Types<std::deque<int>, std::vector<int>>;
1520*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(My, FlatTreeTest, IntSequenceContainers);
1521*6777b538SAndroid Build Coastguard Worker
1522*6777b538SAndroid Build Coastguard Worker } // namespace internal
1523*6777b538SAndroid Build Coastguard Worker } // namespace base
1524