1d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko/*
2d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * Copyright (C) 2016 The Android Open Source Project
3d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko *
4d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
5d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * you may not use this file except in compliance with the License.
6d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * You may obtain a copy of the License at
7d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko *
8d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
9d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko *
10d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * Unless required by applicable law or agreed to in writing, software
11d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
12d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * See the License for the specific language governing permissions and
14d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko * limitations under the License.
15d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko */
16d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
17d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#include <algorithm>
18d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#include <forward_list>
19d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#include <vector>
20d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
21d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#include "gtest/gtest.h"
22d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#include "intrusive_forward_list.h"
23d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
24d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Markonamespace art {
25d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
26d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Markostruct IFLTestValue {
27d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Deliberately not explicit.
28d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue(int v) : hook(), value(v) { }  // NOLINT(runtime/explicit)
29d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
30d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardListHook hook;
31d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  int value;
32d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko};
33d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
34d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Markobool operator==(const IFLTestValue& lhs, const IFLTestValue& rhs) {
35d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  return lhs.value == rhs.value;
36d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
37d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
38d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Markobool operator<(const IFLTestValue& lhs, const IFLTestValue& rhs) {
39d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  return lhs.value < rhs.value;
40d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
41d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
42d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko#define ASSERT_LISTS_EQUAL(expected, value)                                   \
43d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  do {                                                                        \
44d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko    ASSERT_EQ(expected.empty(), value.empty());                               \
45d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko    ASSERT_EQ(std::distance(expected.begin(), expected.end()),                \
46d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko              std::distance(value.begin(), value.end()));                     \
47d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko    ASSERT_TRUE(std::equal(expected.begin(), expected.end(), value.begin())); \
48d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  } while (false)
49d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
50d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, IteratorToConstIterator) {
51d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
52d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue>::iterator begin = ifl.begin();
53d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue>::const_iterator cbegin = ifl.cbegin();
54d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue>::const_iterator converted_begin = begin;
55d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(converted_begin == cbegin);
56d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
57d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
58d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, IteratorOperators) {
59d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
60d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl.begin() == ifl.cbegin());
61d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_FALSE(ifl.begin() != ifl.cbegin());
62d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl.end() == ifl.cend());
63d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_FALSE(ifl.end() != ifl.cend());
64d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
65d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl.begin() == ifl.end());  // Empty.
66d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_FALSE(ifl.begin() != ifl.end());  // Empty.
67d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
68d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value(1);
69d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.insert_after(ifl.cbefore_begin(), value);
70d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
71d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_FALSE(ifl.begin() == ifl.end());  // Not empty.
72d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl.begin() != ifl.end());  // Not empty.
73d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
74d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
75d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, ConstructRange) {
76d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 1, 2, 7 });
77d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
78d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
79d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
80d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
81d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
82d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Assign) {
83d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref1({ 2, 8, 5 });
84d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage1(ref1.begin(), ref1.end());
85d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
86d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.assign(storage1.begin(), storage1.end());
87d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl);
88d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref2({ 7, 1, 3 });
89d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage2(ref2.begin(), ref2.end());
90d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.assign(storage2.begin(), storage2.end());
91d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl);
92d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
93d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
94d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, PushPop) {
95d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value3(3);
96d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value7(7);
97d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref;
98d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
99d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
100d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.push_front(3);
101d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.push_front(value3);
102d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
103d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(3, ifl.front());
104d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.push_front(7);
105d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.push_front(value7);
106d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
107d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(7, ifl.front());
108d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.pop_front();
109d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.pop_front();
110d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
111d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(3, ifl.front());
112d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.pop_front();
113d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.pop_front();
114d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
115d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
116d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
117d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, InsertAfter1) {
118d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value4(4);
119d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value8(8);
120d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value5(5);
121d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IFLTestValue value3(3);
122d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref;
123d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
124d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
125d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ref_it = ref.insert_after(ref.before_begin(), 4);
126d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ifl_it = ifl.insert_after(ifl.before_begin(), value4);
127d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
128d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
129d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.begin());
130d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.begin());
131d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
132d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.insert_after(ref.begin(), 8);
133d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.insert_after(ifl.begin(), value8);
134d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
135d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
136d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it != ref.end());
137d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it != ifl.end());
138d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(++ref_it == ref.end());
139d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(++ifl_it == ifl.end());
140d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
141d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.insert_after(ref.begin(), 5);
142d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.insert_after(ifl.begin(), value5);
143d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
144d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
145d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
146d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.insert_after(ref_it, 3);
147d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.insert_after(ifl_it, value3);
148d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
149d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
150d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
151d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
152d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, InsertAfter2) {
153d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref;
154d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl;
155d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
156d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ref_it = ref.insert_after(ref.before_begin(), { 2, 8, 5 });
157d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage1({ { 2 }, { 8 }, { 5 } });
158d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ifl_it = ifl.insert_after(ifl.before_begin(), storage1.begin(), storage1.end());
159d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
160d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
161d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
162d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage2({ { 7 }, { 2 } });
163d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.insert_after(ref.begin(), { 7, 2 });
164d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.insert_after(ifl.begin(), storage2.begin(), storage2.end());
165d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
166d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(*ref_it, *ifl_it);
167d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
168d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage3({ { 1 }, { 3 }, { 4 }, { 9 } });
169d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.begin();
170d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.begin();
171d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, std::distance(ref.begin(), ref.end()) - 1);
172d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, std::distance(ifl.begin(), ifl.end()) - 1);
173d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.insert_after(ref_it, { 1, 3, 4, 9 });
174d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.insert_after(ifl_it, storage3.begin(), storage3.end());
175d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
176d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
177d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
178d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, EraseAfter1) {
179d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 1, 2, 7, 4, 5 });
180d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
181d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
182d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
183d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 5);
184d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
185d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ref_it = ref.begin();
186d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ifl_it = ifl.begin();
187d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 2);
188d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 2);
189d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref_it);
190d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl_it);
191d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
192d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 4);
193d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it != ref.end());
194d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it != ifl.end());
195d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(++ref_it == ref.end());
196d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(++ifl_it == ifl.end());
197d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
198d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.begin();
199d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.begin();
200d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 2);
201d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 2);
202d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref_it);
203d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl_it);
204d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
205d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 3);
206d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.end());
207d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.end());
208d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
209d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref.begin());
210d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl.begin());
211d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
212d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 2);
213d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it != ref.end());
214d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it != ifl.end());
215d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(++ref_it == ref.end());
216d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(++ifl_it == ifl.end());
217d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
218d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref.before_begin());
219d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl.before_begin());
220d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
221d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 1);
222d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.begin());
223d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.begin());
224d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
225d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref.before_begin());
226d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl.before_begin());
227d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
228d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 0);
229d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.begin());
230d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.begin());
231d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
232d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
233d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, EraseAfter2) {
234d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 1, 2, 7, 4, 5, 3, 2, 8, 9 });
235d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
236d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
237d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
238d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 9);
239d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
240d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ref_it = ref.begin();
241d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ifl_it = ifl.begin();
242d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 3);
243d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 3);
244d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref.begin(), ref_it);
245d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl.begin(), ifl_it);
246d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
247d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_EQ(std::distance(ref.begin(), ref_it), std::distance(ifl.begin(), ifl_it));
248d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 7);
249d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
250d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref_it, ref.end());
251d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl_it, ifl.end());
252d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
253d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.end());
254d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.end());
255d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 2);
256d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
257d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref.erase_after(ref.before_begin(), ref.end());
258d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl.erase_after(ifl.before_begin(), ifl.end());
259d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
260d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref_it == ref.end());
261d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl_it == ifl.end());
262d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK_EQ(std::distance(ref.begin(), ref.end()), 0);
263d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
264d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
265d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, SwapClear) {
266d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref1({ 1, 2, 7 });
267d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage1(ref1.begin(), ref1.end());
268d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl1(storage1.begin(), storage1.end());
269d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref2({ 3, 8, 6 });
270d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage2(ref2.begin(), ref2.end());
271d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl2(storage2.begin(), storage2.end());
272d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
273d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
274d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.swap(ref2);
275d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.swap(ifl2);
276d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
277d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
278d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.clear();
279d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.clear();
280d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
281d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
282d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  swap(ref1, ref2);
283d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  swap(ifl1, ifl2);
284d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
285d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
286d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.clear();
287d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.clear();
288d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
289d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
290d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
291d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
292d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, SpliceAfter) {
293d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref1({ 3, 1, 2, 7, 4, 5, 4, 8, 7 });
294d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref2;
295d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref1.begin(), ref1.end());
296d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl1(storage.begin(), storage.end());
297d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl2;
298d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
299d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
300d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
301d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move everything to ref2/ifl2.
302d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref2.splice_after(ref2.before_begin(), ref1);
303d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl2.splice_after(ifl2.before_begin(), ifl1);
304d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
305d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
306d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
307d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move first element (3) to ref1/ifl1.
308d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.splice_after(ref1.before_begin(), ref2, ref2.before_begin());
309d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.splice_after(ifl1.before_begin(), ifl2, ifl2.before_begin());
310d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
311d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
312d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
313d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move second element (2) to ref1/ifl1 after the first element (3).
314d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.splice_after(ref1.begin(), ref2, ref2.begin());
315d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.splice_after(ifl1.begin(), ifl2, ifl2.begin());
316d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
317d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
318d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
319d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move everything from ref2/ifl2 between the 2 elements now in ref1/ifl1.
320d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.splice_after(ref1.begin(), ref2);
321d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.splice_after(ifl1.begin(), ifl2);
322d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
323d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
324d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
325d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 3, 1, 7, 4, 5, 4, 8, 7, 2 });
326d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
327d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_TRUE(ifl2.empty());
328d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
329d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Empty splice_after().
330d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref2.splice_after(
331d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko      ref2.before_begin(), ref1, ref1.before_begin(), ref1.begin());
332d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl2.splice_after(ifl2.before_begin(), ifl1, ifl1.before_begin(), ifl1.begin());
333d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
334d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
335d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
336d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move { 1, 7 } to ref2/ifl2.
337d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ref_it = ref1.begin();
338d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto ifl_it = ifl1.begin();
339d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 3);
340d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 3);
341d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref2.splice_after(ref2.before_begin(), ref1, ref1.begin(), ref_it);
342d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl2.splice_after(ifl2.before_begin(), ifl1, ifl1.begin(), ifl_it);
343d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
344d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
345d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
346d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move { 8, 7, 2 } to the beginning of ref1/ifl1.
347d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref1.begin();
348d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl1.begin();
349d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 3);
350d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 3);
351d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.splice_after(ref1.before_begin(), ref1, ref_it, ref1.end());
352d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.splice_after(ifl1.before_begin(), ifl1, ifl_it, ifl1.end());
353d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
354d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
355d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  check.assign({ 8, 7, 2, 3, 4, 5, 4 });
356d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
357d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  check.assign({ 1, 7 });
358d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl2);
359d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
360d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  // Move all but the first element to ref2/ifl2.
361d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref_it = ref2.begin();
362d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl_it = ifl2.begin();
363d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ref_it, 1);
364d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::advance(ifl_it, 1);
365d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref2.splice_after(ref_it, ref1, ref1.begin(), ref1.end());
366d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl2.splice_after(ifl_it, ifl1, ifl1.begin(), ifl1.end());
367d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
368d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
369d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
370d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  check.assign({8});
371d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
3729ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko
3739ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  // Move the first element of ref1/ifl1 to the beginning of ref1/ifl1 (do nothing).
3749ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ref1.splice_after(ref1.before_begin(), ref1, ref1.before_begin());
3759ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ifl1.splice_after(ifl1.before_begin(), ifl1, ifl1.before_begin());
3769ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
3779ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
3789ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko
3799ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  // Move the first element of ref2/ifl2 after itself (do nothing).
3809ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ref1.splice_after(ref1.begin(), ref1, ref1.before_begin());
3819ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ifl1.splice_after(ifl1.begin(), ifl1, ifl1.before_begin());
3829ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
3839ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
3849ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko
385d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  check.assign({ 1, 7, 7, 2, 3, 4, 5, 4 });
386d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl2);
3879ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko
3889ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  // Move the first element of ref2/ifl2 to the beginning of ref2/ifl2 (do nothing).
3899ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ref2.splice_after(ref2.before_begin(), ref2, ref2.before_begin());
3909ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ifl2.splice_after(ifl2.before_begin(), ifl2, ifl2.before_begin());
3919ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
3929ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(check, ifl2);
3939ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko
3949ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  // Move the first element of ref2/ifl2 after itself (do nothing).
3959ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ref2.splice_after(ref2.begin(), ref2, ref2.before_begin());
3969ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ifl2.splice_after(ifl2.begin(), ifl2, ifl2.before_begin());
3979ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
3989ef26544e6d9c438b150dfda39be61a7b4fd8b20Vladimir Marko  ASSERT_LISTS_EQUAL(check, ifl2);
399d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
400d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
401d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Remove) {
402d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 3, 1, 2, 7, 4, 5, 4, 8, 7 });
403d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
404d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
405d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
406d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.remove(1);
407d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.remove(1);
408d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
409d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.remove(4);
410d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.remove(4);
411d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
412d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto odd = [](IFLTestValue value) { return (value.value & 1) != 0; };  // NOLINT(readability/braces)
413d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.remove_if(odd);
414d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.remove_if(odd);
415d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
416d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto all = [](IFLTestValue value ATTRIBUTE_UNUSED) { return true; };  // NOLINT(readability/braces)
417d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.remove_if(all);
418d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.remove_if(all);
419d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
420d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
421d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
422d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Unique) {
423d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 3, 1, 1, 2, 3, 3, 7, 7, 4, 4, 5, 7 });
424d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
425d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
426d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
427d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.unique();
428d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.unique();
429d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
430d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 3, 1, 2, 3, 7, 4, 5, 7 });
431d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl);
432d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
433d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto bin_pred = [](IFLTestValue lhs, IFLTestValue rhs) {
434d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko    return (lhs.value & ~1) == (rhs.value & ~1);
435d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  };
436d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.unique(bin_pred);
437d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.unique(bin_pred);
438d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
439d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  check.assign({ 3, 1, 2, 7, 4, 7 });
440d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl);
441d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
442d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
443d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Merge) {
444d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref1({ 1, 4, 8, 8, 12 });
445d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage1(ref1.begin(), ref1.end());
446d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl1(storage1.begin(), storage1.end());
447d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref2({ 3, 5, 6, 7, 9 });
448d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage2(ref2.begin(), ref2.end());
449d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl2(storage2.begin(), storage2.end());
450d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
451d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
452d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(std::is_sorted(ref1.begin(), ref1.end()));
453d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(std::is_sorted(ref2.begin(), ref2.end()));
454d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref1.merge(ref2);
455d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl1.merge(ifl2);
456d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref1, ifl1);
457d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref2, ifl2);
458d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(ref2.empty());
459d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 1, 3, 4, 5, 6, 7, 8, 8, 9, 12 });
460d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl1);
461d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
462d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
463d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Sort1) {
464d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 2, 9, 8, 3, 7, 4, 1, 5, 3, 0 });
465d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
466d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
467d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
468d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(!std::is_sorted(ref.begin(), ref.end()));
469d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.sort();
470d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.sort();
471d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
472d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 0, 1, 2, 3, 3, 4, 5, 7, 8, 9 });
473d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl);
474d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
475d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
476d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Sort2) {
477d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 2, 9, 8, 3, 7, 4, 1, 5, 3, 0 });
478d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
479d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
480d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
481d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  auto cmp = [](IFLTestValue lhs, IFLTestValue rhs) {
482d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko    return (lhs.value & ~1) < (rhs.value & ~1);
483d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  };
484d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(!std::is_sorted(ref.begin(), ref.end(), cmp));
485d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.sort(cmp);
486d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.sort(cmp);
487d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
488d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 1, 0, 2, 3, 3, 4, 5, 7, 9, 8 });
489d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl);
490d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
491d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
492d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir MarkoTEST(IntrusiveForwardList, Reverse) {
493d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> ref({ 8, 3, 5, 4, 1, 3 });
494d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::vector<IFLTestValue> storage(ref.begin(), ref.end());
495d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  IntrusiveForwardList<IFLTestValue> ifl(storage.begin(), storage.end());
496d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
497d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  CHECK(!std::is_sorted(ref.begin(), ref.end()));
498d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ref.reverse();
499d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ifl.reverse();
500d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(ref, ifl);
501d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  std::forward_list<int> check({ 3, 1, 4, 5, 3, 8 });
502d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko  ASSERT_LISTS_EQUAL(check, ifl);
503d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}
504d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko
505d59f3b1b7f5c1ab9f0731ff9dc60611e8d9a6edeVladimir Marko}  // namespace art
506