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