Skip to main content

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}