kasane_logic/spatial_id/flex_id/
constructor.rs1use crate::{Error, F_MAX, F_MIN, FlexId, MAX_ZOOM_LEVEL, SpatialIdError, TemporalId, XY_MAX};
2
3impl FlexId {
4 pub fn new(
5 f_zoomlevel: u8,
6 f_index: i32,
7 x_zoomlevel: u8,
8 x_index: u32,
9 y_zoomlevel: u8,
10 y_index: u32,
11 ) -> Result<FlexId, Error> {
12 if f_zoomlevel > MAX_ZOOM_LEVEL as u8 {
13 return Err(SpatialIdError::ZOutOfRange { z: f_zoomlevel }.into());
14 }
15
16 if x_zoomlevel > MAX_ZOOM_LEVEL as u8 {
17 return Err(SpatialIdError::ZOutOfRange { z: x_zoomlevel }.into());
18 }
19
20 if y_zoomlevel > MAX_ZOOM_LEVEL as u8 {
21 return Err(SpatialIdError::ZOutOfRange { z: y_zoomlevel }.into());
22 }
23
24 if f_index < F_MIN[f_zoomlevel as usize] || f_index > F_MAX[f_zoomlevel as usize] {
25 return Err(SpatialIdError::FOutOfRange {
26 z: f_zoomlevel,
27 f: f_index,
28 }
29 .into());
30 }
31
32 if x_index > XY_MAX[x_zoomlevel as usize] {
33 return Err(SpatialIdError::XOutOfRange {
34 z: x_zoomlevel,
35 x: x_index,
36 }
37 .into());
38 }
39
40 if y_index > XY_MAX[y_zoomlevel as usize] {
41 return Err(SpatialIdError::YOutOfRange {
42 z: y_zoomlevel,
43 y: y_index,
44 }
45 .into());
46 }
47
48 Ok(FlexId {
49 f_zoomlevel,
50 f_index,
51 x_zoomlevel,
52 x_index,
53 y_zoomlevel,
54 y_index,
55 temporal_id: TemporalId::WHOLE,
56 })
57 }
58
59 pub unsafe fn new_unchecked(
60 f_zoomlevel: u8,
61 f_index: i32,
62 x_zoomlevel: u8,
63 x_index: u32,
64 y_zoomlevel: u8,
65 y_index: u32,
66 ) -> FlexId {
67 FlexId {
68 f_zoomlevel,
69 f_index,
70 x_zoomlevel,
71 x_index,
72 y_zoomlevel,
73 y_index,
74 temporal_id: TemporalId::WHOLE,
75 }
76 }
77
78 #[cfg(feature = "temporal_id")]
79 pub fn new_with_temporal(
80 f_zoomlevel: u8,
81 f_index: i32,
82 x_zoomlevel: u8,
83 x_index: u32,
84 y_zoomlevel: u8,
85 y_index: u32,
86 temporal_id: TemporalId,
87 ) -> Result<FlexId, Error> {
88 if f_zoomlevel > MAX_ZOOM_LEVEL as u8 {
89 return Err(SpatialIdError::ZOutOfRange { z: f_zoomlevel }.into());
90 }
91
92 if x_zoomlevel > MAX_ZOOM_LEVEL as u8 {
93 return Err(SpatialIdError::ZOutOfRange { z: x_zoomlevel }.into());
94 }
95
96 if y_zoomlevel > MAX_ZOOM_LEVEL as u8 {
97 return Err(SpatialIdError::ZOutOfRange { z: y_zoomlevel }.into());
98 }
99
100 if f_index < F_MIN[f_zoomlevel as usize] || f_index > F_MAX[f_zoomlevel as usize] {
101 return Err(SpatialIdError::FOutOfRange {
102 z: f_zoomlevel,
103 f: f_index,
104 }
105 .into());
106 }
107
108 if x_index > XY_MAX[x_zoomlevel as usize] {
109 return Err(SpatialIdError::XOutOfRange {
110 z: x_zoomlevel,
111 x: x_index,
112 }
113 .into());
114 }
115
116 if y_index > XY_MAX[y_zoomlevel as usize] {
117 return Err(SpatialIdError::YOutOfRange {
118 z: y_zoomlevel,
119 y: y_index,
120 }
121 .into());
122 }
123
124 Ok(FlexId {
125 f_zoomlevel,
126 f_index,
127 x_zoomlevel,
128 x_index,
129 y_zoomlevel,
130 y_index,
131
132 temporal_id,
133 })
134 }
135
136 #[cfg(feature = "temporal_id")]
137 pub unsafe fn new_with_temporal_unchecked(
138 f_zoomlevel: u8,
139 f_index: i32,
140 x_zoomlevel: u8,
141 x_index: u32,
142 y_zoomlevel: u8,
143 y_index: u32,
144 temporal_id: TemporalId,
145 ) -> FlexId {
146 FlexId {
147 f_zoomlevel,
148 f_index,
149 x_zoomlevel,
150 x_index,
151 y_zoomlevel,
152 y_index,
153 temporal_id,
154 }
155 }
156}