Skip to content

Commit

Permalink
WIP can't use itertools because rust-itertools/itertools#499
Browse files Browse the repository at this point in the history
  • Loading branch information
ggutoski committed Sep 27, 2023
1 parent db8ebca commit ebecb87
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 3 deletions.
20 changes: 17 additions & 3 deletions utilities/Cargo.toml
Expand Up @@ -9,10 +9,11 @@ rust-version = { workspace = true }

[dependencies]
ark-ec = { version = "0.4.0", default-features = false }
ark-ff = { version = "0.4.0", default-features = false, features = [ "asm" ] }
ark-ff = { version = "0.4.0", default-features = false, features = ["asm"] }
ark-serialize = { version = "0.4.0", default-features = false }
ark-std = { version = "0.4.0", default-features = false }
digest = { version = "0.10.1", default-features = false }
itertools = { workspace = true }
rayon = { version = "1.5.0", optional = true }
serde = { version = "1.0", default-features = false, features = ["derive"] }
sha2 = { version = "0.10.1", default-features = false }
Expand All @@ -28,5 +29,18 @@ ark-ed-on-bn254 = "0.4.0"

[features]
default = []
std = ["ark-ff/std", "ark-std/std", "ark-ec/std", "ark-serialize/std", "digest/std", "serde/std", "sha2/std"]
parallel = ["ark-ff/parallel", "ark-std/parallel", "ark-ec/parallel", "dep:rayon"]
std = [
"ark-ff/std",
"ark-std/std",
"ark-ec/std",
"ark-serialize/std",
"digest/std",
"serde/std",
"sha2/std",
]
parallel = [
"ark-ff/parallel",
"ark-std/parallel",
"ark-ec/parallel",
"dep:rayon",
]
37 changes: 37 additions & 0 deletions utilities/src/conversion.rs
Expand Up @@ -10,9 +10,11 @@ use ark_std::{
borrow::Borrow,
cmp::min,
iter::{once, repeat},
marker::PhantomData,
mem,
vec::Vec,
};
use itertools::{Chunks, IntoChunks, Itertools};
use sha2::{Digest, Sha512};

/// Convert a scalar field element to a base field element.
Expand Down Expand Up @@ -289,6 +291,41 @@ fn compile_time_checks<F: Field>() -> (usize, usize, usize) {
(primefield_bytes_len, extension_degree, field_bytes_len)
}

// pub fn bytes_to_field_elements<B, F>(bytes: B) -> impl Iterator<Item = F>
// where
// F: Field,
// B: IntoIterator,
// B::Item: Borrow<u8>,
// {
// }

pub struct FieldElems<'a, I: Iterator, F> {
into_chunks_iter: IntoChunks<I>,
chunks_iter: Chunks<'a, I>,
final_byte_len: Option<usize>,
_phantom: PhantomData<F>,
primefield_bytes_len: usize,
extension_degree: usize,
field_bytes_len: usize,
}

impl<I: Iterator, F: Field> FieldElems<'_, I, F> {
pub(crate) fn new(iter: I) -> Self {
let (primefield_bytes_len, extension_degree, field_bytes_len) = compile_time_checks::<F>();
let into_chunks_iter = iter.chunks(field_bytes_len);
let chunks_iter = into_chunks_iter.into_iter();
Self {
into_chunks_iter,
chunks_iter,
final_byte_len: None,
_phantom: PhantomData,
primefield_bytes_len,
extension_degree,
field_bytes_len,
}
}
}

#[cfg(test)]
mod tests {
use crate::test_rng;
Expand Down

0 comments on commit ebecb87

Please sign in to comment.