i_overlay 7.0.2

Boolean Operations for 2D Polygons: Supports intersection, union, difference, xor, and self-intersections for all polygon varieties.
Documentation
use crate::core::extract::VisitState;
use crate::core::overlay_rule::OverlayRule;
use crate::geom::id_point::IdPoint;
use crate::segm::segment::SegmentFill;
use alloc::vec::Vec;
use i_float::int::number::int::IntNumber;

#[derive(Clone)]
pub(crate) struct OverlayLink<I: IntNumber, D = ()> {
    pub(crate) a: IdPoint<I>,
    pub(crate) b: IdPoint<I>,
    pub(crate) fill: SegmentFill,
    pub(crate) data: D,
}

impl<I: IntNumber, D> OverlayLink<I, D> {
    #[inline(always)]
    pub(crate) fn new_with_data(
        a: IdPoint<I>,
        b: IdPoint<I>,
        fill: SegmentFill,
        data: D,
    ) -> OverlayLink<I, D> {
        OverlayLink { a, b, fill, data }
    }

    #[inline(always)]
    pub(crate) fn other(&self, node_id: usize) -> IdPoint<I> {
        if self.a.id == node_id { self.b } else { self.a }
    }

    #[inline(always)]
    pub(crate) fn is_direct(&self) -> bool {
        self.a.point < self.b.point
    }
}

pub(crate) trait OverlayLinkFilter {
    fn filter_by_overlay_into(&self, overlay_rule: OverlayRule, buffer: &mut Vec<VisitState>);
}