i_shape/float/
adapter.rs

1use i_float::adapter::FloatPointAdapter;
2use i_float::float::compatible::FloatPointCompatible;
3use i_float::float::number::FloatNumber;
4use i_float::int::point::IntPoint;
5use crate::base::data::{Contour, Path, Shape, Shapes};
6use crate::int::path::IntPath;
7use crate::int::shape::{IntContour, IntShape, IntShapes};
8
9pub trait PathToFloat<P: FloatPointCompatible<T>, T: FloatNumber> {
10    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Path<P>;
11}
12
13pub trait ShapeToFloat<P: FloatPointCompatible<T>, T: FloatNumber> {
14    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Shape<P>;
15}
16
17pub trait ShapesToFloat<P: FloatPointCompatible<T>, T: FloatNumber> {
18    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Shapes<P>;
19}
20
21pub trait PathToInt<P: FloatPointCompatible<T>, T: FloatNumber> {
22    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntPath;
23}
24
25pub trait ShapeToInt<P: FloatPointCompatible<T>, T: FloatNumber> {
26    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntShape;
27}
28
29pub trait ShapesToInt<P: FloatPointCompatible<T>, T: FloatNumber> {
30    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntShapes;
31}
32
33impl<P: FloatPointCompatible<T>, T: FloatNumber> PathToFloat<P, T> for [IntPoint] {
34    #[inline(always)]
35    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Path<P> {
36        self.iter().map(|p| adapter.int_to_float(p)).collect()
37    }
38}
39
40impl<P: FloatPointCompatible<T>, T: FloatNumber> ShapeToFloat<P, T> for [IntContour] {
41    #[inline(always)]
42    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Shape<P> {
43        self.iter().map(|path| path.to_float(adapter)).collect()
44    }
45}
46
47impl<P: FloatPointCompatible<T>, T: FloatNumber> ShapesToFloat<P, T> for [IntShape] {
48    #[inline(always)]
49    fn to_float(&self, adapter: &FloatPointAdapter<P, T>) -> Shapes<P> {
50        self.iter().map(|shape| shape.to_float(adapter)).collect()
51    }
52}
53
54impl<P: FloatPointCompatible<T>, T: FloatNumber> PathToInt<P, T> for [P] {
55    #[inline(always)]
56    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntPath {
57        self.iter().map(|p| adapter.float_to_int(p)).collect()
58    }
59}
60
61impl<P: FloatPointCompatible<T>, T: FloatNumber> ShapeToInt<P, T> for [Contour<P>] {
62    #[inline(always)]
63    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntShape {
64        self.iter().map(|path| path.to_int(adapter)).collect()
65    }
66}
67
68impl<P: FloatPointCompatible<T>, T: FloatNumber> ShapesToInt<P, T> for [Shape<P>] {
69    #[inline(always)]
70    fn to_int(&self, adapter: &FloatPointAdapter<P, T>) -> IntShapes {
71        self.iter().map(|shape| shape.to_int(adapter)).collect()
72    }
73}