Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Continue replacing old partial object API with new one #1430

Merged
merged 15 commits into from
Dec 8, 2022
15 changes: 15 additions & 0 deletions crates/fj-interop/src/ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ pub trait ArrayExt<T, const N: usize> {
/// <https://doc.rust-lang.org/std/primitive.array.html#method.each_ref>
fn each_ref_ext(&self) -> [&T; N];

/// Stable replacement for `each_mut`
///
/// <https://doc.rust-lang.org/std/primitive.array.html#method.each_mut>
fn each_mut_ext(&mut self) -> [&mut T; N];

/// Stable replacement for `try_map`
///
/// <https://doc.rust-lang.org/std/primitive.array.html#method.try_map>
Expand All @@ -26,6 +31,11 @@ impl<T> ArrayExt<T, 2> for [T; 2] {
[a, b]
}

fn each_mut_ext(&mut self) -> [&mut T; 2] {
let [a, b] = self;
[a, b]
}

fn try_map_ext<F, U, E>(self, f: F) -> Result<[U; 2], E>
where
F: FnMut(T) -> Result<U, E>,
Expand All @@ -47,6 +57,11 @@ impl<T> ArrayExt<T, 4> for [T; 4] {
[a, b, c, d]
}

fn each_mut_ext(&mut self) -> [&mut T; 4] {
let [a, b, c, d] = self;
[a, b, c, d]
}

fn try_map_ext<F, U, E>(self, f: F) -> Result<[U; 4], E>
where
F: FnMut(T) -> Result<U, E>,
Expand Down
127 changes: 106 additions & 21 deletions crates/fj-kernel/src/algorithms/intersect/curve_edge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,16 @@ impl CurveEdgeIntersection {

#[cfg(test)]
mod tests {
use std::array;

use fj_interop::ext::ArrayExt;
use fj_math::Point;

use crate::{
builder::{CurveBuilder, HalfEdgeBuilder},
objects::HalfEdge,
partial::HasPartial,
partial2::{Partial, PartialCurve, PartialObject},
objects::Vertex,
partial::PartialHalfEdge,
partial2::{Partial, PartialCurve, PartialGlobalEdge, PartialObject},
services::Services,
};

Expand All @@ -97,9 +100,31 @@ mod tests {
};
curve.update_as_u_axis();
let curve = curve.build(&mut services.objects);
let half_edge = HalfEdge::partial()
.update_as_line_segment_from_points(surface, [[1., -1.], [1., 1.]])
.build(&mut services.objects);
let half_edge = {
let vertices = array::from_fn(|_| Partial::<Vertex>::new());
let global_curve = {
let [vertex, _] = &vertices;
vertex.read().curve.read().global_form.clone()
};
let global_vertices = vertices.each_ref_ext().map(|vertex| {
vertex.read().surface_form.read().global_form.clone()
});

let half_edge = PartialHalfEdge {
vertices,
global_form: Partial::from_partial(PartialGlobalEdge {
curve: global_curve,
vertices: global_vertices,
}),
};

half_edge
.update_as_line_segment_from_points(
surface,
[[1., -1.], [1., 1.]],
)
.build(&mut services.objects)
};

let intersection = CurveEdgeIntersection::compute(&curve, &half_edge);

Expand All @@ -124,12 +149,31 @@ mod tests {
};
curve.update_as_u_axis();
let curve = curve.build(&mut services.objects);
let half_edge = HalfEdge::partial()
.update_as_line_segment_from_points(
surface,
[[-1., -1.], [-1., 1.]],
)
.build(&mut services.objects);
let half_edge = {
let vertices = array::from_fn(|_| Partial::<Vertex>::new());
let global_curve = {
let [vertex, _] = &vertices;
vertex.read().curve.read().global_form.clone()
};
let global_vertices = vertices.each_ref_ext().map(|vertex| {
vertex.read().surface_form.read().global_form.clone()
});

let half_edge = PartialHalfEdge {
vertices,
global_form: Partial::from_partial(PartialGlobalEdge {
curve: global_curve,
vertices: global_vertices,
}),
};

half_edge
.update_as_line_segment_from_points(
surface,
[[-1., -1.], [-1., 1.]],
)
.build(&mut services.objects)
};

let intersection = CurveEdgeIntersection::compute(&curve, &half_edge);

Expand All @@ -154,12 +198,31 @@ mod tests {
};
curve.update_as_u_axis();
let curve = curve.build(&mut services.objects);
let half_edge = HalfEdge::partial()
.update_as_line_segment_from_points(
surface,
[[-1., -1.], [1., -1.]],
)
.build(&mut services.objects);
let half_edge = {
let vertices = array::from_fn(|_| Partial::<Vertex>::new());
let global_curve = {
let [vertex, _] = &vertices;
vertex.read().curve.read().global_form.clone()
};
let global_vertices = vertices.each_ref_ext().map(|vertex| {
vertex.read().surface_form.read().global_form.clone()
});

let half_edge = PartialHalfEdge {
vertices,
global_form: Partial::from_partial(PartialGlobalEdge {
curve: global_curve,
vertices: global_vertices,
}),
};

half_edge
.update_as_line_segment_from_points(
surface,
[[-1., -1.], [1., -1.]],
)
.build(&mut services.objects)
};

let intersection = CurveEdgeIntersection::compute(&curve, &half_edge);

Expand All @@ -179,9 +242,31 @@ mod tests {
};
curve.update_as_u_axis();
let curve = curve.build(&mut services.objects);
let half_edge = HalfEdge::partial()
.update_as_line_segment_from_points(surface, [[-1., 0.], [1., 0.]])
.build(&mut services.objects);
let half_edge = {
let vertices = array::from_fn(|_| Partial::<Vertex>::new());
let global_curve = {
let [vertex, _] = &vertices;
vertex.read().curve.read().global_form.clone()
};
let global_vertices = vertices.each_ref_ext().map(|vertex| {
vertex.read().surface_form.read().global_form.clone()
});

let half_edge = PartialHalfEdge {
vertices,
global_form: Partial::from_partial(PartialGlobalEdge {
curve: global_curve,
vertices: global_vertices,
}),
};

half_edge
.update_as_line_segment_from_points(
surface,
[[-1., 0.], [1., 0.]],
)
.build(&mut services.objects)
};

let intersection = CurveEdgeIntersection::compute(&curve, &half_edge);

Expand Down
Loading