Skip to content

Commit f9875d9

Browse files
committed
Implement iterator for DynamicMap
1 parent 41b58ee commit f9875d9

File tree

3 files changed

+64
-8
lines changed

3 files changed

+64
-8
lines changed

protobuf/src/reflect/dynamic/map.rs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
use crate::reflect::map::ReflectMap;
21
use crate::reflect::map::ReflectMapIter;
3-
use crate::reflect::ReflectValueBox;
2+
use crate::reflect::map::ReflectMap;
3+
use crate::reflect::map::ReflectMapIterTrait;
4+
use crate::reflect::runtime_types::RuntimeType;
45
use crate::reflect::ReflectValueRef;
56
use crate::reflect::RuntimeTypeBox;
7+
use crate::reflect::ProtobufValue;
8+
use crate::reflect::ReflectValueBox;
9+
use std::collections::hash_map;
610
use std::collections::HashMap;
11+
use std::hash::Hash;
712

813
#[derive(Debug, Clone)]
914
enum Maps {
@@ -84,10 +89,57 @@ impl DynamicMap {
8489
}
8590
}
8691

92+
struct DynamicMapIterImpl<'a, K: ProtobufValue + Eq + Hash + 'static> {
93+
iter: hash_map::Iter<'a, K, ReflectValueBox>,
94+
value: &'a RuntimeTypeBox,
95+
}
96+
97+
impl<'a, K: ProtobufValue + Eq + Hash + 'static> ReflectMapIterTrait<'a>
98+
for DynamicMapIterImpl<'a, K>
99+
{
100+
fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
101+
self.iter
102+
.next()
103+
.map(|(k, v)| (K::as_ref(k), v.as_value_ref()))
104+
}
105+
106+
fn key_type(&self) -> RuntimeTypeBox {
107+
K::RuntimeType::runtime_type_box()
108+
}
109+
110+
fn value_type(&self) -> RuntimeTypeBox {
111+
self.value.clone()
112+
}
113+
}
114+
87115
impl ReflectMap for DynamicMap {
88116
fn reflect_iter(&self) -> ReflectMapIter {
89-
// TODO
90-
unimplemented!()
117+
match &self.maps {
118+
Maps::U32(m) => ReflectMapIter::new(DynamicMapIterImpl {
119+
iter: m.iter(),
120+
value: &self.value,
121+
}),
122+
Maps::I32(m) => ReflectMapIter::new(DynamicMapIterImpl {
123+
iter: m.iter(),
124+
value: &self.value,
125+
}),
126+
Maps::U64(m) => ReflectMapIter::new(DynamicMapIterImpl {
127+
iter: m.iter(),
128+
value: &self.value,
129+
}),
130+
Maps::I64(m) => ReflectMapIter::new(DynamicMapIterImpl {
131+
iter: m.iter(),
132+
value: &self.value,
133+
}),
134+
Maps::Bool(m) => ReflectMapIter::new(DynamicMapIterImpl {
135+
iter: m.iter(),
136+
value: &self.value,
137+
}),
138+
Maps::String(m) => ReflectMapIter::new(DynamicMapIterImpl {
139+
iter: m.iter(),
140+
value: &self.value,
141+
}),
142+
}
91143
}
92144

93145
fn len(&self) -> usize {

protobuf/src/reflect/map/generated.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ where
1616
K::RuntimeType: RuntimeTypeHashable,
1717
{
1818
fn reflect_iter<'a>(&'a self) -> ReflectMapIter<'a> {
19-
ReflectMapIter {
20-
imp: Box::new(GeneratedMapIterImpl::<'a, K, V> { iter: self.iter() }),
21-
}
19+
ReflectMapIter::new(GeneratedMapIterImpl::<'a, K, V> { iter: self.iter() })
2220
}
2321

2422
fn len(&self) -> usize {

protobuf/src/reflect/map/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub(crate) trait ReflectMap: Send + Sync + 'static {
2525
fn value_type(&self) -> RuntimeTypeBox;
2626
}
2727

28-
trait ReflectMapIterTrait<'a> {
28+
pub(crate) trait ReflectMapIterTrait<'a> {
2929
fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)>;
3030
fn key_type(&self) -> RuntimeTypeBox;
3131
fn value_type(&self) -> RuntimeTypeBox;
@@ -35,6 +35,12 @@ pub struct ReflectMapIter<'a> {
3535
imp: Box<dyn ReflectMapIterTrait<'a> + 'a>,
3636
}
3737

38+
impl<'a> ReflectMapIter<'a> {
39+
pub(crate) fn new<I: ReflectMapIterTrait<'a> + 'a>(imp: I) -> ReflectMapIter<'a> {
40+
ReflectMapIter { imp: Box::new(imp) }
41+
}
42+
}
43+
3844
impl<'a> Iterator for ReflectMapIter<'a> {
3945
type Item = (ReflectValueRef<'a>, ReflectValueRef<'a>);
4046

0 commit comments

Comments
 (0)