Skip to main content

register_polygon

Macro register_polygon 

Source
macro_rules! register_polygon {
    (
        $Ty:ty,
        $Point:ty,
        ring = $Ring:ty,
        |$s:ident| outer = $outer:expr, inners = $inners:expr $(,)?
    ) => { ... };
}
Expand description

Register a user-owned polygon type whose interior decomposes as { outer: $Ring, inners: <iterable of $Ring> }.

Emits impl Geometry for $Ty with Kind = PolygonTag and Point = $Point, plus impl Polygon for $Ty with the supplied $Ring as the associated Ring type. The outer = … expression must produce &$Ring; the inners = … expression must produce impl ExactSizeIterator<Item = &$Ring> — the bound geometry_trait::Polygon::interiors requires.

Mirrors the five-trait pattern in doc/example_adapting_a_legacy_geometry_object_model.qbk (tag, ring_const_type, interior_const_type, exterior_ring, interior_rings) — Boost.Geometry has no register/polygon.hpp, so this macro is the equivalent shortcut on the Rust side.

§Example

use geometry_adapt::{register_polygon, register_ring};
use geometry_cs::Cartesian;
use geometry_model::Point2D;
use geometry_trait::{Polygon, Ring};

type P = Point2D<f64, Cartesian>;

struct MyRing { points: Vec<P> }
register_ring!(MyRing, P, |s| s.points.iter());

struct MyPoly { outer: MyRing, inners: Vec<MyRing> }
register_polygon!(
    MyPoly,
    P,
    ring = MyRing,
    |s| outer = &s.outer, inners = s.inners.iter()
);

let poly = MyPoly {
    outer: MyRing { points: vec![] },
    inners: vec![],
};
assert_eq!(poly.exterior().points().count(), 0);
assert_eq!(poly.interiors().count(), 0);