protobuf/reflect/repeated/
vec_downcast.rs

1use crate::reflect::repeated::transmute::transmute_mut_if_eq;
2use crate::reflect::ProtobufValue;
3
4pub(crate) enum VecMutVariant<'a> {
5    U32(&'a mut Vec<u32>),
6    U64(&'a mut Vec<u64>),
7    I32(&'a mut Vec<i32>),
8    I64(&'a mut Vec<i64>),
9    F32(&'a mut Vec<f32>),
10    F64(&'a mut Vec<f64>),
11    Bool(&'a mut Vec<bool>),
12}
13
14impl<'a> VecMutVariant<'a> {
15    pub(crate) fn downcast<V: ProtobufValue>(vec: &'a mut Vec<V>) -> Option<VecMutVariant<'a>> {
16        let vec = match transmute_mut_if_eq(vec) {
17            Ok(vec) => return Some(VecMutVariant::U32(vec)),
18            Err(vec) => vec,
19        };
20        let vec = match transmute_mut_if_eq(vec) {
21            Ok(vec) => return Some(VecMutVariant::U64(vec)),
22            Err(vec) => vec,
23        };
24        let vec = match transmute_mut_if_eq(vec) {
25            Ok(vec) => return Some(VecMutVariant::I32(vec)),
26            Err(vec) => vec,
27        };
28        let vec = match transmute_mut_if_eq(vec) {
29            Ok(vec) => return Some(VecMutVariant::I64(vec)),
30            Err(vec) => vec,
31        };
32        let vec = match transmute_mut_if_eq(vec) {
33            Ok(vec) => return Some(VecMutVariant::F32(vec)),
34            Err(vec) => vec,
35        };
36        let vec = match transmute_mut_if_eq(vec) {
37            Ok(vec) => return Some(VecMutVariant::F64(vec)),
38            Err(vec) => vec,
39        };
40        let vec = match transmute_mut_if_eq(vec) {
41            Ok(vec) => return Some(VecMutVariant::Bool(vec)),
42            Err(vec) => vec,
43        };
44        let _ = vec;
45        None
46    }
47}