From 2b17e81f133dbc2aeb22d99d857b6a1d136ea247 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 22 Nov 2019 19:09:39 +0100 Subject: [PATCH] If of the previous commit: Set the MutablePriorityQueue indices to size_t(-1) when removed from the queue. --- src/libslic3r/MotionPlanner.cpp | 2 +- src/libslic3r/MutablePriorityQueue.hpp | 68 +++++++++++++++----------- src/libslic3r/ShortestPath.cpp | 6 +-- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/MotionPlanner.cpp b/src/libslic3r/MotionPlanner.cpp index 42bc6c2f1..45a80671c 100644 --- a/src/libslic3r/MotionPlanner.cpp +++ b/src/libslic3r/MotionPlanner.cpp @@ -319,7 +319,7 @@ Polyline MotionPlannerGraph::shortest_path(size_t node_start, size_t node_end) c std::vector map_node_to_queue_id(m_adjacency_list.size(), size_t(-1)); distance[node_start] = 0.; - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [&map_node_to_queue_id](const node_t node, size_t idx) { map_node_to_queue_id[node] = idx; }, [&distance](const node_t node1, const node_t node2) { return distance[node1] < distance[node2]; }); queue.reserve(m_adjacency_list.size()); diff --git a/src/libslic3r/MutablePriorityQueue.hpp b/src/libslic3r/MutablePriorityQueue.hpp index da469b7ba..b20bf60ea 100644 --- a/src/libslic3r/MutablePriorityQueue.hpp +++ b/src/libslic3r/MutablePriorityQueue.hpp @@ -3,7 +3,7 @@ #include -template +template class MutablePriorityQueue { public: @@ -42,26 +42,30 @@ private: LessPredicate m_less_predicate; }; -template -MutablePriorityQueue make_mutable_priority_queue(IndexSetter &&index_setter, LessPredicate &&less_predicate) +template +MutablePriorityQueue make_mutable_priority_queue(IndexSetter &&index_setter, LessPredicate &&less_predicate) { - return MutablePriorityQueue( + return MutablePriorityQueue( std::forward(index_setter), std::forward(less_predicate)); } -template -inline void MutablePriorityQueue::clear() +template +inline void MutablePriorityQueue::clear() { -#ifndef NDEBUG - for (size_t idx = 0; idx < m_heap.size(); ++ idx) - // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + for (size_t idx = 0; idx < m_heap.size(); ++ idx) + // Mark as removed from the queue. + m_index_setter(m_heap[idx], std::numeric_limits::max()); + } m_heap.clear(); } -template -inline void MutablePriorityQueue::push(const T &item) +template +inline void MutablePriorityQueue::push(const T &item) { size_t idx = m_heap.size(); m_heap.emplace_back(item); @@ -69,8 +73,8 @@ inline void MutablePriorityQueue::push(const T &i update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::push(T &&item) +template +inline void MutablePriorityQueue::push(T &&item) { size_t idx = m_heap.size(); m_heap.emplace_back(std::move(item)); @@ -78,14 +82,18 @@ inline void MutablePriorityQueue::push(T &&item) update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::pop() +template +inline void MutablePriorityQueue::pop() { assert(! m_heap.empty()); -#ifndef NDEBUG - // Mark as removed from the queue. - m_index_setter(m_heap.front(), std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + // Mark as removed from the queue. + m_index_setter(m_heap.front(), std::numeric_limits::max()); + } if (m_heap.size() > 1) { m_heap.front() = m_heap.back(); m_heap.pop_back(); @@ -95,14 +103,18 @@ inline void MutablePriorityQueue::pop() m_heap.clear(); } -template -inline void MutablePriorityQueue::remove(size_t idx) +template +inline void MutablePriorityQueue::remove(size_t idx) { assert(idx < m_heap.size()); -#ifndef NDEBUG - // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + // Mark as removed from the queue. + m_index_setter(m_heap[idx], std::numeric_limits::max()); + } if (idx + 1 == m_heap.size()) { m_heap.pop_back(); return; @@ -114,8 +126,8 @@ inline void MutablePriorityQueue::remove(size_t i update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::update_heap_up(size_t top, size_t bottom) +template +inline void MutablePriorityQueue::update_heap_up(size_t top, size_t bottom) { size_t childIdx = bottom; T *child = &m_heap[childIdx]; @@ -138,8 +150,8 @@ inline void MutablePriorityQueue::update_heap_up( } } -template -inline void MutablePriorityQueue::update_heap_down(size_t top, size_t bottom) +template +inline void MutablePriorityQueue::update_heap_down(size_t top, size_t bottom) { size_t parentIdx = top; T *parent = &m_heap[parentIdx]; diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index 0ebd6c173..ae6023e7a 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -191,7 +191,7 @@ std::vector> chain_segments_greedy_constrained_reversals } // Initialize a heap of end points sorted by the lowest distance to the next valid point of a path. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](EndPoint *ep, size_t idx){ ep->heap_idx = idx; }, [](EndPoint *l, EndPoint *r){ return l->distance_out < r->distance_out; }); queue.reserve(end_points.size() * 2 - 1); @@ -687,7 +687,7 @@ std::vector> chain_segments_greedy_constrained_reversals } // Initialize a heap of end points sorted by the lowest distance to the next valid point of a path. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](EndPoint *ep, size_t idx){ ep->heap_idx = idx; }, [](EndPoint *l, EndPoint *r){ return l->distance_out < r->distance_out; }); queue.reserve(end_points.size() * 2); @@ -1150,7 +1150,7 @@ static inline void improve_ordering_by_segment_flipping(Polylines &polylines, bo #endif /* NDEBUG */ // Initialize a MutablePriorityHeap of connections between polylines. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](Connection *connection, size_t idx){ connection->heap_idx = idx; }, // Sort by decreasing connection distance. [&polylines, &connections](Connection *l, Connection *r){ return l->squaredNorm(polylines, connections) > r->squaredNorm(polylines, connections); });