Skip to content

Commit ae31873

Browse files
authored
Merge pull request #1 from Robzz/fix/broken-tests
fix: fix broken tests and update thiserror dependency
2 parents 4179242 + 23a1151 commit ae31873

File tree

4 files changed

+36
-10
lines changed

4 files changed

+36
-10
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ members = ["./recast-sys"]
1616
[dependencies]
1717
cxx = "1.0"
1818
recast-sys = { path = "./recast-sys", default-features = false }
19-
thiserror = "1.0"
19+
thiserror = "2.0"

src/lib.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ pub mod recast;
66

77
mod macros;
88

9+
use std::ptr::NonNull;
10+
911
#[cfg(feature = "detour")]
1012
use detour::Error as DetourError;
1113
#[cfg(feature = "recast")]
@@ -34,3 +36,21 @@ where
3436
}
3537
Ok(ptr)
3638
}
39+
40+
fn slice_from_raw_parts_or_dangling<'a, T>(data: *const T, len: usize) -> &'a [T] {
41+
if data.is_null() {
42+
unsafe { std::slice::from_raw_parts(NonNull::dangling().as_ptr(), 0usize) }
43+
}
44+
else {
45+
unsafe { std::slice::from_raw_parts(data, len) }
46+
}
47+
}
48+
49+
fn slice_from_raw_parts_mut_or_dangling<'a, T>(data: *mut T, len: usize) -> &'a mut [T] {
50+
if data.is_null() {
51+
unsafe { std::slice::from_raw_parts_mut(NonNull::dangling().as_ptr(), 0usize) }
52+
}
53+
else {
54+
unsafe { std::slice::from_raw_parts_mut(data, len) }
55+
}
56+
}

src/recast/poly_mesh.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,48 @@
1+
use std::ptr::{self, NonNull};
2+
13
#[cfg(feature = "detour")]
24
use recast_sys::ffi::detour::NavMeshCreateParams;
35

6+
use crate::{slice_from_raw_parts_mut_or_dangling, slice_from_raw_parts_or_dangling};
7+
48
use super::PolyMesh;
59

610
impl PolyMesh {
711
pub fn vertices(&self) -> &[u16] {
812
let vertices_buffer = recast_sys::ffi::recast::poly_mesh_get_vertices(self.as_ref());
913
let n_vertices = recast_sys::ffi::recast::poly_mesh_get_vertex_count(self.as_ref());
10-
unsafe { std::slice::from_raw_parts(vertices_buffer, (n_vertices * 3) as usize) }
14+
slice_from_raw_parts_or_dangling(vertices_buffer, (n_vertices * 3) as usize)
1115
}
1216

1317
pub fn polygons(&self) -> &[u16] {
1418
let polygons_buffer = recast_sys::ffi::recast::poly_mesh_get_polys(self.as_ref());
1519
let n_polys = recast_sys::ffi::recast::poly_mesh_get_poly_count(self.as_ref());
1620
let n_vpp = recast_sys::ffi::recast::poly_mesh_max_vertex_count_per_poly(self.as_ref());
17-
unsafe { std::slice::from_raw_parts(polygons_buffer, (n_polys * 2 * n_vpp) as usize) }
21+
slice_from_raw_parts_or_dangling(polygons_buffer, (n_polys * 2 * n_vpp) as usize)
1822
}
1923

2024
pub fn regions(&self) -> &[u16] {
2125
let regions_buffer = recast_sys::ffi::recast::poly_mesh_get_regions(self.as_ref());
2226
let n_polys = recast_sys::ffi::recast::poly_mesh_get_poly_count(self.as_ref());
23-
unsafe { std::slice::from_raw_parts(regions_buffer, n_polys as usize) }
27+
slice_from_raw_parts_or_dangling(regions_buffer, n_polys as usize)
2428
}
2529

2630
pub fn flags(&self) -> &[u16] {
2731
let flags_buffer = recast_sys::ffi::recast::poly_mesh_get_flags(self.as_ref());
2832
let n_polys = recast_sys::ffi::recast::poly_mesh_get_poly_count(self.as_ref());
29-
unsafe { std::slice::from_raw_parts(flags_buffer, n_polys as usize) }
33+
slice_from_raw_parts_or_dangling(flags_buffer, n_polys as usize)
3034
}
3135

3236
pub fn flags_mut(&mut self) -> &mut [u16] {
3337
let flags_buffer = recast_sys::ffi::recast::poly_mesh_get_flags_mut(self.pin_mut());
3438
let n_polys = recast_sys::ffi::recast::poly_mesh_get_poly_count(self.as_ref());
35-
unsafe { std::slice::from_raw_parts_mut(flags_buffer, n_polys as usize) }
39+
slice_from_raw_parts_mut_or_dangling(flags_buffer, n_polys as usize)
3640
}
3741

3842
pub fn areas(&self) -> &[u8] {
3943
let areas_buffer = recast_sys::ffi::recast::poly_mesh_get_areas(self.as_ref());
4044
let n_polys = recast_sys::ffi::recast::poly_mesh_get_poly_count(self.as_ref());
41-
unsafe { std::slice::from_raw_parts(areas_buffer, n_polys as usize) }
45+
slice_from_raw_parts_or_dangling(areas_buffer, n_polys as usize)
4246
}
4347
}
4448

src/recast/poly_mesh_detail.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1+
use crate::slice_from_raw_parts_or_dangling;
2+
13
impl super::PolyMeshDetail {
24
pub fn meshes(&self) -> &[u32] {
35
let meshes_buffer = recast_sys::ffi::recast::poly_mesh_detail_meshes(self.as_ref());
46
let n_meshes = recast_sys::ffi::recast::poly_mesh_detail_num_meshes(self.as_ref());
5-
unsafe { std::slice::from_raw_parts(meshes_buffer, (n_meshes * 4) as usize) }
7+
slice_from_raw_parts_or_dangling(meshes_buffer, (n_meshes * 4) as usize)
68
}
79

810
pub fn vertices(&self) -> &[f32] {
911
let vertices_buffer = recast_sys::ffi::recast::poly_mesh_detail_vertices(self.as_ref());
1012
let n_vertices = recast_sys::ffi::recast::poly_mesh_detail_num_vertices(self.as_ref());
11-
unsafe { std::slice::from_raw_parts(vertices_buffer, (n_vertices * 3) as usize) }
13+
slice_from_raw_parts_or_dangling(vertices_buffer, (n_vertices * 3) as usize)
1214
}
1315

1416
pub fn triangles(&self) -> &[u8] {
1517
let triangles_buffer = recast_sys::ffi::recast::poly_mesh_detail_triangles(self.as_ref());
1618
let n_triangles = recast_sys::ffi::recast::poly_mesh_detail_num_triangles(self.as_ref());
17-
unsafe { std::slice::from_raw_parts(triangles_buffer, (n_triangles * 4) as usize) }
19+
slice_from_raw_parts_or_dangling(triangles_buffer, (n_triangles * 4) as usize)
1820
}
1921
}
2022

0 commit comments

Comments
 (0)