@@ -50,24 +50,23 @@ namespace omath::collision
5050 [[nodiscard]]
5151 static std::optional<Result> solve (const ColliderInterfaceType& a, const ColliderInterfaceType& b,
5252 const Simplex<VectorType>& simplex, const Params params = {},
53- std::shared_ptr<std::pmr::memory_resource> mem_resource = {
54- std::shared_ptr<void >{}, std::pmr::get_default_resource ()})
53+ std::pmr::memory_resource& mem_resource = *std::pmr::get_default_resource ())
5554 {
5655 // --- Build initial polytope from simplex (4 points) ---
57- std::pmr::vector<VectorType> vertexes{mem_resource. get () };
56+ std::pmr::vector<VectorType> vertexes{& mem_resource};
5857 vertexes.reserve (simplex.size ());
5958 for (std::size_t i = 0 ; i < simplex.size (); ++i)
6059 vertexes.emplace_back (simplex[i]);
6160
6261 // Initial tetra faces (windings corrected in make_face)
63- std::pmr::vector<Face> faces{mem_resource. get () };
62+ std::pmr::vector<Face> faces{& mem_resource};
6463 faces.reserve (4 );
6564 faces.emplace_back (make_face (vertexes, 0 , 1 , 2 ));
6665 faces.emplace_back (make_face (vertexes, 0 , 2 , 3 ));
6766 faces.emplace_back (make_face (vertexes, 0 , 3 , 1 ));
6867 faces.emplace_back (make_face (vertexes, 1 , 3 , 2 ));
6968
70- auto heap = rebuild_heap (faces);
69+ auto heap = rebuild_heap (faces, mem_resource );
7170
7271 Result out{};
7372
@@ -80,7 +79,7 @@ namespace omath::collision
8079 // (We could keep face handles; this is fine for small Ns.)
8180
8281 if (const auto top = heap.top (); faces[top.idx ].d != top.d )
83- heap = rebuild_heap (faces);
82+ heap = rebuild_heap (faces, mem_resource );
8483
8584 if (heap.empty ())
8685 break ;
@@ -110,8 +109,8 @@ namespace omath::collision
110109 vertexes.emplace_back (p);
111110
112111 // Mark faces visible from p and collect their horizon
113- std::pmr::vector<bool > to_delete (faces.size (), false , mem_resource. get () ); // uses single bits
114- std::pmr::vector<Edge> boundary{mem_resource. get () };
112+ std::pmr::vector<bool > to_delete (faces.size (), false , & mem_resource); // uses single bits
113+ std::pmr::vector<Edge> boundary{& mem_resource};
115114 boundary.reserve (faces.size () * 2 );
116115
117116 for (int i = 0 ; i < static_cast <int >(faces.size ()); ++i)
@@ -129,7 +128,7 @@ namespace omath::collision
129128 }
130129
131130 // Remove visible faces
132- std::pmr::vector<Face> new_faces{mem_resource. get () };
131+ std::pmr::vector<Face> new_faces{& mem_resource};
133132 new_faces.reserve (faces.size () + boundary.size ());
134133 for (int i = 0 ; i < static_cast <int >(faces.size ()); ++i)
135134 if (!to_delete[i])
@@ -141,7 +140,7 @@ namespace omath::collision
141140 faces.emplace_back (make_face (vertexes, e.a , e.b , new_idx));
142141
143142 // Rebuild heap after topology change
144- heap = rebuild_heap (faces);
143+ heap = rebuild_heap (faces, mem_resource );
145144
146145 if (!std::isfinite (vertexes.back ().dot (vertexes.back ())))
147146 break ; // safety
@@ -193,15 +192,21 @@ namespace omath::collision
193192 return lhs.d > rhs.d ; // min-heap by distance
194193 }
195194 };
196- using Heap = std::priority_queue<HeapItem, std::vector<HeapItem>, HeapCmp>;
195+
196+ using Heap = std::priority_queue<HeapItem, std::pmr::vector<HeapItem>, HeapCmp>;
197197
198198 [[nodiscard]]
199- static Heap rebuild_heap (const std::pmr::vector<Face>& faces)
199+ static Heap rebuild_heap (const std::pmr::vector<Face>& faces, auto & memory_resource )
200200 {
201- Heap h;
201+ std::pmr::vector<HeapItem> storage{ &memory_resource };
202+ storage.reserve (faces.size ()); // optional but recommended
203+
204+ Heap h{ HeapCmp{}, std::move (storage) };
205+
202206 for (int i = 0 ; i < static_cast <int >(faces.size ()); ++i)
203207 h.emplace (faces[i].d , i);
204- return h;
208+
209+ return h; // allocator is preserved
205210 }
206211
207212 [[nodiscard]]
0 commit comments