protobuf/reflect/map/
generated.rsuse std::collections::hash_map;
use std::collections::HashMap;
use std::hash::Hash;
use crate::reflect::map::ReflectMap;
use crate::reflect::map::ReflectMapIter;
use crate::reflect::map::ReflectMapIterTrait;
use crate::reflect::runtime_types::RuntimeTypeHashable;
use crate::reflect::runtime_types::RuntimeTypeTrait;
use crate::reflect::ProtobufValue;
use crate::reflect::ReflectValueBox;
use crate::reflect::ReflectValueRef;
use crate::reflect::RuntimeType;
impl<K, V> ReflectMap for HashMap<K, V>
where
K: ProtobufValue + Eq + Hash,
V: ProtobufValue,
K::RuntimeType: RuntimeTypeHashable,
{
fn reflect_iter<'a>(&'a self) -> ReflectMapIter<'a> {
ReflectMapIter::new(GeneratedMapIterImpl::<'a, K, V> { iter: self.iter() })
}
fn len(&self) -> usize {
HashMap::len(self)
}
fn is_empty(&self) -> bool {
self.is_empty()
}
fn get<'a>(&'a self, key: ReflectValueRef) -> Option<ReflectValueRef<'a>> {
<K::RuntimeType as RuntimeTypeHashable>::hash_map_get(self, key).map(V::RuntimeType::as_ref)
}
fn insert(&mut self, key: ReflectValueBox, value: ReflectValueBox) {
let key: K = key.downcast().expect("wrong key type");
let value: V = value.downcast().expect("wrong value type");
self.insert(key, value);
}
fn clear(&mut self) {
self.clear();
}
fn key_type(&self) -> RuntimeType {
K::RuntimeType::runtime_type_box()
}
fn value_type(&self) -> RuntimeType {
V::RuntimeType::runtime_type_box()
}
}
struct GeneratedMapIterImpl<'a, K: Eq + Hash + 'static, V: 'static> {
iter: hash_map::Iter<'a, K, V>,
}
impl<'a, K: ProtobufValue + Eq + Hash, V: ProtobufValue> ReflectMapIterTrait<'a>
for GeneratedMapIterImpl<'a, K, V>
{
fn next(&mut self) -> Option<(ReflectValueRef<'a>, ReflectValueRef<'a>)> {
match self.iter.next() {
Some((k, v)) => Some((K::RuntimeType::as_ref(k), V::RuntimeType::as_ref(v))),
None => None,
}
}
fn key_type(&self) -> RuntimeType {
K::RuntimeType::runtime_type_box()
}
fn value_type(&self) -> RuntimeType {
V::RuntimeType::runtime_type_box()
}
}