|
1 |
| -use crate::reflect::map::ReflectMap; |
2 | 1 | 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; |
4 | 5 | use crate::reflect::ReflectValueRef;
|
5 | 6 | use crate::reflect::RuntimeTypeBox;
|
| 7 | +use crate::reflect::ProtobufValue; |
| 8 | +use crate::reflect::ReflectValueBox; |
| 9 | +use std::collections::hash_map; |
6 | 10 | use std::collections::HashMap;
|
| 11 | +use std::hash::Hash; |
7 | 12 |
|
8 | 13 | #[derive(Debug, Clone)]
|
9 | 14 | enum Maps {
|
@@ -84,10 +89,57 @@ impl DynamicMap {
|
84 | 89 | }
|
85 | 90 | }
|
86 | 91 |
|
| 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 | + |
87 | 115 | impl ReflectMap for DynamicMap {
|
88 | 116 | 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 | + } |
91 | 143 | }
|
92 | 144 |
|
93 | 145 | fn len(&self) -> usize {
|
|
0 commit comments