Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ethbloom/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ default = ["std", "serialize", "rustc-hex"]
std = ["fixed-hash/std", "crunchy/std"]
serialize = ["std", "impl-serde"]
rustc-hex = ["fixed-hash/rustc-hex"]
arbitrary = ["fixed-hash/arbitrary"]

[[bench]]
name = "bloom"
Expand Down
1 change: 1 addition & 0 deletions ethereum-types/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ serde_json = "1.0.41"
default = ["std", "serialize"]
std = ["uint-crate/std", "fixed-hash/std", "ethbloom/std", "primitive-types/std"]
serialize = ["std", "impl-serde", "primitive-types/serde", "ethbloom/serialize"]
arbitrary = ["fixed-hash/arbitrary", "uint-crate/arbitrary"]
Comment thread
kirk-baird marked this conversation as resolved.
Outdated
1 change: 1 addition & 0 deletions fixed-hash/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ quickcheck = { version = "0.9.0", optional = true }
rand = { version = "0.7.2", optional = true, default-features = false }
rustc-hex = { version = "2.0.1", optional = true, default-features = false }
static_assertions = "1.0.0"
arbitrary = { version = "0.4", optional = true }

[dev-dependencies]
rand_xorshift = "0.2.0"
Expand Down
2 changes: 2 additions & 0 deletions fixed-hash/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,5 @@ fixed-hash = { version = "0.3", default-features = false }
- Disabled by default.
- `api-dummy`: Generate a dummy hash type for API documentation.
- Enabled by default at `docs.rs`
- `arbitrary`: Allow for creation of a hash from random unstructured input.
- Disabled by default.
37 changes: 37 additions & 0 deletions fixed-hash/src/hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ macro_rules! construct_fixed_hash {
impl_cmp_for_fixed_hash!($name);
impl_rustc_hex_for_fixed_hash!($name);
impl_quickcheck_for_fixed_hash!($name);
impl_arbitrary_for_fixed_hash!($name);
}
}

Expand Down Expand Up @@ -636,6 +637,42 @@ macro_rules! impl_quickcheck_for_fixed_hash {
};
}

// Implementation for disabled `arbitrary` crate support.
//
// # Note
//
// Feature guarded macro definitions instead of feature guarded impl blocks
// to work around the problems of introducing `arbitrary` crate feature in
// a user crate.
#[cfg(not(feature = "arbitrary"))]
#[macro_export]
#[doc(hidden)]
macro_rules! impl_arbitrary_for_fixed_hash {
( $name:ident ) => {};
}

// Implementation for enabled `arbitrary` crate support.
Comment thread
kirk-baird marked this conversation as resolved.
Outdated
//
// # Note
//
// Feature guarded macro definitions instead of feature guarded impl blocks
// to work around the problems of introducing `arbitrary` crate feature in
// a user crate.
#[cfg(feature = "arbitrary")]
#[macro_export]
#[doc(hidden)]
macro_rules! impl_arbitrary_for_fixed_hash {
( $name:ident ) => {
impl $crate::arbitrary::Arbitrary for $name {
fn arbitrary(u: &mut $crate::arbitrary::Unstructured<'_>) -> $crate::arbitrary::Result<Self> {
let mut res = Self::zero();
u.fill_buffer(&mut res.0)?;
Ok(Self::from(res))
}
}
};
}

#[macro_export]
#[doc(hidden)]
macro_rules! impl_ops_for_hash {
Expand Down
4 changes: 4 additions & 0 deletions fixed-hash/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ pub use rand;
#[doc(hidden)]
pub use quickcheck;

#[cfg(feature = "arbitrary")]
#[doc(hidden)]
pub use arbitrary;

#[macro_use]
mod hash;

Expand Down
1 change: 1 addition & 0 deletions primitive-types/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ rustc-hex = ["fixed-hash/rustc-hex"]
serde = ["std", "impl-serde"]
codec = ["impl-codec"]
rlp = ["impl-rlp"]
arbitrary = ["fixed-hash/arbitrary", "uint/arbitrary"]
1 change: 1 addition & 0 deletions uint/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ qc = { package = "quickcheck", version = "0.9.0", optional = true }
rand = { version = "0.7.2", default-features = false, optional = true }
rustc-hex = { version = "2.0.1", default-features = false }
static_assertions = "1.0.0"
arbitrary = { version = "0.4", optional = true }

[features]
default = ["std"]
Expand Down
2 changes: 2 additions & 0 deletions uint/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,5 @@ see fuzz [README.md](fuzz/README.md)
- Enabled by default.
- `quickcheck`: Enable quickcheck-style property testing
- Use with `cargo test --release --features=quickcheck`.
- `arbitrary`: Allow for creation of an `uint` object from random unstructured input.
Comment thread
kirk-baird marked this conversation as resolved.
Outdated
- Disabled by default.
4 changes: 4 additions & 0 deletions uint/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ pub use qc;
#[doc(hidden)]
pub use rand;

#[cfg(feature = "arbitrary")]
#[doc(hidden)]
pub use arbitrary;

#[doc(hidden)]
pub use static_assertions;

Expand Down
24 changes: 24 additions & 0 deletions uint/src/uint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1554,6 +1554,7 @@ macro_rules! construct_uint {
// `$n_words * 8` because macro expects bytes and
// uints use 64 bit (8 byte) words
$crate::impl_quickcheck_arbitrary_for_uint!($name, ($n_words * 8));
$crate::impl_arbitrary_for_uint!($name, ($n_words * 8));
}
}

Expand Down Expand Up @@ -1632,3 +1633,26 @@ macro_rules! impl_quickcheck_arbitrary_for_uint {
macro_rules! impl_quickcheck_arbitrary_for_uint {
($uint: ty, $n_bytes: tt) => {};
}


#[cfg(feature = "arbitrary")]
#[macro_export]
#[doc(hidden)]
macro_rules! impl_arbitrary_for_uint {
($uint: ty, $n_bytes: tt) => {
impl $crate::arbitrary::Arbitrary for $uint {
fn arbitrary(u: &mut $crate::arbitrary::Unstructured<'_>) -> $crate::arbitrary::Result<Self> {
let mut res = [0u8; $n_bytes];
u.fill_buffer(&mut res)?;
Ok(Self::from(res))
Comment thread
ordian marked this conversation as resolved.
}
}
};
}

#[cfg(not(feature = "arbitrary"))]
#[macro_export]
#[doc(hidden)]
macro_rules! impl_arbitrary_for_uint {
($uint: ty, $n_bytes: tt) => {};
}