use num_derive::{FromPrimitive, NumOps, ToPrimitive};
use speedy::{Context, Readable, Reader, Writable, Writer};
use std::convert::From;
use std::mem::size_of;
#[derive(
Copy, Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, NumOps, FromPrimitive, ToPrimitive,
)]
pub struct SequenceNumber_t(i64);
impl SequenceNumber_t {
pub const SEQUENCENUMBER_UNKNOWN: SequenceNumber_t =
SequenceNumber_t((std::u32::MAX as i64) << 32);
}
impl From<i64> for SequenceNumber_t {
fn from(value: i64) -> Self {
SequenceNumber_t(value)
}
}
impl From<SequenceNumber_t> for i64 {
fn from(sequence_number: SequenceNumber_t) -> Self {
sequence_number.0
}
}
checked_impl!(CheckedAdd, checked_add, SequenceNumber_t);
checked_impl!(CheckedSub, checked_sub, SequenceNumber_t);
checked_impl!(CheckedMul, checked_mul, SequenceNumber_t);
checked_impl!(CheckedDiv, checked_div, SequenceNumber_t);
impl<'a, C: Context> Readable<'a, C> for SequenceNumber_t {
#[inline]
fn read_from<R: Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> {
let high: i32 = reader.read_value()?;
let low: u32 = reader.read_value()?;
Ok(SequenceNumber_t(((i64::from(high)) << 32) + i64::from(low)))
}
#[inline]
fn minimum_bytes_needed() -> usize {
size_of::<Self>()
}
}
impl<C: Context> Writable<C> for SequenceNumber_t {
#[inline]
fn write_to<T: ?Sized + Writer<C>>(&self, writer: &mut T) -> Result<(), C::Error> {
writer.write_i32((self.0 >> 32) as i32)?;
writer.write_u32(self.0 as u32)?;
Ok(())
}
}
impl Default for SequenceNumber_t {
fn default() -> SequenceNumber_t {
SequenceNumber_t(1)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sequence_number_starts_by_default_from_one() {
assert_eq!(SequenceNumber_t::from(1), SequenceNumber_t::default());
}
serialization_test!( type = SequenceNumber_t,
{
sequence_number_default,
SequenceNumber_t::default(),
le = [0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00],
be = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]
},
{
sequence_number_unknown,
SequenceNumber_t::SEQUENCENUMBER_UNKNOWN,
le = [0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00],
be = [0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00]
},
{
sequence_number_non_zero,
SequenceNumber_t::from(0x0011223344556677),
le = [0x33, 0x22, 0x11, 0x00, 0x77, 0x66, 0x55, 0x44],
be = [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]
});
}