geo/
geometry_cow.rs

1use crate::{
2    CoordNum, Geometry, GeometryCollection, Line, LineString, MultiLineString, MultiPoint,
3    MultiPolygon, Point, Polygon, Rect, Triangle,
4};
5use std::borrow::Cow;
6
7/// A `GeometryCow` is a "one of" enum, just like [`Geometry`], except it is possible for the inner
8/// type of a `GeometryCow` to be a reference rather than owned.
9///
10/// This is a way to "upgrade" an inner type to something like a `Geometry` without `moving` it.
11///
12/// As an example, see the [`Relate`] trait which uses `GeometryCow`.
13#[derive(PartialEq, Debug, Hash)]
14pub(crate) enum GeometryCow<'a, T>
15where
16    T: CoordNum,
17{
18    Point(Cow<'a, Point<T>>),
19    Line(Cow<'a, Line<T>>),
20    LineString(Cow<'a, LineString<T>>),
21    Polygon(Cow<'a, Polygon<T>>),
22    MultiPoint(Cow<'a, MultiPoint<T>>),
23    MultiLineString(Cow<'a, MultiLineString<T>>),
24    MultiPolygon(Cow<'a, MultiPolygon<T>>),
25    GeometryCollection(Cow<'a, GeometryCollection<T>>),
26    Rect(Cow<'a, Rect<T>>),
27    Triangle(Cow<'a, Triangle<T>>),
28}
29
30impl<'a, T: CoordNum> From<&'a Geometry<T>> for GeometryCow<'a, T> {
31    fn from(geometry: &'a Geometry<T>) -> Self {
32        match geometry {
33            Geometry::Point(g) => GeometryCow::Point(Cow::Borrowed(g)),
34            Geometry::Line(g) => GeometryCow::Line(Cow::Borrowed(g)),
35            Geometry::LineString(g) => GeometryCow::LineString(Cow::Borrowed(g)),
36            Geometry::Polygon(g) => GeometryCow::Polygon(Cow::Borrowed(g)),
37            Geometry::MultiPoint(g) => GeometryCow::MultiPoint(Cow::Borrowed(g)),
38            Geometry::MultiLineString(g) => GeometryCow::MultiLineString(Cow::Borrowed(g)),
39            Geometry::MultiPolygon(g) => GeometryCow::MultiPolygon(Cow::Borrowed(g)),
40            Geometry::GeometryCollection(g) => GeometryCow::GeometryCollection(Cow::Borrowed(g)),
41            Geometry::Rect(g) => GeometryCow::Rect(Cow::Borrowed(g)),
42            Geometry::Triangle(g) => GeometryCow::Triangle(Cow::Borrowed(g)),
43        }
44    }
45}
46
47impl<'a, T: CoordNum> From<&'a Point<T>> for GeometryCow<'a, T> {
48    fn from(point: &'a Point<T>) -> Self {
49        GeometryCow::Point(Cow::Borrowed(point))
50    }
51}
52
53impl<'a, T: CoordNum> From<&'a LineString<T>> for GeometryCow<'a, T> {
54    fn from(line_string: &'a LineString<T>) -> Self {
55        GeometryCow::LineString(Cow::Borrowed(line_string))
56    }
57}
58
59impl<'a, T: CoordNum> From<&'a Line<T>> for GeometryCow<'a, T> {
60    fn from(line: &'a Line<T>) -> Self {
61        GeometryCow::Line(Cow::Borrowed(line))
62    }
63}
64
65impl<'a, T: CoordNum> From<&'a Polygon<T>> for GeometryCow<'a, T> {
66    fn from(polygon: &'a Polygon<T>) -> Self {
67        GeometryCow::Polygon(Cow::Borrowed(polygon))
68    }
69}
70
71impl<'a, T: CoordNum> From<&'a MultiPoint<T>> for GeometryCow<'a, T> {
72    fn from(multi_point: &'a MultiPoint<T>) -> GeometryCow<'a, T> {
73        GeometryCow::MultiPoint(Cow::Borrowed(multi_point))
74    }
75}
76
77impl<'a, T: CoordNum> From<&'a MultiLineString<T>> for GeometryCow<'a, T> {
78    fn from(multi_line_string: &'a MultiLineString<T>) -> Self {
79        GeometryCow::MultiLineString(Cow::Borrowed(multi_line_string))
80    }
81}
82
83impl<'a, T: CoordNum> From<&'a MultiPolygon<T>> for GeometryCow<'a, T> {
84    fn from(multi_polygon: &'a MultiPolygon<T>) -> Self {
85        GeometryCow::MultiPolygon(Cow::Borrowed(multi_polygon))
86    }
87}
88
89impl<'a, T: CoordNum> From<&'a GeometryCollection<T>> for GeometryCow<'a, T> {
90    fn from(geometry_collection: &'a GeometryCollection<T>) -> Self {
91        GeometryCow::GeometryCollection(Cow::Borrowed(geometry_collection))
92    }
93}
94
95impl<'a, T: CoordNum> From<&'a Rect<T>> for GeometryCow<'a, T> {
96    fn from(rect: &'a Rect<T>) -> Self {
97        GeometryCow::Rect(Cow::Borrowed(rect))
98    }
99}
100
101impl<'a, T: CoordNum> From<&'a Triangle<T>> for GeometryCow<'a, T> {
102    fn from(triangle: &'a Triangle<T>) -> Self {
103        GeometryCow::Triangle(Cow::Borrowed(triangle))
104    }
105}