use crate::mutator::Mutator;
use crate::rand::Rng;
use crate::types::*;
use byteorder::ByteOrder;
use num_traits::Bounded;
use std::fmt::Debug;
use std::io::Write;
pub trait BinarySerialize {
fn binary_serialize<W: Write, E: ByteOrder>(&self, buffer: &mut W) -> usize;
}
pub trait SerializedSize {
fn serialized_size(&self) -> usize;
fn min_nonzero_elements_size() -> usize;
fn max_default_object_size() -> usize {
Self::min_nonzero_elements_size()
}
fn min_enum_variant_size(&self) -> usize {
Self::min_nonzero_elements_size()
}
}
pub trait NewFuzzed {
type RangeType: Debug + Bounded + Default;
fn new_fuzzed<R: Rng>(
mutator: &mut Mutator<R>,
constraints: Option<&Constraints<Self::RangeType>>,
) -> Self;
}
pub trait Mutatable {
type RangeType: Debug + Bounded + Default;
fn mutate<R: Rng>(&mut self, mutator: &mut Mutator<R>, constraints: Option<&Constraints<Self::RangeType>>);
}
pub trait Fixup {
fn fixup<R: Rng>(&mut self, mutator: &mut Mutator<R>);
}
impl<T> Fixup for T {
default fn fixup<R: Rng>(&mut self, _mutator: &mut Mutator<R>) { }
}
#[doc(hidden)]
pub trait DangerousNumber<T> {
fn select_dangerous_number<R: Rng>(rng: &mut R) -> T;
fn dangerous_number_at_index(idx: usize) -> T;
fn dangerous_numbers_len() -> usize;
}
pub trait ToPrimitive {
type Output;
fn to_primitive(&self) -> Self::Output;
}
pub trait VariableSizeObject {
fn is_variable_size() -> bool;
}
impl<T> VariableSizeObject for T {
default fn is_variable_size() -> bool {
false
}
}
impl<T> VariableSizeObject for Vec<T> {
fn is_variable_size() -> bool {
true
}
}
impl VariableSizeObject for Utf8String {
fn is_variable_size() -> bool {
true
}
}
impl VariableSizeObject for AsciiString {
fn is_variable_size() -> bool {
true
}
}