mirror of https://github.com/hannobraun/Fornjot
Merge pull request #1336 from hannobraun/array
Use `iter_fixed` to zip arrays
This commit is contained in:
commit
5fa380673d
|
@ -1187,6 +1187,7 @@ dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"fj-interop",
|
"fj-interop",
|
||||||
"fj-math",
|
"fj-math",
|
||||||
|
"iter_fixed",
|
||||||
"itertools",
|
"itertools",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
|
@ -1836,6 +1837,12 @@ version = "2.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745"
|
checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iter_fixed"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4d1d13810ef04ff22d946a8445d1e0016c9e98dbb6deeeb2af061e753060737c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.5"
|
version = "0.10.5"
|
||||||
|
|
|
@ -13,11 +13,6 @@ pub trait ArrayExt<T, const N: usize> {
|
||||||
fn try_map_ext<F, U, E>(self, f: F) -> Result<[U; N], E>
|
fn try_map_ext<F, U, E>(self, f: F) -> Result<[U; N], E>
|
||||||
where
|
where
|
||||||
F: FnMut(T) -> Result<U, E>;
|
F: FnMut(T) -> Result<U, E>;
|
||||||
|
|
||||||
/// Stable replacement for `zip`
|
|
||||||
///
|
|
||||||
/// <https://doc.rust-lang.org/std/primitive.array.html#method.zip>
|
|
||||||
fn zip_ext<U>(self, rhs: [U; N]) -> [(T, U); N];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> ArrayExt<T, 2> for [T; 2] {
|
impl<T> ArrayExt<T, 2> for [T; 2] {
|
||||||
|
@ -33,13 +28,6 @@ impl<T> ArrayExt<T, 2> for [T; 2] {
|
||||||
let [a, b] = self.map(f);
|
let [a, b] = self.map(f);
|
||||||
Ok([a?, b?])
|
Ok([a?, b?])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn zip_ext<U>(self, rhs: [U; 2]) -> [(T, U); 2] {
|
|
||||||
let [a, b] = self;
|
|
||||||
let [c, d] = rhs;
|
|
||||||
|
|
||||||
[(a, c), (b, d)]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> ArrayExt<T, 4> for [T; 4] {
|
impl<T> ArrayExt<T, 4> for [T; 4] {
|
||||||
|
@ -55,13 +43,6 @@ impl<T> ArrayExt<T, 4> for [T; 4] {
|
||||||
let [a, b, c, d] = self.map(f);
|
let [a, b, c, d] = self.map(f);
|
||||||
Ok([a?, b?, c?, d?])
|
Ok([a?, b?, c?, d?])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn zip_ext<U>(self, rhs: [U; 4]) -> [(T, U); 4] {
|
|
||||||
let [a, b, c, d] = self;
|
|
||||||
let [e, f, g, h] = rhs;
|
|
||||||
|
|
||||||
[(a, e), (b, f), (c, g), (d, h)]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extension trait for arrays
|
/// Extension trait for arrays
|
||||||
|
|
|
@ -13,6 +13,7 @@ categories.workspace = true
|
||||||
[dependencies]
|
[dependencies]
|
||||||
fj-interop.workspace = true
|
fj-interop.workspace = true
|
||||||
fj-math.workspace = true
|
fj-math.workspace = true
|
||||||
|
iter_fixed = "0.3.1"
|
||||||
itertools = "0.10.5"
|
itertools = "0.10.5"
|
||||||
parking_lot = "0.12.0"
|
parking_lot = "0.12.0"
|
||||||
pretty_assertions = "1.3.0"
|
pretty_assertions = "1.3.0"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use fj_interop::ext::ArrayExt;
|
use fj_interop::ext::ArrayExt;
|
||||||
|
use iter_fixed::IntoIteratorFixed;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
objects::{Curve, Face, Objects},
|
objects::{Curve, Face, Objects},
|
||||||
|
@ -41,8 +42,10 @@ impl FaceFaceIntersection {
|
||||||
|
|
||||||
let curve_face_intersections = intersection_curves
|
let curve_face_intersections = intersection_curves
|
||||||
.each_ref_ext()
|
.each_ref_ext()
|
||||||
.zip_ext(faces)
|
.into_iter_fixed()
|
||||||
.map(|(curve, face)| CurveFaceIntersection::compute(curve, face));
|
.zip(faces)
|
||||||
|
.map(|(curve, face)| CurveFaceIntersection::compute(curve, face))
|
||||||
|
.collect::<[_; 2]>();
|
||||||
|
|
||||||
let intersection_intervals = {
|
let intersection_intervals = {
|
||||||
let [a, b] = curve_face_intersections;
|
let [a, b] = curve_face_intersections;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use fj_interop::{ext::ArrayExt, mesh::Color};
|
use fj_interop::{ext::ArrayExt, mesh::Color};
|
||||||
use fj_math::{Line, Scalar, Vector};
|
use fj_math::{Line, Scalar, Vector};
|
||||||
|
use iter_fixed::IntoIteratorFixed;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
algorithms::{reverse::Reverse, transform::TransformObject},
|
algorithms::{reverse::Reverse, transform::TransformObject},
|
||||||
|
@ -65,7 +66,9 @@ impl Sweep for (Handle<HalfEdge>, Color) {
|
||||||
|
|
||||||
vertices
|
vertices
|
||||||
.each_ref_ext()
|
.each_ref_ext()
|
||||||
.zip_ext(points_surface)
|
.into_iter_fixed()
|
||||||
|
.zip(points_surface)
|
||||||
|
.collect::<[_; 2]>()
|
||||||
.try_map_ext(
|
.try_map_ext(
|
||||||
|(vertex, point_surface)| -> Result<_, ValidationError> {
|
|(vertex, point_surface)| -> Result<_, ValidationError> {
|
||||||
let surface_vertex = objects.surface_vertices.insert(
|
let surface_vertex = objects.surface_vertices.insert(
|
||||||
|
@ -135,7 +138,9 @@ impl Sweep for (Handle<HalfEdge>, Color) {
|
||||||
|
|
||||||
let vertices = bottom_vertices
|
let vertices = bottom_vertices
|
||||||
.each_ref_ext()
|
.each_ref_ext()
|
||||||
.zip_ext(surface_vertices)
|
.into_iter_fixed()
|
||||||
|
.zip(surface_vertices)
|
||||||
|
.collect::<[_; 2]>()
|
||||||
.try_map_ext(|(vertex, surface_form)| {
|
.try_map_ext(|(vertex, surface_form)| {
|
||||||
objects.vertices.insert(Vertex::new(
|
objects.vertices.insert(Vertex::new(
|
||||||
vertex.position(),
|
vertex.position(),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use fj_interop::ext::ArrayExt;
|
|
||||||
use fj_math::{Point, Scalar};
|
use fj_math::{Point, Scalar};
|
||||||
|
use iter_fixed::IntoIteratorFixed;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
insert::Insert,
|
insert::Insert,
|
||||||
|
@ -187,7 +187,11 @@ impl HalfEdgeBuilder for PartialHalfEdge {
|
||||||
.unwrap_or([None, None])
|
.unwrap_or([None, None])
|
||||||
};
|
};
|
||||||
|
|
||||||
vertices.zip_ext(global_forms).map(|(vertex, global_form)| {
|
vertices
|
||||||
|
.into_iter_fixed()
|
||||||
|
.zip(global_forms)
|
||||||
|
.collect::<[_; 2]>()
|
||||||
|
.map(|(vertex, global_form)| {
|
||||||
vertex.update_partial(|vertex| {
|
vertex.update_partial(|vertex| {
|
||||||
vertex.clone().with_surface_form(
|
vertex.clone().with_surface_form(
|
||||||
vertex.surface_form().update_partial(
|
vertex.surface_form().update_partial(
|
||||||
|
|
|
@ -2,6 +2,7 @@ use std::array;
|
||||||
|
|
||||||
use fj_interop::ext::{ArrayExt, SliceExt};
|
use fj_interop::ext::{ArrayExt, SliceExt};
|
||||||
use fj_math::Scalar;
|
use fj_math::Scalar;
|
||||||
|
use iter_fixed::IntoIteratorFixed;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
algorithms::transform::TransformObject,
|
algorithms::transform::TransformObject,
|
||||||
|
@ -235,8 +236,11 @@ impl<'a> ShellBuilder<'a> {
|
||||||
let mut edges = top_edges.iter();
|
let mut edges = top_edges.iter();
|
||||||
let half_edges = array::from_fn(|_| edges.next().unwrap());
|
let half_edges = array::from_fn(|_| edges.next().unwrap());
|
||||||
|
|
||||||
let [a, b, c, d] =
|
let [a, b, c, d] = points
|
||||||
points.zip_ext(half_edges).map(|(point, edge)| {
|
.into_iter_fixed()
|
||||||
|
.zip(half_edges)
|
||||||
|
.collect::<[_; 4]>()
|
||||||
|
.map(|(point, edge)| {
|
||||||
let vertex = edge.back();
|
let vertex = edge.back();
|
||||||
|
|
||||||
SurfaceVertex::partial()
|
SurfaceVertex::partial()
|
||||||
|
@ -263,7 +267,9 @@ impl<'a> ShellBuilder<'a> {
|
||||||
let vertices = edge
|
let vertices = edge
|
||||||
.vertices()
|
.vertices()
|
||||||
.each_ref_ext()
|
.each_ref_ext()
|
||||||
.zip_ext(surface_vertices.clone())
|
.into_iter_fixed()
|
||||||
|
.zip(surface_vertices.clone())
|
||||||
|
.collect::<[_; 2]>()
|
||||||
.map(|(vertex, surface_form)| {
|
.map(|(vertex, surface_form)| {
|
||||||
Vertex::partial()
|
Vertex::partial()
|
||||||
.with_position(Some(vertex.position()))
|
.with_position(Some(vertex.position()))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use fj_interop::ext::ArrayExt;
|
use iter_fixed::IntoIteratorFixed;
|
||||||
|
|
||||||
use super::{HasPartial, MaybePartial};
|
use super::{HasPartial, MaybePartial};
|
||||||
|
|
||||||
|
@ -22,5 +22,8 @@ pub fn merge_arrays<T: HasPartial>(
|
||||||
a: [MaybePartial<T>; 2],
|
a: [MaybePartial<T>; 2],
|
||||||
b: [MaybePartial<T>; 2],
|
b: [MaybePartial<T>; 2],
|
||||||
) -> [MaybePartial<T>; 2] {
|
) -> [MaybePartial<T>; 2] {
|
||||||
a.zip_ext(b).map(|(a, b)| a.merge_with(b))
|
a.into_iter_fixed()
|
||||||
|
.zip(b)
|
||||||
|
.collect::<[_; 2]>()
|
||||||
|
.map(|(a, b)| a.merge_with(b))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue