Added support for NonZero* types

This commit is contained in:
Victor Koenders 2021-10-16 14:14:15 +02:00
parent 9420d03762
commit a0469e08ef
5 changed files with 242 additions and 25 deletions

View File

@ -1,13 +1,16 @@
use super::{BorrowDecodable, BorrowDecode, Decodable, Decode};
use crate::error::{DecodeError, IntegerType};
use core::{ use core::{
cell::{Cell, RefCell}, cell::{Cell, RefCell},
num::{
NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
},
ops::{Bound, Range, RangeInclusive}, ops::{Bound, Range, RangeInclusive},
time::Duration, time::Duration,
}; };
use super::{BorrowDecodable, BorrowDecode, Decodable, Decode}; impl Decodable for bool {
use crate::error::DecodeError;
impl<'de> Decodable for bool {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
match decoder.decode_u8()? { match decoder.decode_u8()? {
0 => Ok(false), 0 => Ok(false),
@ -17,91 +20,187 @@ impl<'de> Decodable for bool {
} }
} }
impl<'de> Decodable for u8 { impl Decodable for u8 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_u8() decoder.decode_u8()
} }
} }
impl<'de> Decodable for u16 { impl Decodable for NonZeroU8 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroU8::new(decoder.decode_u8()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::U8,
})
}
}
impl Decodable for u16 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_u16() decoder.decode_u16()
} }
} }
impl<'de> Decodable for u32 { impl Decodable for NonZeroU16 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroU16::new(decoder.decode_u16()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::U16,
})
}
}
impl Decodable for u32 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_u32() decoder.decode_u32()
} }
} }
impl<'de> Decodable for u64 { impl Decodable for NonZeroU32 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroU32::new(decoder.decode_u32()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::U32,
})
}
}
impl Decodable for u64 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_u64() decoder.decode_u64()
} }
} }
impl<'de> Decodable for u128 { impl Decodable for NonZeroU64 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroU64::new(decoder.decode_u64()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::U64,
})
}
}
impl Decodable for u128 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_u128() decoder.decode_u128()
} }
} }
impl<'de> Decodable for usize { impl Decodable for NonZeroU128 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroU128::new(decoder.decode_u128()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::U128,
})
}
}
impl Decodable for usize {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_usize() decoder.decode_usize()
} }
} }
impl<'de> Decodable for i8 { impl Decodable for NonZeroUsize {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroUsize::new(decoder.decode_usize()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::Usize,
})
}
}
impl Decodable for i8 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_i8() decoder.decode_i8()
} }
} }
impl<'de> Decodable for i16 { impl Decodable for NonZeroI8 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroI8::new(decoder.decode_i8()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::I8,
})
}
}
impl Decodable for i16 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_i16() decoder.decode_i16()
} }
} }
impl<'de> Decodable for i32 { impl Decodable for NonZeroI16 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroI16::new(decoder.decode_i16()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::I16,
})
}
}
impl Decodable for i32 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_i32() decoder.decode_i32()
} }
} }
impl<'de> Decodable for i64 { impl Decodable for NonZeroI32 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroI32::new(decoder.decode_i32()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::I32,
})
}
}
impl Decodable for i64 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_i64() decoder.decode_i64()
} }
} }
impl<'de> Decodable for i128 { impl Decodable for NonZeroI64 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroI64::new(decoder.decode_i64()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::I64,
})
}
}
impl Decodable for i128 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_i128() decoder.decode_i128()
} }
} }
impl<'de> Decodable for isize { impl Decodable for NonZeroI128 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroI128::new(decoder.decode_i128()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::I128,
})
}
}
impl Decodable for isize {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_isize() decoder.decode_isize()
} }
} }
impl<'de> Decodable for f32 { impl Decodable for NonZeroIsize {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
NonZeroIsize::new(decoder.decode_isize()?).ok_or(DecodeError::NonZeroTypeIsZero {
non_zero_type: IntegerType::Isize,
})
}
}
impl Decodable for f32 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_f32() decoder.decode_f32()
} }
} }
impl<'de> Decodable for f64 { impl Decodable for f64 {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_f64() decoder.decode_f64()
} }
} }
impl<'de> Decodable for char { impl Decodable for char {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_char() decoder.decode_char()
} }
@ -121,19 +220,19 @@ impl<'a, 'de: 'a> BorrowDecodable<'de> for &'a str {
} }
} }
impl<'de, const N: usize> Decodable for [u8; N] { impl<const N: usize> Decodable for [u8; N] {
fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(mut decoder: D) -> Result<Self, DecodeError> {
decoder.decode_array() decoder.decode_array()
} }
} }
impl<'de, T> Decodable for core::marker::PhantomData<T> { impl<T> Decodable for core::marker::PhantomData<T> {
fn decode<D: Decode>(_: D) -> Result<Self, DecodeError> { fn decode<D: Decode>(_: D) -> Result<Self, DecodeError> {
Ok(core::marker::PhantomData) Ok(core::marker::PhantomData)
} }
} }
impl<'de, T> Decodable for Option<T> impl<T> Decodable for Option<T>
where where
T: Decodable, T: Decodable,
{ {
@ -155,7 +254,7 @@ where
} }
} }
impl<'de, T, U> Decodable for Result<T, U> impl<T, U> Decodable for Result<T, U>
where where
T: Decodable, T: Decodable,
U: Decodable, U: Decodable,

View File

@ -2,6 +2,10 @@ use super::{Encode, Encodeable};
use crate::error::EncodeError; use crate::error::EncodeError;
use core::{ use core::{
cell::{Cell, RefCell}, cell::{Cell, RefCell},
num::{
NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
},
ops::{Bound, Range, RangeInclusive}, ops::{Bound, Range, RangeInclusive},
time::Duration, time::Duration,
}; };
@ -18,72 +22,144 @@ impl Encodeable for u8 {
} }
} }
impl Encodeable for NonZeroU8 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for u16 { impl Encodeable for u16 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_u16(*self) encoder.encode_u16(*self)
} }
} }
impl Encodeable for NonZeroU16 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for u32 { impl Encodeable for u32 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_u32(*self) encoder.encode_u32(*self)
} }
} }
impl Encodeable for NonZeroU32 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for u64 { impl Encodeable for u64 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_u64(*self) encoder.encode_u64(*self)
} }
} }
impl Encodeable for NonZeroU64 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for u128 { impl Encodeable for u128 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_u128(*self) encoder.encode_u128(*self)
} }
} }
impl Encodeable for NonZeroU128 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for usize { impl Encodeable for usize {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_usize(*self) encoder.encode_usize(*self)
} }
} }
impl Encodeable for NonZeroUsize {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for i8 { impl Encodeable for i8 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_i8(*self) encoder.encode_i8(*self)
} }
} }
impl Encodeable for NonZeroI8 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for i16 { impl Encodeable for i16 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_i16(*self) encoder.encode_i16(*self)
} }
} }
impl Encodeable for NonZeroI16 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for i32 { impl Encodeable for i32 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_i32(*self) encoder.encode_i32(*self)
} }
} }
impl Encodeable for NonZeroI32 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for i64 { impl Encodeable for i64 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_i64(*self) encoder.encode_i64(*self)
} }
} }
impl Encodeable for NonZeroI64 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for i128 { impl Encodeable for i128 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_i128(*self) encoder.encode_i128(*self)
} }
} }
impl Encodeable for NonZeroI128 {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for isize { impl Encodeable for isize {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_isize(*self) encoder.encode_isize(*self)
} }
} }
impl Encodeable for NonZeroIsize {
fn encode<E: Encode>(&self, encoder: E) -> Result<(), EncodeError> {
self.get().encode(encoder)
}
}
impl Encodeable for f32 { impl Encodeable for f32 {
fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> { fn encode<E: Encode>(&self, mut encoder: E) -> Result<(), EncodeError> {
encoder.encode_f32(*self) encoder.encode_f32(*self)

View File

@ -59,6 +59,12 @@ pub enum DecodeError {
found: IntegerType, found: IntegerType,
}, },
/// The decoder tried to decode any of the `NonZero*` types but the value is zero
NonZeroTypeIsZero {
/// The type that was being read from the reader
non_zero_type: IntegerType,
},
/// Invalid enum variant was found. The decoder tried to decode variant index `found`, but the variant index should be between `min` and `max`. /// Invalid enum variant was found. The decoder tried to decode variant index `found`, but the variant index should be between `min` and `max`.
UnexpectedVariant { UnexpectedVariant {
/// The type name that was being decoded. /// The type name that was being decoded.
@ -104,9 +110,17 @@ pub enum DecodeError {
#[derive(Debug)] #[derive(Debug)]
#[allow(missing_docs)] #[allow(missing_docs)]
pub enum IntegerType { pub enum IntegerType {
U8,
U16, U16,
U32, U32,
U64, U64,
U128, U128,
USize, Usize,
I8,
I16,
I32,
I64,
I128,
Isize,
} }

View File

@ -142,7 +142,7 @@ pub fn varint_decode_usize<'a, R: Reader<'a>>(
}) })
} }
U128_BYTE => Err(DecodeError::InvalidIntegerType { U128_BYTE => Err(DecodeError::InvalidIntegerType {
expected: IntegerType::USize, expected: IntegerType::Usize,
found: IntegerType::U128, found: IntegerType::U128,
}), }),
x => Ok(x as usize), x => Ok(x as usize),

View File

@ -3,6 +3,7 @@ mod utils;
use core::cell::{Cell, RefCell}; use core::cell::{Cell, RefCell};
use core::ops::Bound; use core::ops::Bound;
use core::time::Duration; use core::time::Duration;
use std::num::*;
use utils::the_same; use utils::the_same;
#[test] #[test]
@ -82,6 +83,33 @@ fn test_numbers() {
the_same(Bound::<usize>::Unbounded); the_same(Bound::<usize>::Unbounded);
the_same(Bound::<usize>::Included(105)); the_same(Bound::<usize>::Included(105));
the_same(Bound::<usize>::Excluded(5)); the_same(Bound::<usize>::Excluded(5));
// NonZero* types
the_same(NonZeroU8::new(0));
the_same(NonZeroU8::new(123));
the_same(NonZeroU16::new(0));
the_same(NonZeroU16::new(12345));
the_same(NonZeroU32::new(0));
the_same(NonZeroU32::new(12345));
the_same(NonZeroU64::new(0));
the_same(NonZeroU64::new(12345));
the_same(NonZeroU128::new(0));
the_same(NonZeroU128::new(12345));
the_same(NonZeroUsize::new(0));
the_same(NonZeroUsize::new(12345));
the_same(NonZeroI8::new(0));
the_same(NonZeroI8::new(123));
the_same(NonZeroI16::new(0));
the_same(NonZeroI16::new(12345));
the_same(NonZeroI32::new(0));
the_same(NonZeroI32::new(12345));
the_same(NonZeroI64::new(0));
the_same(NonZeroI64::new(12345));
the_same(NonZeroI128::new(0));
the_same(NonZeroI128::new(12345));
the_same(NonZeroIsize::new(0));
the_same(NonZeroIsize::new(12345));
} }
#[test] #[test]