Skip to main content

cel_euclid/
adam.rs

1//! Optional Adam registration uses the same concrete aliases as CEL.
2//!
3//! Every alias in Euclid 0.22.14 implements `Default`: coordinates, sizes,
4//! bounds and angles default to zero; transforms default to identity.
5
6use crate::{Angle, Box2D, Point2D, Rect, Size2D, Transform2D, Vector2D};
7
8/// Registers the seven exact geometry names with their Euclid defaults.
9///
10/// Registers zero points, vectors, sizes, rectangles, boxes and angles, and an
11/// identity transform. Existing entries under these names follow
12/// [`adam_lang::TypeRegistry::register`]'s replacement semantics.
13///
14/// - Complexity: O(1) amortized time and space for seven registrations.
15///
16/// # Examples
17/// ```
18/// let mut registry = adam_lang::TypeRegistry::new();
19/// cel_euclid::register_adam_types(&mut registry);
20/// assert!(registry.get("Point2D").unwrap().default_fn.is_some());
21/// ```
22pub fn register_adam_types(registry: &mut adam_lang::TypeRegistry) {
23    registry.register::<Point2D>("Point2D");
24    registry.register::<Vector2D>("Vector2D");
25    registry.register::<Size2D>("Size2D");
26    registry.register::<Rect>("Rect");
27    registry.register::<Box2D>("Box2D");
28    registry.register::<Angle>("Angle");
29    registry.register::<Transform2D>("Transform2D");
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    /// Registers every alias with its exact identity and upstream-defined default.
37    #[test]
38    fn every_alias_has_its_euclid_default() {
39        let mut registry = adam_lang::TypeRegistry::new();
40        register_adam_types(&mut registry);
41        /// Checks one registration's concrete identity and independently specified default.
42        macro_rules! check {
43            ($ty:ty, $expected:expr) => {{
44                let entry = registry.get(stringify!($ty)).unwrap();
45                assert_eq!(entry.type_id, std::any::TypeId::of::<$ty>());
46                let value = entry.default_fn.expect("Euclid implements Default")();
47                assert_eq!(*value.downcast::<$ty>().unwrap(), $expected);
48            }};
49        }
50        check!(Point2D, Point2D::new(0.0, 0.0));
51        check!(Vector2D, Vector2D::new(0.0, 0.0));
52        check!(Size2D, Size2D::new(0.0, 0.0));
53        check!(Rect, Rect::new(Point2D::zero(), Size2D::zero()));
54        check!(Box2D, Box2D::new(Point2D::zero(), Point2D::zero()));
55        check!(Angle, Angle::radians(0.0));
56        check!(Transform2D, Transform2D::identity());
57    }
58}