Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved > Class Template Reference

#include <src/libslic3r/MutablePriorityQueue.hpp>

Public Types

using iterator = typename std::vector< T >::iterator
 
using const_iterator = typename std::vector< T >::const_iterator
 

Public Member Functions

 MutablePriorityQueue (IndexSetter &&index_setter, LessPredicate &&less_predicate)
 
 ~MutablePriorityQueue ()
 
 MutablePriorityQueue (MutablePriorityQueue &&)=default
 
MutablePriorityQueueoperator= (MutablePriorityQueue &&)=default
 
 MutablePriorityQueue (const MutablePriorityQueue &)=delete
 
MutablePriorityQueueoperator= (const MutablePriorityQueue &)=delete
 
void clear ()
 
void reserve (size_t cnt)
 
void push (const T &item)
 
void push (T &&item)
 
void pop ()
 
T & top ()
 
void remove (size_t idx)
 
void update (size_t idx)
 
size_t size () const
 
bool empty () const
 
T & operator[] (std::size_t idx) noexcept
 
const T & operator[] (std::size_t idx) const noexcept
 
iterator begin ()
 
iterator end ()
 
const_iterator cbegin () const
 
const_iterator cend () const
 

Static Public Member Functions

static constexpr size_t invalid_id ()
 

Protected Member Functions

void update_heap_up (size_t top, size_t bottom)
 
void update_heap_down (size_t top, size_t bottom)
 

Private Attributes

std::vector< T > m_heap
 
IndexSetter m_index_setter
 
LessPredicate m_less_predicate
 

Detailed Description

template<typename T, typename IndexSetter, typename LessPredicate, const bool ResetIndexWhenRemoved = false>
class Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >

Member Typedef Documentation

◆ const_iterator

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
using Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::const_iterator = typename std::vector<T>::const_iterator

◆ iterator

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
using Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::iterator = typename std::vector<T>::iterator

Constructor & Destructor Documentation

◆ MutablePriorityQueue() [1/3]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::MutablePriorityQueue ( IndexSetter &&  index_setter,
LessPredicate &&  less_predicate 
)
inline
21 :
22 m_index_setter(std::forward<IndexSetter>(index_setter)),
23 m_less_predicate(std::forward<LessPredicate>(less_predicate))
24 {}
IndexSetter m_index_setter
Definition MutablePriorityQueue.hpp:63
LessPredicate m_less_predicate
Definition MutablePriorityQueue.hpp:64

◆ ~MutablePriorityQueue()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::~MutablePriorityQueue ( )
inline
25{ clear(); }
void clear()
Definition MutablePriorityQueue.hpp:75

References Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::clear().

+ Here is the call graph for this function:

◆ MutablePriorityQueue() [2/3]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::MutablePriorityQueue ( MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved > &&  )
default

◆ MutablePriorityQueue() [3/3]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::MutablePriorityQueue ( const MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved > &  )
delete

Member Function Documentation

◆ begin()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
iterator Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::begin ( )
inline
52{ return m_heap.begin(); }
std::vector< T > m_heap
Definition MutablePriorityQueue.hpp:62

References Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::m_heap.

◆ cbegin()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
const_iterator Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::cbegin ( ) const
inline

◆ cend()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
const_iterator Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::cend ( ) const
inline

◆ clear()

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::clear
inline
76{
77 if constexpr (ResetIndexWhenRemoved) {
78 for (size_t idx = 0; idx < m_heap.size(); ++ idx)
79 // Mark as removed from the queue.
80 m_index_setter(m_heap[idx], this->invalid_id());
81 }
82 m_heap.clear();
83}
static constexpr size_t invalid_id()
Definition MutablePriorityQueue.hpp:48

Referenced by Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::~MutablePriorityQueue().

+ Here is the caller graph for this function:

◆ empty()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
bool Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::empty ( ) const
inline

◆ end()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
iterator Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::end ( )
inline

◆ invalid_id()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
static constexpr size_t Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::invalid_id ( )
inlinestaticconstexpr
48{ return InvalidQueueID; }
constexpr auto InvalidQueueID
Definition MutablePriorityQueue.hpp:12

References Slic3r::InvalidQueueID.

◆ operator=() [1/2]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
MutablePriorityQueue & Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::operator= ( const MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved > &  )
delete

◆ operator=() [2/2]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
MutablePriorityQueue & Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::operator= ( MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved > &&  )
default

◆ operator[]() [1/2]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
const T & Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::operator[] ( std::size_t  idx) const
inlinenoexcept

◆ operator[]() [2/2]

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
T & Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::operator[] ( std::size_t  idx)
inlinenoexcept

◆ pop()

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::pop
inline
105{
106 assert(! m_heap.empty());
107 if constexpr (ResetIndexWhenRemoved) {
108 // Mark as removed from the queue.
109 m_index_setter(m_heap.front(), this->invalid_id());
110 }
111 if (m_heap.size() > 1) {
112 m_heap.front() = m_heap.back();
113 m_heap.pop_back();
114 m_index_setter(m_heap.front(), 0);
115 update_heap_down(0, m_heap.size() - 1);
116 } else
117 m_heap.clear();
118}
void update_heap_down(size_t top, size_t bottom)
Definition MutablePriorityQueue.hpp:165

◆ push() [1/2]

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::push ( const T &  item)
inline
87{
88 size_t idx = m_heap.size();
89 m_heap.emplace_back(item);
90 m_index_setter(m_heap.back(), idx);
91 update_heap_up(0, idx);
92}
void update_heap_up(size_t top, size_t bottom)
Definition MutablePriorityQueue.hpp:141

Referenced by Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::update().

+ Here is the caller graph for this function:

◆ push() [2/2]

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::push ( T &&  item)
inline
96{
97 size_t idx = m_heap.size();
98 m_heap.emplace_back(std::move(item));
99 m_index_setter(m_heap.back(), idx);
100 update_heap_up(0, idx);
101}

◆ remove()

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::remove ( size_t  idx)
inline
122{
123 assert(idx < m_heap.size());
124 // Only mark as removed from the queue in release mode, if configured so.
125 if constexpr (ResetIndexWhenRemoved) {
126 // Mark as removed from the queue.
127 m_index_setter(m_heap[idx], this->invalid_id());
128 }
129 if (idx + 1 == m_heap.size()) {
130 m_heap.pop_back();
131 return;
132 }
133 m_heap[idx] = m_heap.back();
134 m_index_setter(m_heap[idx], idx);
135 m_heap.pop_back();
136 update_heap_down(idx, m_heap.size() - 1);
137 update_heap_up(0, idx);
138}

Referenced by Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::update().

+ Here is the caller graph for this function:

◆ reserve()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
void Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::reserve ( size_t  cnt)
inline

◆ size()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
size_t Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::size ( ) const
inline

◆ top()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
T & Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::top ( )
inline

◆ update()

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
void Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::update ( size_t  idx)
inline
42{ T item = m_heap[idx]; remove(idx); push(item); }
void push(const T &item)
Definition MutablePriorityQueue.hpp:86
void remove(size_t idx)
Definition MutablePriorityQueue.hpp:121

References Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::m_heap, Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::push(), and Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::remove().

+ Here is the call graph for this function:

◆ update_heap_down()

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::update_heap_down ( size_t  top,
size_t  bottom 
)
inlineprotected
166{
167 size_t parentIdx = top;
168 T *parent = &m_heap[parentIdx];
169 for (;;) {
170 size_t childIdx = (parentIdx << 1) + 1;
171 if (childIdx > bottom)
172 break;
173 T *child = &m_heap[childIdx];
174 size_t child2Idx = childIdx + 1;
175 if (child2Idx <= bottom) {
176 T *child2 = &m_heap[child2Idx];
177 if (! m_less_predicate(*child, *child2)) {
178 child = child2;
179 childIdx = child2Idx;
180 }
181 }
182 if (m_less_predicate(*parent, *child))
183 return;
184 // switch nodes
185 T tmp = *parent;
186 m_index_setter(tmp, childIdx);
187 m_index_setter(*child, parentIdx);
188 m_heap[parentIdx] = *child;
189 m_heap[childIdx] = tmp;
190 // shift down
191 parentIdx = childIdx;
192 parent = child;
193 }
194}
T & top()
Definition MutablePriorityQueue.hpp:40

◆ update_heap_up()

template<class T , class LessPredicate , class IndexSetter , const bool ResetIndexWhenRemoved>
void Slic3r::MutablePriorityQueue< T, LessPredicate, IndexSetter, ResetIndexWhenRemoved >::update_heap_up ( size_t  top,
size_t  bottom 
)
inlineprotected
142{
143 size_t childIdx = bottom;
144 T *child = &m_heap[childIdx];
145 for (;;) {
146 size_t parentIdx = (childIdx - 1) >> 1;
147 if (childIdx == 0 || parentIdx < top)
148 break;
149 T *parent = &m_heap[parentIdx];
150 // switch nodes
151 if (! m_less_predicate(*parent, *child)) {
152 T tmp = *parent;
153 m_index_setter(tmp, childIdx);
154 m_index_setter(*child, parentIdx);
155 m_heap[parentIdx] = *child;
156 m_heap[childIdx] = tmp;
157 }
158 // shift up
159 childIdx = parentIdx;
160 child = parent;
161 }
162}

Member Data Documentation

◆ m_heap

◆ m_index_setter

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
IndexSetter Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::m_index_setter
private

◆ m_less_predicate

template<typename T , typename IndexSetter , typename LessPredicate , const bool ResetIndexWhenRemoved = false>
LessPredicate Slic3r::MutablePriorityQueue< T, IndexSetter, LessPredicate, ResetIndexWhenRemoved >::m_less_predicate
private

The documentation for this class was generated from the following file: