protobuf/reflect/repeated/
mod.rs
1pub(crate) mod drain_iter;
2pub(crate) mod iter;
3mod transmute;
4mod vec_downcast;
5
6use std::any::type_name;
7use std::fmt;
8
9use crate::reflect::dynamic::repeated::DynamicRepeated;
10use crate::reflect::reflect_eq::ReflectEq;
11use crate::reflect::reflect_eq::ReflectEqMode;
12use crate::reflect::repeated::drain_iter::ReflectRepeatedDrainIter;
13use crate::reflect::repeated::iter::ReflectRepeatedIter;
14use crate::reflect::repeated::transmute::transmute_ref_if_eq;
15use crate::reflect::repeated::vec_downcast::VecMutVariant;
16use crate::reflect::runtime_types::RuntimeTypeTrait;
17use crate::reflect::value::value_ref::ReflectValueRef;
18use crate::reflect::ProtobufValue;
19use crate::reflect::ReflectValueBox;
20use crate::reflect::RuntimeType;
21
22pub(crate) trait ReflectRepeated: Sync + 'static + fmt::Debug {
23 fn reflect_iter(&self) -> ReflectRepeatedIter;
24 fn reflect_drain_iter(&mut self) -> ReflectRepeatedDrainIter;
25 fn len(&self) -> usize;
26 fn get(&self, index: usize) -> ReflectValueRef;
27 fn set(&mut self, index: usize, value: ReflectValueBox);
34 fn push(&mut self, value: ReflectValueBox);
40
41 fn reflect_extend(&mut self, values: ReflectRepeatedMut);
42
43 fn clear(&mut self);
44 fn element_type(&self) -> RuntimeType;
46
47 fn data_enum_values(&self) -> &[i32];
53
54 fn data_bool(&self) -> &[bool];
56 fn data_i32(&self) -> &[i32];
58 fn data_u32(&self) -> &[u32];
60 fn data_i64(&self) -> &[i64];
62 fn data_u64(&self) -> &[u64];
64 fn data_f32(&self) -> &[f32];
66 fn data_f64(&self) -> &[f64];
68}
69
70fn data_impl<V: ProtobufValue, X: ProtobufValue>(v: &Vec<V>) -> &[X] {
71 match transmute_ref_if_eq::<_, Vec<X>>(v) {
72 Ok(v) => v.as_slice(),
73 Err(_) => panic!("not {}", type_name::<X>()),
74 }
75}
76
77impl<V: ProtobufValue> ReflectRepeated for Vec<V> {
78 fn reflect_iter<'a>(&'a self) -> ReflectRepeatedIter<'a> {
79 ReflectRepeatedIter::new_slice(self.as_slice())
80 }
81
82 fn reflect_drain_iter<'a>(&'a mut self) -> ReflectRepeatedDrainIter<'a> {
83 ReflectRepeatedDrainIter::new_vec(self)
84 }
85
86 fn len(&self) -> usize {
87 Vec::len(self)
88 }
89
90 fn get(&self, index: usize) -> ReflectValueRef {
91 V::RuntimeType::as_ref(&self[index])
92 }
93
94 fn set(&mut self, index: usize, value: ReflectValueBox) {
95 let value = value.downcast().expect("wrong type");
96 self[index] = value;
97 }
98
99 fn push(&mut self, value: ReflectValueBox) {
100 let value = value.downcast().expect("wrong type");
101 self.push(value)
102 }
103
104 fn reflect_extend(&mut self, values: ReflectRepeatedMut) {
105 match VecMutVariant::downcast(self) {
106 Some(VecMutVariant::U32(v)) => v.extend(values.repeated.data_u32()),
107 Some(VecMutVariant::U64(v)) => v.extend(values.repeated.data_u64()),
108 Some(VecMutVariant::I32(v)) => v.extend(values.repeated.data_i32()),
109 Some(VecMutVariant::I64(v)) => v.extend(values.repeated.data_i64()),
110 Some(VecMutVariant::F32(v)) => v.extend(values.repeated.data_f32()),
111 Some(VecMutVariant::F64(v)) => v.extend(values.repeated.data_f64()),
112 Some(VecMutVariant::Bool(v)) => v.extend(values.repeated.data_bool()),
113 None => {
114 for value in values.repeated.reflect_drain_iter() {
115 ReflectRepeated::push(self, value);
117 }
118 }
119 }
120 }
121
122 fn clear(&mut self) {
123 self.clear()
124 }
125
126 fn element_type(&self) -> RuntimeType {
127 V::RuntimeType::runtime_type_box()
128 }
129
130 fn data_enum_values(&self) -> &[i32] {
131 V::RuntimeType::cast_to_enum_values(&self)
132 }
133
134 fn data_bool(&self) -> &[bool] {
135 data_impl(self)
136 }
137
138 fn data_i32(&self) -> &[i32] {
139 data_impl(self)
140 }
141
142 fn data_u32(&self) -> &[u32] {
143 data_impl(self)
144 }
145
146 fn data_i64(&self) -> &[i64] {
147 data_impl(self)
148 }
149
150 fn data_u64(&self) -> &[u64] {
151 data_impl(self)
152 }
153
154 fn data_f32(&self) -> &[f32] {
155 data_impl(self)
156 }
157
158 fn data_f64(&self) -> &[f64] {
159 data_impl(self)
160 }
161}
162
163impl<'a> IntoIterator for &'a dyn ReflectRepeated {
164 type Item = ReflectValueRef<'a>;
165 type IntoIter = ReflectRepeatedIter<'a>;
166
167 fn into_iter(self) -> Self::IntoIter {
168 self.reflect_iter()
169 }
170}
171
172#[derive(Clone)]
173enum ReflectRepeatedRefImpl<'a> {
174 Generated(&'a dyn ReflectRepeated),
175 DynamicEmpty(DynamicRepeated),
176}
177
178impl<'a> fmt::Debug for ReflectRepeatedRefImpl<'a> {
179 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
180 match self {
181 ReflectRepeatedRefImpl::Generated(r) => fmt::Debug::fmt(r, f),
182 ReflectRepeatedRefImpl::DynamicEmpty(r) => fmt::Debug::fmt(r, f),
183 }
184 }
185}
186
187#[derive(Clone)]
189pub struct ReflectRepeatedRef<'a> {
190 imp: ReflectRepeatedRefImpl<'a>,
191}
192
193pub struct ReflectRepeatedMut<'a> {
195 pub(crate) repeated: &'a mut dyn ReflectRepeated,
196}
197
198impl<'a> ReflectRepeatedRef<'a> {
199 pub(crate) fn new(repeated: &'a dyn ReflectRepeated) -> ReflectRepeatedRef<'a> {
200 ReflectRepeatedRef {
201 imp: ReflectRepeatedRefImpl::Generated(repeated),
202 }
203 }
204
205 pub(crate) fn new_empty(elem: RuntimeType) -> ReflectRepeatedRef<'static> {
206 ReflectRepeatedRef {
207 imp: ReflectRepeatedRefImpl::DynamicEmpty(DynamicRepeated::new(elem)),
208 }
209 }
210
211 pub fn len(&self) -> usize {
213 match &self.imp {
214 ReflectRepeatedRefImpl::Generated(g) => g.len(),
215 ReflectRepeatedRefImpl::DynamicEmpty(d) => d.len(),
216 }
217 }
218
219 pub fn is_empty(&self) -> bool {
221 self.len() == 0
222 }
223
224 pub fn get(&self, index: usize) -> ReflectValueRef<'a> {
227 match &self.imp {
228 ReflectRepeatedRefImpl::Generated(r) => r.get(index),
229 ReflectRepeatedRefImpl::DynamicEmpty(..) => panic!("empty"),
230 }
231 }
232
233 pub fn element_type(&self) -> RuntimeType {
235 match &self.imp {
236 ReflectRepeatedRefImpl::Generated(r) => r.element_type(),
237 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.element_type(),
238 }
239 }
240
241 pub(crate) fn data_enum_values(&self) -> &[i32] {
242 match &self.imp {
243 ReflectRepeatedRefImpl::Generated(r) => r.data_enum_values(),
244 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_enum_values(),
245 }
246 }
247
248 pub(crate) fn data_bool(&self) -> &[bool] {
249 match &self.imp {
250 ReflectRepeatedRefImpl::Generated(r) => r.data_bool(),
251 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_bool(),
252 }
253 }
254
255 pub(crate) fn data_u32(&self) -> &[u32] {
256 match &self.imp {
257 ReflectRepeatedRefImpl::Generated(r) => r.data_u32(),
258 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_u32(),
259 }
260 }
261
262 pub(crate) fn data_i32(&self) -> &[i32] {
263 match &self.imp {
264 ReflectRepeatedRefImpl::Generated(r) => r.data_i32(),
265 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_i32(),
266 }
267 }
268
269 pub(crate) fn data_u64(&self) -> &[u64] {
270 match &self.imp {
271 ReflectRepeatedRefImpl::Generated(r) => r.data_u64(),
272 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_u64(),
273 }
274 }
275
276 pub(crate) fn data_i64(&self) -> &[i64] {
277 match &self.imp {
278 ReflectRepeatedRefImpl::Generated(r) => r.data_i64(),
279 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_i64(),
280 }
281 }
282
283 pub(crate) fn data_f32(&self) -> &[f32] {
284 match &self.imp {
285 ReflectRepeatedRefImpl::Generated(r) => r.data_f32(),
286 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_f32(),
287 }
288 }
289
290 pub(crate) fn data_f64(&self) -> &[f64] {
291 match &self.imp {
292 ReflectRepeatedRefImpl::Generated(r) => r.data_f64(),
293 ReflectRepeatedRefImpl::DynamicEmpty(r) => r.data_f64(),
294 }
295 }
296}
297
298impl<'a> ReflectEq for ReflectRepeatedRef<'a> {
299 fn reflect_eq(&self, that: &Self, mode: &ReflectEqMode) -> bool {
300 let len = self.len();
301
302 if len != that.len() {
303 return false;
304 }
305
306 if self.element_type() != that.element_type() {
307 return false;
308 }
309
310 for i in 0..len {
311 let a = self.get(i);
312 let b = that.get(i);
313 if !a.reflect_eq(&b, mode) {
314 return false;
315 }
316 }
317
318 true
319 }
320}
321
322impl<'a> PartialEq for ReflectRepeatedRef<'a> {
323 fn eq(&self, other: &Self) -> bool {
324 self.reflect_eq(other, &ReflectEqMode::default())
325 }
326}
327
328impl<'a> PartialEq<[ReflectValueBox]> for ReflectRepeatedRef<'a> {
329 fn eq(&self, other: &[ReflectValueBox]) -> bool {
330 if self.len() != other.len() {
331 return false;
332 }
333
334 for i in 0..self.len() {
335 if self.get(i) != other[i] {
336 return false;
337 }
338 }
339
340 return true;
341 }
342}
343
344impl<'a> PartialEq<ReflectRepeatedRef<'a>> for [ReflectValueBox] {
345 fn eq(&self, other: &ReflectRepeatedRef) -> bool {
346 other == self
347 }
348}
349
350impl<'a> PartialEq<Vec<ReflectValueBox>> for ReflectRepeatedRef<'a> {
351 fn eq(&self, other: &Vec<ReflectValueBox>) -> bool {
352 self == other.as_slice()
353 }
354}
355
356impl<'a> PartialEq<ReflectRepeatedRef<'a>> for Vec<ReflectValueBox> {
357 fn eq(&self, other: &ReflectRepeatedRef) -> bool {
358 self.as_slice() == other
359 }
360}
361
362impl<'a> ReflectRepeatedMut<'a> {
363 pub(crate) fn new(repeated: &'a mut dyn ReflectRepeated) -> ReflectRepeatedMut<'a> {
364 ReflectRepeatedMut { repeated }
365 }
366
367 fn as_ref(&'a self) -> ReflectRepeatedRef<'a> {
368 ReflectRepeatedRef::new(self.repeated)
369 }
370
371 pub fn len(&self) -> usize {
373 self.repeated.len()
374 }
375
376 pub fn is_empty(&self) -> bool {
378 self.len() == 0
379 }
380
381 pub fn get(&'a self, index: usize) -> ReflectValueRef<'a> {
385 self.repeated.get(index)
386 }
387
388 pub fn element_type(&self) -> RuntimeType {
390 self.repeated.element_type()
391 }
392
393 pub fn set(&mut self, index: usize, value: ReflectValueBox) {
399 self.repeated.set(index, value);
400 }
401
402 pub fn push(&mut self, value: ReflectValueBox) {
408 self.repeated.push(value);
409 }
410
411 pub(crate) fn extend(&mut self, values: ReflectRepeatedMut) {
412 self.repeated.reflect_extend(values);
413 }
414
415 pub fn clear(&mut self) {
417 self.repeated.clear();
418 }
419}
420
421pub struct ReflectRepeatedRefIter<'a> {
423 repeated: ReflectRepeatedRef<'a>,
424 index: usize,
425}
426
427impl<'a> Iterator for ReflectRepeatedRefIter<'a> {
428 type Item = ReflectValueRef<'a>;
429
430 fn next(&mut self) -> Option<Self::Item> {
431 let index = self.index;
432 if index != self.repeated.len() {
433 let r = self.repeated.get(index);
434 self.index += 1;
435 Some(r)
436 } else {
437 None
438 }
439 }
440}
441
442impl<'a> IntoIterator for &'a ReflectRepeatedRef<'a> {
443 type Item = ReflectValueRef<'a>;
444 type IntoIter = ReflectRepeatedRefIter<'a>;
445
446 fn into_iter(self) -> Self::IntoIter {
447 ReflectRepeatedRefIter {
448 repeated: self.clone(),
449 index: 0,
450 }
451 }
452}
453
454impl<'a> IntoIterator for ReflectRepeatedRef<'a> {
455 type Item = ReflectValueRef<'a>;
456 type IntoIter = ReflectRepeatedRefIter<'a>;
457
458 fn into_iter(self) -> Self::IntoIter {
459 ReflectRepeatedRefIter {
460 repeated: self,
461 index: 0,
462 }
463 }
464}
465
466impl<'a> IntoIterator for &'a ReflectRepeatedMut<'a> {
467 type Item = ReflectValueRef<'a>;
468 type IntoIter = ReflectRepeatedRefIter<'a>;
469
470 fn into_iter(self) -> Self::IntoIter {
471 self.as_ref().into_iter()
472 }
473}
474
475impl<'a> fmt::Debug for ReflectRepeatedRef<'a> {
476 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
477 fmt::Debug::fmt(&self.imp, f)
478 }
479}
480
481impl<'a> fmt::Debug for ReflectRepeatedMut<'a> {
482 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
483 fmt::Debug::fmt(self.repeated, f)
484 }
485}
486
487impl<'a> PartialEq for ReflectRepeatedMut<'a> {
488 fn eq(&self, other: &Self) -> bool {
489 self.as_ref() == other.as_ref()
490 }
491}
492
493impl<'a> PartialEq<ReflectRepeatedRef<'a>> for ReflectRepeatedMut<'a> {
494 fn eq(&self, other: &ReflectRepeatedRef) -> bool {
495 PartialEq::eq(&self.as_ref(), other)
496 }
497}
498
499impl<'a> PartialEq<[ReflectValueBox]> for ReflectRepeatedMut<'a> {
500 fn eq(&self, other: &[ReflectValueBox]) -> bool {
501 PartialEq::eq(&self.as_ref(), other)
502 }
503}
504
505impl<'a> PartialEq<ReflectRepeatedMut<'a>> for [ReflectValueBox] {
506 fn eq(&self, other: &ReflectRepeatedMut) -> bool {
507 PartialEq::eq(self, &other.as_ref())
508 }
509}
510
511impl<'a> PartialEq<Vec<ReflectValueBox>> for ReflectRepeatedMut<'a> {
512 fn eq(&self, other: &Vec<ReflectValueBox>) -> bool {
513 self == other.as_slice()
514 }
515}
516
517impl<'a> PartialEq<ReflectRepeatedMut<'a>> for Vec<ReflectValueBox> {
518 fn eq(&self, other: &ReflectRepeatedMut) -> bool {
519 self.as_slice() == other
520 }
521}