| 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; | ||
| } |