kasane_logic/spatial_id/traits.rs
1use std::{
2 fmt::{Debug, Display},
3 hash::Hash,
4};
5
6use crate::{Coordinate, FlexId, SingleId, TemporalId, error::Error};
7
8#[cfg(doc)]
9use crate::RangeId;
10
11/// [SingleId],[RangeId],[FlexId]が共通して持つTrait
12pub trait SpatialId:
13 IntoFlexIds
14 + IterFlexIds
15 + IterSingleIds
16 + IntoSingleIds
17 + Debug
18 + Display
19 + Clone
20 + Eq
21 + Hash
22 + Ord
23 + PartialOrd
24{
25 /// ズームレベルにおける最小のFインデックスを返す。
26 ///
27 /// ```
28 /// # use kasane_logic::RangeId;
29 /// # use kasane_logic::SingleId;
30 /// # use kasane_logic::FlexId;
31 /// # use kasane_logic::SpatialId;
32 /// //SingleIdの動作
33 /// let single_id=SingleId::new(3,3,2,4).unwrap();
34 /// assert_eq!(single_id.f_min(),-8);
35 ///
36 /// //RangeIdの動作
37 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
38 /// assert_eq!(range_id.f_min(),-16);
39 ///
40 /// //FlexIdの動作
41 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
42 /// assert_eq!(flex_id.f_min(),-32);
43 /// ```
44 fn f_min(&self) -> i32;
45
46 /// ズームレベルにおける最大のFインデックスを返す。
47 ///
48 /// ```
49 /// # use kasane_logic::RangeId;
50 /// # use kasane_logic::SingleId;
51 /// # use kasane_logic::FlexId;
52 /// # use kasane_logic::SpatialId;
53 /// //SingleIdの動作
54 /// let single_id=SingleId::new(3,3,2,4).unwrap();
55 /// assert_eq!(single_id.f_max(),7);
56 ///
57 /// //RangeIdの動作
58 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
59 /// assert_eq!(range_id.f_max(),15);
60 ///
61 /// //FlexIdの動作
62 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
63 /// assert_eq!(flex_id.f_max(),31);
64 /// ```
65 fn f_max(&self) -> i32;
66
67 /// ズームレベルにおける最大のXインデックスを返す。
68 ///
69 /// ```
70 /// # use kasane_logic::RangeId;
71 /// # use kasane_logic::SingleId;
72 /// # use kasane_logic::FlexId;
73 /// # use kasane_logic::SpatialId;
74 /// //SingleIdの動作
75 /// let single_id=SingleId::new(3,3,2,4).unwrap();
76 /// assert_eq!(single_id.x_max(),7);
77 ///
78 /// //RangeIdの動作
79 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
80 /// assert_eq!(range_id.x_max(),15);
81 ///
82 /// //FlexIdの動作
83 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
84 /// assert_eq!(flex_id.x_max(),3);
85 /// ```
86 fn x_max(&self) -> u32;
87
88 /// ズームレベルにおける最小のXインデックスを返す。全てのIDにおいて必ず`0`を返す。
89 ///
90 /// ```
91 /// # use kasane_logic::RangeId;
92 /// # use kasane_logic::SingleId;
93 /// # use kasane_logic::FlexId;
94 /// # use kasane_logic::SpatialId;
95 /// //SingleIdの動作
96 /// let single_id=SingleId::new(3,3,2,4).unwrap();
97 /// assert_eq!(single_id.x_min(),0);
98 ///
99 /// //RangeIdの動作
100 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
101 /// assert_eq!(range_id.x_min(),0);
102 ///
103 /// //FlexIdの動作
104 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
105 /// assert_eq!(flex_id.x_min(),0);
106 /// ```
107 fn x_min(&self) -> u32 {
108 0
109 }
110
111 /// ズームレベルにおける最大のYインデックスを返す。
112 ///
113 /// ```
114 /// # use kasane_logic::RangeId;
115 /// # use kasane_logic::SingleId;
116 /// # use kasane_logic::FlexId;
117 /// # use kasane_logic::SpatialId;
118 /// //SingleIdの動作
119 /// let single_id=SingleId::new(3,3,2,4).unwrap();
120 /// assert_eq!(single_id.y_max(),7);
121 ///
122 /// //RangeIdの動作
123 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
124 /// assert_eq!(range_id.y_max(),15);
125 ///
126 /// //FlexIdの動作
127 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
128 /// assert_eq!(flex_id.y_max(),1023);
129 /// ```
130 fn y_max(&self) -> u32;
131
132 /// ズームレベルにおける最小のYインデックスを返す。全てのIDにおいて必ず`0`を返す。
133 ///
134 /// ```
135 /// # use kasane_logic::RangeId;
136 /// # use kasane_logic::SingleId;
137 /// # use kasane_logic::FlexId;
138 /// # use kasane_logic::SpatialId;
139 /// //SingleIdの動作
140 /// let single_id=SingleId::new(3,3,2,4).unwrap();
141 /// assert_eq!(single_id.y_min(),0);
142 ///
143 /// //RangeIdの動作
144 /// let range_id=RangeId::new(4, [-3,10], [8,9], [5,10]).unwrap();
145 /// assert_eq!(range_id.y_min(),0);
146 ///
147 /// //FlexIdの動作
148 /// let flex_id=FlexId::new(5, 3, 2, 3, 10, 1).unwrap();
149 /// assert_eq!(flex_id.y_min(),0);
150 /// ```
151 fn y_min(&self) -> u32 {
152 0
153 }
154
155 /// F 方向に指定インデックスだけ移動する。
156 fn move_f(&mut self, by: i32) -> Result<(), Error>;
157
158 /// X 方向に指定インデックスだけ移動する。
159 fn move_x(&mut self, by: i32);
160
161 /// Y 方向に指定インデックスだけ移動する。
162 fn move_y(&mut self, by: i32) -> Result<(), Error>;
163
164 /// F 方向の長さをメートル単位で返す。
165 fn length_f_meters(&self) -> f64;
166
167 /// X 方向の長さをメートル単位で返す。
168 fn length_x_meters(&self) -> f64;
169
170 /// Y 方向の長さをメートル単位で返す。
171 fn length_y_meters(&self) -> f64;
172
173 /// 空間 ID の中心座標を返す。
174 fn spatial_center(&self) -> Coordinate;
175
176 /// 空間 ID の8頂点を返す。
177 fn spatial_vertices(&self) -> [Coordinate; 8];
178
179 /// 時間 ID を参照で返す。
180 fn temporal(&self) -> &TemporalId;
181
182 /// 時間 ID を可変参照で返す。
183 fn temporal_mut(&mut self) -> &mut TemporalId;
184}
185
186/// [SingleId] の集合であることを保証するトレイト。
187pub trait IntoSingleIds {
188 type IntoIter: Iterator<Item = SingleId>;
189
190 /// 所有権ごと [SingleId] の列へ変換する。
191 fn into_single_ids(self) -> Self::IntoIter;
192}
193
194/// [SingleId] の参照列を返せることを保証するトレイト。
195pub trait IterSingleIds {
196 type Iter<'a>: Iterator<Item = SingleId> + 'a
197 where
198 Self: 'a;
199
200 /// 参照から [SingleId] の列を列挙する。
201 fn iter_single_ids(&self) -> Self::Iter<'_>;
202}
203
204/// [FlexId] の集合であることを保証するトレイト。
205pub trait IntoFlexIds {
206 type IntoIter: Iterator<Item = FlexId>;
207
208 /// 所有権ごと [FlexId] の列へ変換する。
209 fn into_flex_ids(self) -> Self::IntoIter;
210}
211
212/// [FlexId] の参照列を返せることを保証するトレイト。
213pub trait IterFlexIds {
214 type Iter<'a>: Iterator<Item = FlexId> + 'a
215 where
216 Self: 'a;
217
218 /// 参照から [FlexId] の列を列挙する。
219 fn iter_flex_ids(&self) -> Self::Iter<'_>;
220}