use std::u64; /// A `Body` size hint /// /// The default implementation returns: /// /// * 0 for `lower` /// * `None` for `upper`. #[derive(Debug, Default, Clone)] pub struct SizeHint { lower: u64, upper: Option, } impl SizeHint { /// Returns a new `SizeHint` with default values #[inline] pub fn new() -> SizeHint { SizeHint::default() } /// Returns a new `SizeHint` with both upper and lower bounds set to the /// given value. #[inline] pub fn with_exact(value: u64) -> SizeHint { SizeHint { lower: value, upper: Some(value), } } /// Returns the lower bound of data that the `Body` will yield before /// completing. #[inline] pub fn lower(&self) -> u64 { self.lower } /// Set the value of the `lower` hint. /// /// # Panics /// /// The function panics if `value` is greater than `upper`. #[inline] pub fn set_lower(&mut self, value: u64) { assert!(value <= self.upper.unwrap_or(u64::MAX)); self.lower = value; } /// Returns the upper bound of data the `Body` will yield before /// completing, or `None` if the value is unknown. #[inline] pub fn upper(&self) -> Option { self.upper } /// Set the value of the `upper` hint value. /// /// # Panics /// /// This function panics if `value` is less than `lower`. #[inline] pub fn set_upper(&mut self, value: u64) { assert!(value >= self.lower, "`value` is less than than `lower`"); self.upper = Some(value); } /// Returns the exact size of data that will be yielded **if** the /// `lower` and `upper` bounds are equal. #[inline] pub fn exact(&self) -> Option { if Some(self.lower) == self.upper { self.upper } else { None } } /// Set the value of the `lower` and `upper` bounds to exactly the same. #[inline] pub fn set_exact(&mut self, value: u64) { self.lower = value; self.upper = Some(value); } }