mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	GCC does not consider std::pair<std::pair<...>, ...> to be trivially
copiable, thus fixing the unit tests with a custom trivially copyable type.
This commit is contained in:
		
							parent
							
								
									5bbe76003e
								
							
						
					
					
						commit
						d8a0b11157
					
				
					 1 changed files with 83 additions and 78 deletions
				
			
		|  | @ -131,142 +131,147 @@ TEST_CASE("Mutable priority queue - basic tests", "[MutableSkipHeapPriorityQueue | |||
| } | ||||
| 
 | ||||
| TEST_CASE("Mutable priority queue - reshedule first", "[MutableSkipHeapPriorityQueue]") { | ||||
|     struct MyValue { | ||||
|         int    value; | ||||
|         int   *ptr; | ||||
|         size_t idx; | ||||
|     }; | ||||
|     SECTION("reschedule top with highest prio leaves order unchanged") { | ||||
|         auto q = make_miniheap_mutable_priority_queue<std::pair<std::pair<int, int*>, size_t>, 4, false>( | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& v, size_t idx) { v.second = idx; }, | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& l, std::pair<std::pair<int, int*>, size_t>& r) { return l.first.first < r.first.first; }); | ||||
|         auto q = make_miniheap_mutable_priority_queue<MyValue, 4, false>( | ||||
|             [](MyValue& v, size_t idx) { v.idx = idx; }, | ||||
|             [](MyValue& l, MyValue& r) { return l.value < r.value; }); | ||||
| 
 | ||||
|         //              0  1   2   3  4   5  6   7   8
 | ||||
|         int nums[] = { 32, 1, 88, 16, 9, 11, 3, 22, 23 }; | ||||
|         for (auto &i : nums) | ||||
|             q.push(std::make_pair(std::make_pair(i, &i), 0U)); | ||||
|         REQUIRE(q.top().first.first == 1); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(*q.top().first.second == 1); | ||||
|             q.push({ i, &i, 0U }); | ||||
|         REQUIRE(q.top().value == 1); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         REQUIRE(*q.top().ptr == 1); | ||||
| 
 | ||||
|         // Update the top element.
 | ||||
|         q.top().first.first = 2; | ||||
|         q.top().value = 2; | ||||
|         q.update(1); | ||||
| 
 | ||||
|         REQUIRE(q.top().first.first == 2); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(q.top().value == 2); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 3); | ||||
|         REQUIRE(q.top().first.second == &nums[6]); | ||||
|         REQUIRE(q.top().value == 3); | ||||
|         REQUIRE(q.top().ptr == &nums[6]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 9); | ||||
|         REQUIRE(q.top().first.second == &nums[4]); | ||||
|         REQUIRE(q.top().value == 9); | ||||
|         REQUIRE(q.top().ptr == &nums[4]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 11); | ||||
|         REQUIRE(q.top().first.second == &nums[5]); | ||||
|         REQUIRE(q.top().value == 11); | ||||
|         REQUIRE(q.top().ptr == &nums[5]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 16); | ||||
|         REQUIRE(q.top().first.second == &nums[3]); | ||||
|         REQUIRE(q.top().value == 16); | ||||
|         REQUIRE(q.top().ptr == &nums[3]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 22); | ||||
|         REQUIRE(q.top().first.second == &nums[7]); | ||||
|         REQUIRE(q.top().value == 22); | ||||
|         REQUIRE(q.top().ptr == &nums[7]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 23); | ||||
|         REQUIRE(q.top().first.second == &nums[8]); | ||||
|         REQUIRE(q.top().value == 23); | ||||
|         REQUIRE(q.top().ptr == &nums[8]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 32); | ||||
|         REQUIRE(q.top().first.second == &nums[0]); | ||||
|         REQUIRE(q.top().value == 32); | ||||
|         REQUIRE(q.top().ptr == &nums[0]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 88); | ||||
|         REQUIRE(q.top().first.second == &nums[2]); | ||||
|         REQUIRE(q.top().value == 88); | ||||
|         REQUIRE(q.top().ptr == &nums[2]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.empty()); | ||||
|     } | ||||
|     SECTION("reschedule to mid range moves element to correct place") { | ||||
|         auto q = make_miniheap_mutable_priority_queue<std::pair<std::pair<int, int*>, size_t>, 4, false>( | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& v, size_t idx) { v.second = idx; }, | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& l, std::pair<std::pair<int, int*>, size_t>& r) { return l.first.first < r.first.first; }); | ||||
|         auto q = make_miniheap_mutable_priority_queue<MyValue, 4, false>( | ||||
|             [](MyValue& v, size_t idx) { v.idx = idx; }, | ||||
|             [](MyValue& l, MyValue& r) { return l.value < r.value; }); | ||||
| 
 | ||||
|         //              0  1   2   3  4   5  6   7   8
 | ||||
|         int nums[] = { 32, 1, 88, 16, 9, 11, 3, 22, 23 }; | ||||
|         for (auto& i : nums) | ||||
|             q.push(std::make_pair(std::make_pair(i, &i), 0U)); | ||||
|         REQUIRE(q.top().first.first == 1); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(*q.top().first.second == 1); | ||||
|             q.push({ i, &i, 0U }); | ||||
|         REQUIRE(q.top().value == 1); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         REQUIRE(*q.top().ptr == 1); | ||||
| 
 | ||||
|         // Update the top element.
 | ||||
|         q.top().first.first = 12; | ||||
|         q.top().value = 12; | ||||
|         q.update(1); | ||||
| 
 | ||||
|         REQUIRE(q.top().first.first == 3); | ||||
|         REQUIRE(q.top().first.second == &nums[6]); | ||||
|         REQUIRE(q.top().value == 3); | ||||
|         REQUIRE(q.top().ptr == &nums[6]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 9); | ||||
|         REQUIRE(q.top().first.second == &nums[4]); | ||||
|         REQUIRE(q.top().value == 9); | ||||
|         REQUIRE(q.top().ptr == &nums[4]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 11); | ||||
|         REQUIRE(q.top().first.second == &nums[5]); | ||||
|         REQUIRE(q.top().value == 11); | ||||
|         REQUIRE(q.top().ptr == &nums[5]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 12); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(q.top().value == 12); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 16); | ||||
|         REQUIRE(q.top().first.second == &nums[3]); | ||||
|         REQUIRE(q.top().value == 16); | ||||
|         REQUIRE(q.top().ptr == &nums[3]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 22); | ||||
|         REQUIRE(q.top().first.second == &nums[7]); | ||||
|         REQUIRE(q.top().value == 22); | ||||
|         REQUIRE(q.top().ptr == &nums[7]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 23); | ||||
|         REQUIRE(q.top().first.second == &nums[8]); | ||||
|         REQUIRE(q.top().value == 23); | ||||
|         REQUIRE(q.top().ptr == &nums[8]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 32); | ||||
|         REQUIRE(q.top().first.second == &nums[0]); | ||||
|         REQUIRE(q.top().value == 32); | ||||
|         REQUIRE(q.top().ptr == &nums[0]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 88); | ||||
|         REQUIRE(q.top().first.second == &nums[2]); | ||||
|         REQUIRE(q.top().value == 88); | ||||
|         REQUIRE(q.top().ptr == &nums[2]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.empty()); | ||||
|     } | ||||
|     SECTION("reschedule to last moves element to correct place", "heap") | ||||
|     { | ||||
|         auto q = make_miniheap_mutable_priority_queue<std::pair<std::pair<int, int*>, size_t>, 4, false>( | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& v, size_t idx) { v.second = idx; }, | ||||
|             [](std::pair<std::pair<int, int*>, size_t>& l, std::pair<std::pair<int, int*>, size_t>& r) { return l.first.first < r.first.first; }); | ||||
|         auto q = make_miniheap_mutable_priority_queue<MyValue, 4, false>( | ||||
|             [](MyValue& v, size_t idx) { v.idx = idx; }, | ||||
|             [](MyValue& l, MyValue& r) { return l.value < r.value; }); | ||||
| 
 | ||||
|         //              0  1   2   3  4   5  6   7   8
 | ||||
|         int nums[] = { 32, 1, 88, 16, 9, 11, 3, 22, 23 }; | ||||
|         for (auto& i : nums) | ||||
|             q.push(std::make_pair(std::make_pair(i, &i), 0U)); | ||||
|         REQUIRE(q.top().first.first == 1); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(*q.top().first.second == 1); | ||||
|             q.push({ i, &i, 0U }); | ||||
|         REQUIRE(q.top().value == 1); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         REQUIRE(*q.top().ptr == 1); | ||||
| 
 | ||||
|         // Update the top element.
 | ||||
|         q.top().first.first = 89; | ||||
|         q.top().value = 89; | ||||
|         q.update(1); | ||||
| 
 | ||||
|         REQUIRE(q.top().first.first == 3); | ||||
|         REQUIRE(q.top().first.second == &nums[6]); | ||||
|         REQUIRE(q.top().value == 3); | ||||
|         REQUIRE(q.top().ptr == &nums[6]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 9); | ||||
|         REQUIRE(q.top().first.second == &nums[4]); | ||||
|         REQUIRE(q.top().value == 9); | ||||
|         REQUIRE(q.top().ptr == &nums[4]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 11); | ||||
|         REQUIRE(q.top().first.second == &nums[5]); | ||||
|         REQUIRE(q.top().value == 11); | ||||
|         REQUIRE(q.top().ptr == &nums[5]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 16); | ||||
|         REQUIRE(q.top().first.second == &nums[3]); | ||||
|         REQUIRE(q.top().value == 16); | ||||
|         REQUIRE(q.top().ptr == &nums[3]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 22); | ||||
|         REQUIRE(q.top().first.second == &nums[7]); | ||||
|         REQUIRE(q.top().value == 22); | ||||
|         REQUIRE(q.top().ptr == &nums[7]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 23); | ||||
|         REQUIRE(q.top().first.second == &nums[8]); | ||||
|         REQUIRE(q.top().value == 23); | ||||
|         REQUIRE(q.top().ptr == &nums[8]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 32); | ||||
|         REQUIRE(q.top().first.second == &nums[0]); | ||||
|         REQUIRE(q.top().value == 32); | ||||
|         REQUIRE(q.top().ptr == &nums[0]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 88); | ||||
|         REQUIRE(q.top().first.second == &nums[2]); | ||||
|         REQUIRE(q.top().value == 88); | ||||
|         REQUIRE(q.top().ptr == &nums[2]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.top().first.first == 89); | ||||
|         REQUIRE(q.top().first.second == &nums[1]); | ||||
|         REQUIRE(q.top().value == 89); | ||||
|         REQUIRE(q.top().ptr == &nums[1]); | ||||
|         q.pop(); | ||||
|         REQUIRE(q.empty()); | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vojtech Bubnik
						Vojtech Bubnik