Skip to content

Commit 60a3a42

Browse files
committed
improved pmr stuff
1 parent 17e21cd commit 60a3a42

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

include/omath/collision/epa_algorithm.hpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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]]

tests/general/unit_test_epa.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ TEST(UnitTestEpa, TestCollisionTrue)
4545
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
4646
params.max_iterations = 64;
4747
params.tolerance = 1e-4f;
48-
auto epa = EPA::solve(A, B, gjk.simplex, params, pool);
48+
auto epa = EPA::solve(A, B, gjk.simplex, params, *pool);
4949
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
5050

5151
// Normal is unit
@@ -119,7 +119,7 @@ TEST(UnitTestEpa, TestCollisionTrue2)
119119
params.max_iterations = 64;
120120
params.tolerance = 1e-4f;
121121
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
122-
auto epa = EPA::solve(A, B, gjk.simplex, params, pool);
122+
auto epa = EPA::solve(A, B, gjk.simplex, params, *pool);
123123
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
124124

125125
// Normal is unit-length

0 commit comments

Comments
 (0)