Skip to content

Commit 96555ba

Browse files
committed
Auto merge of #77261 - oli-obk:const_generic_array_serializer, r=matthewjasper
Deduplicate and generalize some (de/)serializer impls I noticed this while implementing #77227 and getting a "not implemented for [T; 16]" error. There's likely more things we can deduplicate in this file, but I didn't need any additional changes.
2 parents 4e3eb52 + 455f284 commit 96555ba

File tree

2 files changed

+12
-23
lines changed

2 files changed

+12
-23
lines changed

compiler/rustc_serialize/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Core encoding and decoding interfaces.
1313
#![feature(never_type)]
1414
#![feature(nll)]
1515
#![feature(associated_type_bounds)]
16+
#![feature(min_const_generics)]
1617
#![cfg_attr(test, feature(test))]
1718
#![allow(rustc::internal)]
1819

compiler/rustc_serialize/src/serialize.rs

+11-23
Original file line numberDiff line numberDiff line change
@@ -539,12 +539,8 @@ impl<S: Encoder, T: Encodable<S>> Encodable<S> for [T] {
539539

540540
impl<S: Encoder, T: Encodable<S>> Encodable<S> for Vec<T> {
541541
fn encode(&self, s: &mut S) -> Result<(), S::Error> {
542-
s.emit_seq(self.len(), |s| {
543-
for (i, e) in self.iter().enumerate() {
544-
s.emit_seq_elt(i, |s| e.encode(s))?
545-
}
546-
Ok(())
547-
})
542+
let slice: &[T] = self;
543+
slice.encode(s)
548544
}
549545
}
550546

@@ -560,22 +556,18 @@ impl<D: Decoder, T: Decodable<D>> Decodable<D> for Vec<T> {
560556
}
561557
}
562558

563-
impl<S: Encoder> Encodable<S> for [u8; 20] {
559+
impl<S: Encoder, T: Encodable<S>, const N: usize> Encodable<S> for [T; N] {
564560
fn encode(&self, s: &mut S) -> Result<(), S::Error> {
565-
s.emit_seq(self.len(), |s| {
566-
for (i, e) in self.iter().enumerate() {
567-
s.emit_seq_elt(i, |s| e.encode(s))?
568-
}
569-
Ok(())
570-
})
561+
let slice: &[T] = self;
562+
slice.encode(s)
571563
}
572564
}
573565

574-
impl<D: Decoder> Decodable<D> for [u8; 20] {
575-
fn decode(d: &mut D) -> Result<[u8; 20], D::Error> {
566+
impl<D: Decoder, const N: usize> Decodable<D> for [u8; N] {
567+
fn decode(d: &mut D) -> Result<[u8; N], D::Error> {
576568
d.read_seq(|d, len| {
577-
assert!(len == 20);
578-
let mut v = [0u8; 20];
569+
assert!(len == N);
570+
let mut v = [0u8; N];
579571
for i in 0..len {
580572
v[i] = d.read_seq_elt(i, |d| Decodable::decode(d))?;
581573
}
@@ -589,12 +581,8 @@ where
589581
[T]: ToOwned<Owned = Vec<T>>,
590582
{
591583
fn encode(&self, s: &mut S) -> Result<(), S::Error> {
592-
s.emit_seq(self.len(), |s| {
593-
for (i, e) in self.iter().enumerate() {
594-
s.emit_seq_elt(i, |s| e.encode(s))?
595-
}
596-
Ok(())
597-
})
584+
let slice: &[T] = self;
585+
slice.encode(s)
598586
}
599587
}
600588

0 commit comments

Comments
 (0)