Our friendly GCC does not consider std::pair<int, int> trivially
copiable either, while everybody else does. Shame on GCC.
This commit is contained in:
parent
d8a0b11157
commit
3a9857e493
@ -54,12 +54,18 @@ TEST_CASE("Skip addressing", "[MutableSkipHeapPriorityQueue]") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ValueIndexPair
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
size_t idx = 0;
|
||||||
|
};
|
||||||
|
|
||||||
template<size_t block_size = 16>
|
template<size_t block_size = 16>
|
||||||
static auto make_test_priority_queue()
|
static auto make_test_priority_queue()
|
||||||
{
|
{
|
||||||
return make_miniheap_mutable_priority_queue<std::pair<int, size_t>, block_size, false>(
|
return make_miniheap_mutable_priority_queue<ValueIndexPair, block_size, false>(
|
||||||
[](std::pair<int, size_t> &v, size_t idx){ v.second = idx; },
|
[](ValueIndexPair &v, size_t idx){ v.idx = idx; },
|
||||||
[](std::pair<int, size_t> &l, std::pair<int, size_t> &r){ return l.first < r.first; });
|
[](ValueIndexPair &l, ValueIndexPair &r){ return l.value < r.value; });
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue]") {
|
TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue]") {
|
||||||
@ -70,18 +76,18 @@ TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue
|
|||||||
}
|
}
|
||||||
SECTION("an empty queue is not empty when one element is inserted") {
|
SECTION("an empty queue is not empty when one element is inserted") {
|
||||||
auto q = make_test_priority_queue();
|
auto q = make_test_priority_queue();
|
||||||
q.push(std::make_pair(1, 0U));
|
q.push({ 1 });
|
||||||
REQUIRE(!q.empty());
|
REQUIRE(!q.empty());
|
||||||
REQUIRE(q.size() == 1);
|
REQUIRE(q.size() == 1);
|
||||||
}
|
}
|
||||||
SECTION("a queue with one element has it on top") {
|
SECTION("a queue with one element has it on top") {
|
||||||
auto q = make_test_priority_queue();
|
auto q = make_test_priority_queue();
|
||||||
q.push(std::make_pair(8, 0U));
|
q.push({ 8 });
|
||||||
REQUIRE(q.top().first == 8);
|
REQUIRE(q.top().value == 8);
|
||||||
}
|
}
|
||||||
SECTION("a queue with one element becomes empty when popped") {
|
SECTION("a queue with one element becomes empty when popped") {
|
||||||
auto q = make_test_priority_queue();
|
auto q = make_test_priority_queue();
|
||||||
q.push(std::make_pair(9, 0U));
|
q.push({ 9 });
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.empty());
|
REQUIRE(q.empty());
|
||||||
REQUIRE(q.size() == 0);
|
REQUIRE(q.size() == 0);
|
||||||
@ -89,22 +95,22 @@ TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue
|
|||||||
SECTION("insert sorted stays sorted") {
|
SECTION("insert sorted stays sorted") {
|
||||||
auto q = make_test_priority_queue();
|
auto q = make_test_priority_queue();
|
||||||
for (auto i : { 1, 2, 3, 4, 5, 6, 7, 8 })
|
for (auto i : { 1, 2, 3, 4, 5, 6, 7, 8 })
|
||||||
q.push(std::make_pair(i, 0U));
|
q.push({ i });
|
||||||
REQUIRE(q.top().first == 1);
|
REQUIRE(q.top().value == 1);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 2);
|
REQUIRE(q.top().value == 2);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 3);
|
REQUIRE(q.top().value == 3);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 4);
|
REQUIRE(q.top().value == 4);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 5);
|
REQUIRE(q.top().value == 5);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 6);
|
REQUIRE(q.top().value == 6);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 7);
|
REQUIRE(q.top().value == 7);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.top().first == 8);
|
REQUIRE(q.top().value == 8);
|
||||||
q.pop();
|
q.pop();
|
||||||
REQUIRE(q.empty());
|
REQUIRE(q.empty());
|
||||||
}
|
}
|
||||||
@ -116,14 +122,14 @@ TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue
|
|||||||
int n[36000];
|
int n[36000];
|
||||||
for (auto& i : n) {
|
for (auto& i : n) {
|
||||||
i = dist(gen);
|
i = dist(gen);
|
||||||
q.push(std::make_pair(i, 0U));
|
q.push({ i });
|
||||||
}
|
}
|
||||||
|
|
||||||
REQUIRE(!q.empty());
|
REQUIRE(!q.empty());
|
||||||
REQUIRE(q.size() == 36000);
|
REQUIRE(q.size() == 36000);
|
||||||
std::sort(std::begin(n), std::end(n));
|
std::sort(std::begin(n), std::end(n));
|
||||||
for (auto i : n) {
|
for (auto i : n) {
|
||||||
REQUIRE(q.top().first == i);
|
REQUIRE(q.top().value == i);
|
||||||
q.pop();
|
q.pop();
|
||||||
}
|
}
|
||||||
REQUIRE(q.empty());
|
REQUIRE(q.empty());
|
||||||
@ -277,35 +283,35 @@ TEST_CASE("Mutable priority queue - reshedule first", "[MutableSkipHeapPriorityQ
|
|||||||
}
|
}
|
||||||
SECTION("reschedule top of 2 elements to last") {
|
SECTION("reschedule top of 2 elements to last") {
|
||||||
auto q = make_test_priority_queue<8>();
|
auto q = make_test_priority_queue<8>();
|
||||||
q.push(std::make_pair(1, 0U));
|
q.push({ 1 });
|
||||||
q.push(std::make_pair(2, 0U));
|
q.push({ 2 });
|
||||||
REQUIRE(q.top().first == 1);
|
REQUIRE(q.top().value == 1);
|
||||||
// Update the top element.
|
// Update the top element.
|
||||||
q.top().first = 3;
|
q.top().value = 3;
|
||||||
q.update(1);
|
q.update(1);
|
||||||
REQUIRE(q.top().first == 2);
|
REQUIRE(q.top().value == 2);
|
||||||
}
|
}
|
||||||
SECTION("reschedule top of 3 elements left to 2nd") {
|
SECTION("reschedule top of 3 elements left to 2nd") {
|
||||||
auto q = make_test_priority_queue<8>();
|
auto q = make_test_priority_queue<8>();
|
||||||
q.push(std::make_pair(1, 0U));
|
q.push({ 1 });
|
||||||
q.push(std::make_pair(2, 0U));
|
q.push({ 2 });
|
||||||
q.push(std::make_pair(4, 0U));
|
q.push({ 4 });
|
||||||
REQUIRE(q.top().first == 1);
|
REQUIRE(q.top().value == 1);
|
||||||
// Update the top element.
|
// Update the top element.
|
||||||
q.top().first = 3;
|
q.top().value = 3;
|
||||||
q.update(1);
|
q.update(1);
|
||||||
REQUIRE(q.top().first == 2);
|
REQUIRE(q.top().value == 2);
|
||||||
}
|
}
|
||||||
SECTION("reschedule top of 3 elements right to 2nd") {
|
SECTION("reschedule top of 3 elements right to 2nd") {
|
||||||
auto q = make_test_priority_queue<8>();
|
auto q = make_test_priority_queue<8>();
|
||||||
q.push(std::make_pair(1, 0U));
|
q.push({ 1 });
|
||||||
q.push(std::make_pair(4, 0U));
|
q.push({ 4 });
|
||||||
q.push(std::make_pair(2, 0U));
|
q.push({ 2 });
|
||||||
REQUIRE(q.top().first == 1);
|
REQUIRE(q.top().value == 1);
|
||||||
// Update the top element.
|
// Update the top element.
|
||||||
q.top().first = 3;
|
q.top().value = 3;
|
||||||
q.update(1);
|
q.update(1);
|
||||||
REQUIRE(q.top().first == 2);
|
REQUIRE(q.top().value == 2);
|
||||||
}
|
}
|
||||||
SECTION("reschedule top random gives same resultas pop/push") {
|
SECTION("reschedule top random gives same resultas pop/push") {
|
||||||
std::random_device rd;
|
std::random_device rd;
|
||||||
@ -317,16 +323,16 @@ TEST_CASE("Mutable priority queue - reshedule first", "[MutableSkipHeapPriorityQ
|
|||||||
|
|
||||||
for (size_t outer = 0; outer < 100; ++ outer) {
|
for (size_t outer = 0; outer < 100; ++ outer) {
|
||||||
int num = gen();
|
int num = gen();
|
||||||
pq.push(std::make_pair(num, 0U));
|
pq.push({ num });
|
||||||
stdq.push(num);
|
stdq.push({ num });
|
||||||
for (size_t inner = 0; inner < 100; ++ inner) {
|
for (size_t inner = 0; inner < 100; ++ inner) {
|
||||||
int newval = gen();
|
int newval = gen();
|
||||||
// Update the top element.
|
// Update the top element.
|
||||||
pq.top().first = newval;
|
pq.top().value = newval;
|
||||||
pq.update(1);
|
pq.update(1);
|
||||||
stdq.pop();
|
stdq.pop();
|
||||||
stdq.push(newval);
|
stdq.push({ newval });
|
||||||
auto n = pq.top().first;
|
auto n = pq.top().value;
|
||||||
auto sn = stdq.top();
|
auto sn = stdq.top();
|
||||||
REQUIRE(sn == n);
|
REQUIRE(sn == n);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user