From 4a68f2529ddacd6a750281c6a574a298812e19fb Mon Sep 17 00:00:00 2001 From: Cem Karan Date: Sat, 4 Jan 2020 12:29:36 -0500 Subject: [PATCH] feat: Derived serde::{Serialize, Deserialize} on all public types. This should make it possible to use serde to serialize and deserialize encoders/decoders while they are in use. This is makes it possible to ship them between processes as needed. --- Cargo.toml | 3 +++ src/arraymap.rs | 8 +++++--- src/base.rs | 10 +++++----- src/decoder.rs | 3 +++ src/encoder.rs | 3 +++ src/iterators.rs | 5 +++++ src/matrix.rs | 3 ++- src/octet.rs | 3 ++- src/pi_solver.rs | 3 +++ src/sparse_matrix.rs | 3 ++- src/sparse_vec.rs | 5 +++-- src/symbol.rs | 3 ++- 12 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e60e70d..9d7b0a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,9 @@ version = "1.0.0" edition = "2018" authors = ["Christopher Berner "] +[dependencies] +serde = {version = "1.0.102", features=["std", "derive"]} + [dev-dependencies] criterion = "0.3" primal = "0.2" diff --git a/src/arraymap.rs b/src/arraymap.rs index 03da5bb..e5c20c6 100644 --- a/src/arraymap.rs +++ b/src/arraymap.rs @@ -1,4 +1,6 @@ -#[derive(Clone)] +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct ArrayMap { offset: usize, elements: Vec>, @@ -50,7 +52,7 @@ impl ArrayMap { } } -#[derive(Clone)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct UsizeArrayMap { offset: usize, elements: Vec, @@ -85,7 +87,7 @@ impl UsizeArrayMap { } } -#[derive(Clone)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct BoolArrayMap { offset: usize, elements: Vec, diff --git a/src/base.rs b/src/base.rs index d0df033..5712db5 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,10 +1,10 @@ -use std::cmp::min; - use crate::rng::rand; use crate::systematic_constants::SYSTEMATIC_INDICES_AND_PARAMETERS; +use serde::{Deserialize, Serialize}; +use std::cmp::min; // As defined in section 3.2 -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct PayloadId { source_block_number: u8, encoding_symbol_id: u32, @@ -49,7 +49,7 @@ impl PayloadId { /// Contains encoding symbols generated from a source block. /// /// As defined in section [4.4.2](https://tools.ietf.org/html/rfc6330#section-4.4.2). -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct EncodingPacket { pub(crate) payload_id: PayloadId, pub(crate) data: Vec, @@ -92,7 +92,7 @@ impl EncodingPacket { } // As defined in section 3.3.2 and 3.3.3 -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct ObjectTransmissionInformation { transfer_length: u64, // Limited to u40 symbol_size: u16, diff --git a/src/decoder.rs b/src/decoder.rs index 13d87c9..c6f4581 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -14,8 +14,10 @@ use crate::systematic_constants::num_ldpc_symbols; use crate::systematic_constants::{ calculate_p1, extended_source_block_symbols, num_lt_symbols, num_pi_symbols, systematic_index, }; +use serde::{Deserialize, Serialize}; use std::collections::HashSet; +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Decoder { config: ObjectTransmissionInformation, block_decoders: Vec, @@ -104,6 +106,7 @@ impl Decoder { } } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct SourceBlockDecoder { source_block_id: u8, symbol_size: u16, diff --git a/src/encoder.rs b/src/encoder.rs index c2e3d07..5f10dbf 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -15,9 +15,11 @@ use crate::systematic_constants::num_lt_symbols; use crate::systematic_constants::num_pi_symbols; use crate::systematic_constants::{calculate_p1, systematic_index}; use crate::ObjectTransmissionInformation; +use serde::{Deserialize, Serialize}; pub const SPARSE_MATRIX_THRESHOLD: u32 = 250; +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct Encoder { config: ObjectTransmissionInformation, blocks: Vec, @@ -96,6 +98,7 @@ impl Encoder { } } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct SourceBlockEncoder { source_block_id: u8, source_symbols: Vec, diff --git a/src/iterators.rs b/src/iterators.rs index 697bde4..8758966 100644 --- a/src/iterators.rs +++ b/src/iterators.rs @@ -1,6 +1,8 @@ use crate::octet::Octet; use crate::sparse_vec::{SparseOctetVec, SparseValuelessVec}; +use serde::{Deserialize, Serialize}; +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct KeyIter { sparse: bool, dense_index: usize, @@ -24,6 +26,7 @@ impl Iterator for KeyIter { } } +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct BorrowedKeyIter<'a> { sparse: bool, dense_index: usize, @@ -131,6 +134,7 @@ impl<'a> Iterator for BorrowedKeyIter<'a> { } } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct ClonedOctetIter { sparse: bool, end_col: usize, @@ -166,6 +170,7 @@ impl Iterator for ClonedOctetIter { } } +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct OctetIter<'a> { sparse: bool, start_col: usize, diff --git a/src/matrix.rs b/src/matrix.rs index fd2c522..1578a74 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -3,6 +3,7 @@ use crate::octet::Octet; use crate::octets::fused_addassign_mul_scalar; use crate::octets::{add_assign, count_ones_and_nonzeros, mulassign_scalar}; use crate::util::get_both_indices; +use serde::{Deserialize, Serialize}; pub trait OctetMatrix: Clone { fn new( @@ -62,7 +63,7 @@ pub trait OctetMatrix: Clone { fn resize(&mut self, new_height: usize, new_width: usize); } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct DenseOctetMatrix { height: usize, width: usize, diff --git a/src/octet.rs b/src/octet.rs index b47bf81..f9ba930 100644 --- a/src/octet.rs +++ b/src/octet.rs @@ -1,3 +1,4 @@ +use serde::{Deserialize, Serialize}; use std::ops::Add; use std::ops::AddAssign; use std::ops::Div; @@ -1194,7 +1195,7 @@ const fn calculate_octet_mul_table_inner(x: usize) -> [u8; 256] { ]; } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct Octet { value: u8, } diff --git a/src/pi_solver.rs b/src/pi_solver.rs index b91fe0c..014b00a 100644 --- a/src/pi_solver.rs +++ b/src/pi_solver.rs @@ -8,7 +8,9 @@ use crate::systematic_constants::num_intermediate_symbols; use crate::systematic_constants::num_ldpc_symbols; use crate::systematic_constants::num_pi_symbols; use crate::util::get_both_indices; +use serde::{Deserialize, Serialize}; +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] struct FirstPhaseRowSelectionStats { original_degree: UsizeArrayMap, non_zeros_per_row: UsizeArrayMap, @@ -379,6 +381,7 @@ impl FirstPhaseRowSelectionStats { // See section 5.4.2.1 #[allow(non_snake_case)] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Ord, Hash)] pub struct IntermediateSymbolDecoder { A: T, X: T, diff --git a/src/sparse_matrix.rs b/src/sparse_matrix.rs index dbe095f..071a6af 100644 --- a/src/sparse_matrix.rs +++ b/src/sparse_matrix.rs @@ -5,6 +5,7 @@ use crate::octets::{add_assign, mulassign_scalar}; use crate::octets::{count_ones_and_nonzeros, fused_addassign_mul_scalar}; use crate::sparse_vec::{SparseOctetVec, SparseValuelessVec}; use crate::util::get_both_indices; +use serde::{Deserialize, Serialize}; use std::cmp::min; // Stores a matrix in sparse representation, with an optional dense block for the right most columns, @@ -21,7 +22,7 @@ use std::cmp::min; // |--------------------------| // | (optional) dense rows | // |--------------------------| -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct SparseOctetMatrix { height: usize, width: usize, diff --git a/src/sparse_vec.rs b/src/sparse_vec.rs index e7d87c2..99c4012 100644 --- a/src/sparse_vec.rs +++ b/src/sparse_vec.rs @@ -1,7 +1,8 @@ use crate::octet::Octet; +use serde::{Deserialize, Serialize}; use std::cmp::Ordering; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct SparseOctetVec { // Kept sorted by the usize (key) elements: Vec<(usize, Octet)>, @@ -143,7 +144,7 @@ impl SparseOctetVec { } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct SparseValuelessVec { // Kept sorted elements: Vec, diff --git a/src/symbol.rs b/src/symbol.rs index 26b1869..bfa2354 100644 --- a/src/symbol.rs +++ b/src/symbol.rs @@ -2,10 +2,11 @@ use crate::octet::Octet; use crate::octets::add_assign; use crate::octets::fused_addassign_mul_scalar; use crate::octets::mulassign_scalar; +use serde::{Deserialize, Serialize}; use std::ops::AddAssign; /// Elementary unit of data, for encoding/decoding purposes. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord, Serialize, Deserialize, Hash)] pub struct Symbol { value: Vec, }