|
|
@@ -41,6 +41,11 @@ impl PrimitiveBlock {
|
|
41
|
41
|
PrimitiveBlock { block: block }
|
|
42
|
42
|
}
|
|
43
|
43
|
|
|
|
44
|
+ /// Returns an iterator over the elements in this `PrimitiveBlock`.
|
|
|
45
|
+ pub fn elements(&self) -> BlockElementsIter {
|
|
|
46
|
+ BlockElementsIter::new(&self.block)
|
|
|
47
|
+ }
|
|
|
48
|
+
|
|
44
|
49
|
/// Returns an iterator over the groups in this `PrimitiveBlock`.
|
|
45
|
50
|
pub fn groups(&self) -> GroupIter {
|
|
46
|
51
|
GroupIter::new(&self.block)
|
|
|
@@ -113,6 +118,118 @@ impl<'a> PrimitiveGroup<'a> {
|
|
113
|
118
|
}
|
|
114
|
119
|
}
|
|
115
|
120
|
|
|
|
121
|
+/// An iterator over the elements in a `PrimitiveGroup`.
|
|
|
122
|
+#[derive(Clone, Debug)]
|
|
|
123
|
+pub struct BlockElementsIter<'a> {
|
|
|
124
|
+ block: &'a osmformat::PrimitiveBlock,
|
|
|
125
|
+ state: ElementsIterState,
|
|
|
126
|
+ groups: std::slice::Iter<'a, osmformat::PrimitiveGroup>,
|
|
|
127
|
+ dense_nodes: DenseNodeIter<'a>,
|
|
|
128
|
+ nodes: std::slice::Iter<'a, osmformat::Node>,
|
|
|
129
|
+ ways: std::slice::Iter<'a, osmformat::Way>,
|
|
|
130
|
+ relations: std::slice::Iter<'a, osmformat::Relation>,
|
|
|
131
|
+}
|
|
|
132
|
+
|
|
|
133
|
+#[derive(Copy, Clone, Debug)]
|
|
|
134
|
+enum ElementsIterState {
|
|
|
135
|
+ Group,
|
|
|
136
|
+ DenseNode,
|
|
|
137
|
+ Node,
|
|
|
138
|
+ Way,
|
|
|
139
|
+ Relation
|
|
|
140
|
+}
|
|
|
141
|
+
|
|
|
142
|
+impl<'a> BlockElementsIter<'a> {
|
|
|
143
|
+ fn new(block: &'a osmformat::PrimitiveBlock) -> BlockElementsIter<'a> {
|
|
|
144
|
+ BlockElementsIter {
|
|
|
145
|
+ block: block,
|
|
|
146
|
+ state: ElementsIterState::Group,
|
|
|
147
|
+ groups: block.get_primitivegroup().iter(),
|
|
|
148
|
+ dense_nodes: DenseNodeIter::empty(block),
|
|
|
149
|
+ nodes: [].iter(),
|
|
|
150
|
+ ways: [].iter(),
|
|
|
151
|
+ relations: [].iter(),
|
|
|
152
|
+ }
|
|
|
153
|
+ }
|
|
|
154
|
+
|
|
|
155
|
+ #[inline]
|
|
|
156
|
+ fn step(&mut self) -> Option<Option<Element<'a>>> {
|
|
|
157
|
+ match self.state {
|
|
|
158
|
+ ElementsIterState::Group => {
|
|
|
159
|
+ match self.groups.next() {
|
|
|
160
|
+ Some(group) => {
|
|
|
161
|
+ self.state = ElementsIterState::DenseNode;
|
|
|
162
|
+ self.dense_nodes = DenseNodeIter::new(self.block, group.get_dense());
|
|
|
163
|
+ self.nodes = group.get_nodes().iter();
|
|
|
164
|
+ self.ways = group.get_ways().iter();
|
|
|
165
|
+ self.relations = group.get_relations().iter();
|
|
|
166
|
+ None
|
|
|
167
|
+ },
|
|
|
168
|
+ None => Some(None),
|
|
|
169
|
+ }
|
|
|
170
|
+ },
|
|
|
171
|
+ ElementsIterState::DenseNode => {
|
|
|
172
|
+ match self.dense_nodes.next() {
|
|
|
173
|
+ Some(dense_node) => {
|
|
|
174
|
+ Some(Some(Element::DenseNode(dense_node)))
|
|
|
175
|
+ },
|
|
|
176
|
+ None => {
|
|
|
177
|
+ self.state = ElementsIterState::Node;
|
|
|
178
|
+ None
|
|
|
179
|
+ },
|
|
|
180
|
+ }
|
|
|
181
|
+ },
|
|
|
182
|
+ ElementsIterState::Node => {
|
|
|
183
|
+ match self.nodes.next() {
|
|
|
184
|
+ Some(node) => {
|
|
|
185
|
+ Some(Some(Element::Node(Node::new(self.block, node))))
|
|
|
186
|
+ },
|
|
|
187
|
+ None => {
|
|
|
188
|
+ self.state = ElementsIterState::Way;
|
|
|
189
|
+ None
|
|
|
190
|
+ },
|
|
|
191
|
+ }
|
|
|
192
|
+ },
|
|
|
193
|
+ ElementsIterState::Way => {
|
|
|
194
|
+ match self.ways.next() {
|
|
|
195
|
+ Some(way) => {
|
|
|
196
|
+ Some(Some(Element::Way(Way::new(self.block, way))))
|
|
|
197
|
+ },
|
|
|
198
|
+ None => {
|
|
|
199
|
+ self.state = ElementsIterState::Relation;
|
|
|
200
|
+ None
|
|
|
201
|
+ },
|
|
|
202
|
+ }
|
|
|
203
|
+ },
|
|
|
204
|
+ ElementsIterState::Relation => {
|
|
|
205
|
+ match self.relations.next() {
|
|
|
206
|
+ Some(rel) => {
|
|
|
207
|
+ Some(Some(Element::Relation(Relation::new(self.block, rel))))
|
|
|
208
|
+ },
|
|
|
209
|
+ None => {
|
|
|
210
|
+ self.state = ElementsIterState::Group;
|
|
|
211
|
+ None
|
|
|
212
|
+ },
|
|
|
213
|
+ }
|
|
|
214
|
+ },
|
|
|
215
|
+ }
|
|
|
216
|
+ }
|
|
|
217
|
+}
|
|
|
218
|
+
|
|
|
219
|
+impl<'a> Iterator for BlockElementsIter<'a> {
|
|
|
220
|
+ type Item = Element<'a>;
|
|
|
221
|
+
|
|
|
222
|
+ #[inline]
|
|
|
223
|
+ fn next(&mut self) -> Option<Self::Item> {
|
|
|
224
|
+ loop {
|
|
|
225
|
+ if let Some(element) = self.step() {
|
|
|
226
|
+ return element;
|
|
|
227
|
+ }
|
|
|
228
|
+ }
|
|
|
229
|
+ }
|
|
|
230
|
+}
|
|
|
231
|
+
|
|
|
232
|
+
|
|
116
|
233
|
/// An iterator over the groups in a `PrimitiveBlock`.
|
|
117
|
234
|
#[derive(Clone, Debug)]
|
|
118
|
235
|
pub struct GroupIter<'a> {
|