blob: 710de3ef962443377315d735d55620f369d81444 [file] [log] [blame]
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07001use std::slice;
2
3use super::value::ProtobufValue;
4use super::value::ReflectValueRef;
Haibo Huangd32e6ee2020-08-12 13:52:04 -07005use crate::repeated::RepeatedField;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07006
7pub trait ReflectRepeated: 'static {
8 fn reflect_iter(&self) -> ReflectRepeatedIter;
9 fn len(&self) -> usize;
Haibo Huang4bf8b462020-11-24 20:53:50 -080010 fn get(&self, index: usize) -> &dyn ProtobufValue;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070011}
12
13impl<V: ProtobufValue + 'static> ReflectRepeated for Vec<V> {
14 fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
15 ReflectRepeatedIter {
16 imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
17 }
18 }
19
20 fn len(&self) -> usize {
21 Vec::len(self)
22 }
23
Haibo Huang4bf8b462020-11-24 20:53:50 -080024 fn get(&self, index: usize) -> &dyn ProtobufValue {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070025 &self[index]
26 }
27}
28
29// useless
30impl<V: ProtobufValue + 'static> ReflectRepeated for [V] {
31 fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
32 ReflectRepeatedIter {
33 imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
34 }
35 }
36
37 fn len(&self) -> usize {
38 <[_]>::len(self)
39 }
40
Haibo Huang4bf8b462020-11-24 20:53:50 -080041 fn get(&self, index: usize) -> &dyn ProtobufValue {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070042 &self[index]
43 }
44}
45
46impl<V: ProtobufValue + 'static> ReflectRepeated for RepeatedField<V> {
47 fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
48 ReflectRepeatedIter {
49 imp: Box::new(ReflectRepeatedIterImplSlice::<'a, V> { iter: self.iter() }),
50 }
51 }
52
53 fn len(&self) -> usize {
54 RepeatedField::len(self)
55 }
56
Haibo Huang4bf8b462020-11-24 20:53:50 -080057 fn get(&self, index: usize) -> &dyn ProtobufValue {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070058 &self[index]
59 }
60}
61
62trait ReflectRepeatedIterTrait<'a> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080063 fn next(&mut self) -> Option<&'a dyn ProtobufValue>;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070064}
65
66struct ReflectRepeatedIterImplSlice<'a, V: ProtobufValue + 'static> {
67 iter: slice::Iter<'a, V>,
68}
69
70impl<'a, V: ProtobufValue + 'static> ReflectRepeatedIterTrait<'a>
71 for ReflectRepeatedIterImplSlice<'a, V>
72{
Haibo Huang4bf8b462020-11-24 20:53:50 -080073 fn next(&mut self) -> Option<&'a dyn ProtobufValue> {
74 self.iter.next().map(|v| v as &dyn ProtobufValue)
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070075 }
76}
77
78pub struct ReflectRepeatedIter<'a> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080079 imp: Box<dyn ReflectRepeatedIterTrait<'a> + 'a>,
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070080}
81
82impl<'a> Iterator for ReflectRepeatedIter<'a> {
Haibo Huang4bf8b462020-11-24 20:53:50 -080083 type Item = &'a dyn ProtobufValue;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070084
85 fn next(&mut self) -> Option<Self::Item> {
86 self.imp.next()
87 }
88}
89
Haibo Huang4bf8b462020-11-24 20:53:50 -080090impl<'a> IntoIterator for &'a dyn ReflectRepeated {
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070091 type IntoIter = ReflectRepeatedIter<'a>;
Haibo Huang4bf8b462020-11-24 20:53:50 -080092 type Item = &'a dyn ProtobufValue;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070093
94 fn into_iter(self) -> Self::IntoIter {
95 self.reflect_iter()
96 }
97}
98
99pub trait ReflectRepeatedEnum<'a> {
100 fn len(&self) -> usize;
101
102 fn get(&self, index: usize) -> ReflectValueRef<'a>;
103}
104
105pub trait ReflectRepeatedMessage<'a> {
106 fn len(&self) -> usize;
107
108 fn get(&self, index: usize) -> ReflectValueRef<'a>;
109}
110
111pub enum ReflectRepeatedRef<'a> {
Haibo Huang4bf8b462020-11-24 20:53:50 -0800112 Generic(&'a dyn ReflectRepeated),
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -0700113 U32(&'a [u32]),
114 U64(&'a [u64]),
115 I32(&'a [i32]),
116 I64(&'a [i64]),
117 F32(&'a [f32]),
118 F64(&'a [f64]),
119 Bool(&'a [bool]),
120 String(&'a [String]),
121 Bytes(&'a [Vec<u8>]),
Haibo Huang4bf8b462020-11-24 20:53:50 -0800122 Enum(Box<dyn ReflectRepeatedEnum<'a> + 'a>),
123 Message(Box<dyn ReflectRepeatedMessage<'a> + 'a>),
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -0700124}
125
126impl<'a> ReflectRepeatedRef<'a> {
127 fn len(&self) -> usize {
128 match *self {
129 ReflectRepeatedRef::Generic(ref r) => r.len(),
130 ReflectRepeatedRef::U32(ref r) => r.len(),
131 ReflectRepeatedRef::U64(ref r) => r.len(),
132 ReflectRepeatedRef::I32(ref r) => r.len(),
133 ReflectRepeatedRef::I64(ref r) => r.len(),
134 ReflectRepeatedRef::F32(ref r) => r.len(),
135 ReflectRepeatedRef::F64(ref r) => r.len(),
136 ReflectRepeatedRef::Bool(ref r) => r.len(),
137 ReflectRepeatedRef::String(ref r) => r.len(),
138 ReflectRepeatedRef::Bytes(ref r) => r.len(),
139 ReflectRepeatedRef::Enum(ref r) => r.len(),
140 ReflectRepeatedRef::Message(ref r) => r.len(),
141 }
142 }
143
144 fn get(&self, index: usize) -> ReflectValueRef<'a> {
145 match *self {
146 ReflectRepeatedRef::Generic(ref r) => r.get(index).as_ref(),
147 ReflectRepeatedRef::U32(ref r) => ReflectValueRef::U32(r[index]),
148 ReflectRepeatedRef::U64(ref r) => ReflectValueRef::U64(r[index]),
149 ReflectRepeatedRef::I32(ref r) => ReflectValueRef::I32(r[index]),
150 ReflectRepeatedRef::I64(ref r) => ReflectValueRef::I64(r[index]),
151 ReflectRepeatedRef::F32(ref r) => ReflectValueRef::F32(r[index]),
152 ReflectRepeatedRef::F64(ref r) => ReflectValueRef::F64(r[index]),
153 ReflectRepeatedRef::Bool(ref r) => ReflectValueRef::Bool(r[index]),
154 ReflectRepeatedRef::String(ref r) => ReflectValueRef::String(&r[index]),
155 ReflectRepeatedRef::Bytes(ref r) => ReflectValueRef::Bytes(&r[index]),
156 ReflectRepeatedRef::Enum(ref r) => r.get(index),
157 ReflectRepeatedRef::Message(ref r) => r.get(index),
158 }
159 }
160}
161
162pub struct ReflectRepeatedRefIter<'a> {
163 repeated: &'a ReflectRepeatedRef<'a>,
164 pos: usize,
165}
166
167impl<'a> Iterator for ReflectRepeatedRefIter<'a> {
168 type Item = ReflectValueRef<'a>;
169
170 fn next(&mut self) -> Option<Self::Item> {
171 if self.pos < self.repeated.len() {
172 let pos = self.pos;
173 self.pos += 1;
174 Some(self.repeated.get(pos))
175 } else {
176 None
177 }
178 }
179}
180
181impl<'a> IntoIterator for &'a ReflectRepeatedRef<'a> {
182 type IntoIter = ReflectRepeatedRefIter<'a>;
183 type Item = ReflectValueRef<'a>;
184
185 fn into_iter(self) -> Self::IntoIter {
186 ReflectRepeatedRefIter {
187 repeated: self,
188 pos: 0,
189 }
190 }
191}