diff --git a/src/libslic3r/MutablePriorityQueue.hpp b/src/libslic3r/MutablePriorityQueue.hpp index e34e03080..68cd01859 100644 --- a/src/libslic3r/MutablePriorityQueue.hpp +++ b/src/libslic3r/MutablePriorityQueue.hpp @@ -2,11 +2,14 @@ #define slic3r_MutablePriorityQueue_hpp_ #include +#include template class MutablePriorityQueue { public: + static_assert(std::is_trivially_copyable::value, "Template argument T must be a trivially copiable type in class template MutablePriorityQueue"); + // It is recommended to use make_mutable_priority_queue() for construction. MutablePriorityQueue(IndexSetter &&index_setter, LessPredicate &&less_predicate) : m_index_setter(std::forward(index_setter)), @@ -25,6 +28,8 @@ public: size_t size() const { return m_heap.size(); } bool empty() const { return m_heap.empty(); } + T& operator[](std::size_t idx) noexcept { return m_heap[idx]; } + const T& operator[](std::size_t idx) const noexcept { return m_heap[idx]; } using iterator = typename std::vector::iterator; using const_iterator = typename std::vector::const_iterator; @@ -251,6 +256,7 @@ template::value, "Template argument T must be a trivially copiable type in class template MutableSkipHeapPriorityQueue"); using address = SkipHeapAddressing; // It is recommended to use make_miniheap_mutable_priority_queue() for construction. @@ -272,6 +278,8 @@ public: // There is one padding element storead at each miniheap, thus lower the number of elements by the number of miniheaps. size_t size() const noexcept { return m_heap.size() - (m_heap.size() + address::block_size - 1) / address::block_size; } bool empty() const { return m_heap.empty(); } + T& operator[](std::size_t idx) noexcept { assert(! address::is_padding(idx)); return m_heap[idx]; } + const T& operator[](std::size_t idx) const noexcept { assert(! address::is_padding(idx)); return m_heap[idx]; } protected: void update_heap_up(size_t top, size_t bottom);