Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20

// <flat_set>

// value_type displace(const_iterator position);

#include <deque>
#include <flat_set>
#include <functional>
#include <utility>

#include "test_macros.h"
#include "min_allocator.h"
#include "MoveOnly.h"

int main(int, char**)
{
{
using M = std::flat_set<int>;
M m = {1,2,3,4,5,6,7,8};
assert(m.size() == 8);
ASSERT_SAME_TYPE(decltype(m.displace(m.begin())), int);
ASSERT_SAME_TYPE(decltype(m.displace(m.cbegin())), int);
int v = m.displace(m.cbegin() + 3);
assert(v == 4);
assert((m == M{1,2,3,5,6,7,8}));

v = m.displace(m.cbegin());
assert(v == 1);
assert((m == M{2,3,5,6,7,8}));

v = m.displace(m.cbegin() + 5);
assert(v == 8);
assert((m == M{2,3,5,6,7}));

v = m.displace(m.cbegin() + 1);
assert(v == 3);
assert((m == M{2,5,6,7}));
}
{
using M = std::flat_set<int, std::less<int>, std::deque<int, min_allocator<int>>>;
std::deque<int, min_allocator<int>> container = {3,4};
container.insert(container.begin(), {1,2}); // now container is [_ 1 2] [3 4 _]
M m = M(std::sorted_unique, std::move(container));
ASSERT_SAME_TYPE(decltype(m.displace(m.begin())), int);
ASSERT_SAME_TYPE(decltype(m.displace(m.cbegin())), int);
int v = m.displace(m.cbegin() + 1); // shift right: m is [_ _ 1] [3 4 _]
assert(v == 2);
assert((m == M{1,3,4}));
v = m.displace(m.cbegin() + 1); // shift left: m is [_ _ 1] [4 _ _]
assert(v == 3);
assert((m == M{1,4}));
v = m.displace(m.cbegin());
assert(v == 1);
assert(m == M{4});
v = m.displace(m.cbegin());
assert(v == 4);
assert(m.empty());
}
{
// Verify that it works with move-only types (its raison d'etre).
using M = std::flat_set<MoveOnly>;
M m;
for (int i = 1; i <= 8; ++i) {
m.insert(i);
}
assert(m.size() == 8);
ASSERT_SAME_TYPE(decltype(m.displace(m.begin())), MoveOnly);
ASSERT_SAME_TYPE(decltype(m.displace(m.cbegin())), MoveOnly);
MoveOnly v = m.displace(m.cbegin() + 3);
assert(v == 4);

v = m.displace(m.cbegin());
assert(v == 1);

v = m.displace(m.cbegin() + 5);
assert(v == 8);

v = m.displace(m.cbegin() + 1);
assert(v == 3);
assert(m.size() == 4);
}
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <queue>

// void displace_top();

#include <queue>
#include <cassert>

#include "test_macros.h"
#include "MoveOnly.h"

int main(int, char**)
{
{
std::priority_queue<int> q;
ASSERT_SAME_TYPE(decltype(q.displace_top()), int);
q.push(1);
assert(q.displace_top() == 1);
assert(q.empty());
q.push(1);
q.push(3);
q.push(2);
assert(q.displace_top() == 3);
assert(q.displace_top() == 2);
assert(q.displace_top() == 1);
assert(q.empty());
}
#if TEST_STD_VER >= 11
{
std::priority_queue<MoveOnly> q;
ASSERT_SAME_TYPE(decltype(q.displace_top()), MoveOnly);
q.push(1);
assert(q.displace_top() == MoveOnly(1));
assert(q.empty());
q.push(1);
q.push(3);
q.push(2);
assert(q.displace_top() == MoveOnly(3));
assert(q.displace_top() == MoveOnly(2));
assert(q.displace_top() == MoveOnly(1));
assert(q.empty());
}
#endif
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <vector>

// value_type displace(const_iterator position);

#include <vector>
#include <iterator>
#include <cassert>

#include "test_macros.h"
#include "min_allocator.h"
#include "asan_testing.h"
#include "MoveOnly.h"

TEST_CONSTEXPR_CXX20 bool tests()
{
{
int a1[] = {1, 2, 3, 4, 5};
std::vector<int> l1(a1, a1+5);
int x = l1.displace(l1.begin());
assert(x == 1);
assert(is_contiguous_container_asan_correct(l1));
assert(l1 == std::vector<int>(a1+1, a1+5));
}
{
int a1[] = {1, 2, 3, 4, 5};
int e1[] = {1, 3, 4, 5};
std::vector<int> l1(a1, a1+5);
int x = l1.displace(l1.begin() + 1);
assert(x == 2);
assert(is_contiguous_container_asan_correct(l1));
assert(l1 == std::vector<int>(e1, e1+4));
}
{
int a1[] = {1, 2, 3};
std::vector<int> l1(a1, a1+3);
std::vector<int>::const_iterator i = l1.begin();
assert(is_contiguous_container_asan_correct(l1));
++i;
int j = l1.displace(i);
assert(l1.size() == 2);
assert(std::distance(l1.begin(), l1.end()) == 2);
assert(j == 2);
assert(*l1.begin() == 1);
assert(*std::next(l1.begin()) == 3);
assert(is_contiguous_container_asan_correct(l1));
j = l1.displace(l1.begin() + 1);
assert(j == 3);
assert(l1.size() == 1);
assert(std::distance(l1.begin(), l1.end()) == 1);
assert(*l1.begin() == 1);
assert(is_contiguous_container_asan_correct(l1));
j = l1.displace(l1.begin());
assert(j == 1);
assert(l1.size() == 0);
assert(std::distance(l1.begin(), l1.end()) == 0);
assert(is_contiguous_container_asan_correct(l1));
}
#if TEST_STD_VER >= 11
{
int a1[] = {1, 2, 3};
std::vector<MoveOnly, min_allocator<MoveOnly>> l1(a1, a1+3);
std::vector<MoveOnly, min_allocator<MoveOnly>>::const_iterator i = l1.begin();
assert(is_contiguous_container_asan_correct(l1));
++i;
MoveOnly j = l1.displace(i);
assert(l1.size() == 2);
assert(std::distance(l1.begin(), l1.end()) == 2);
assert(j == 2);
assert(*l1.begin() == 1);
assert(*std::next(l1.begin()) == 3);
assert(is_contiguous_container_asan_correct(l1));
j = l1.displace(l1.begin() + 1);
assert(j == 3);
assert(l1.size() == 1);
assert(std::distance(l1.begin(), l1.end()) == 1);
assert(*l1.begin() == 1);
assert(is_contiguous_container_asan_correct(l1));
j = l1.displace(l1.begin());
assert(j == 1);
assert(l1.size() == 0);
assert(std::distance(l1.begin(), l1.end()) == 0);
assert(is_contiguous_container_asan_correct(l1));
}
#endif

return true;
}

int main(int, char**)
{
tests();
#if TEST_STD_VER > 17
static_assert(tests());
#endif
return 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// <vector>

// void displace_back();

#include <vector>
#include <cassert>

#include "test_macros.h"
#include "test_allocator.h"
#include "min_allocator.h"
#include "MoveOnly.h"


TEST_CONSTEXPR_CXX20 bool tests()
{
{
std::vector<int> c;
c.push_back(1);
assert(c.size() == 1);
int x = c.displace_back();
assert(x == 1);
assert(c.size() == 0);

}
#if TEST_STD_VER >= 11
{
std::vector<int, min_allocator<int>> c;
c.push_back(1);
assert(c.size() == 1);
int x = c.displace_back();
assert(x == 1);
assert(c.size() == 0);
}
{
std::vector<MoveOnly, min_allocator<MoveOnly>> c;
c.push_back(1);
assert(c.size() == 1);
MoveOnly x = c.displace_back();
assert(x == 1);
assert(c.size() == 0);
}
#endif
return true;
}

int main(int, char**)
{
tests();
#if TEST_STD_VER > 17
static_assert(tests());
#endif
return 0;
}