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}