apple-quant-algorithmic 0.4.0

Apple Quant's algorithmic library.
Documentation
use apple_quant_core::log::error;

pub(crate) const ZERO_ERROR: &'static str = "ZeroableExt operation failed while `debug_assertions`.";

pub trait ZeroableExt<T: Sized>
where
	Self: Sized,
{
	fn as_optional_nonzero_ref(
		&self,
	) -> Option<&T>;

	fn as_optional_nonzero_mut(
		&mut self,
	) -> Option<&mut T>;

	fn into_optional_nonzero(
		self,
	) -> Option<T>;

	fn as_zeroable(
		&self,
	) -> T;

	fn into_zeroable(
		self,
	) -> T;

	fn as_nonzero_unchecked_ref(
		&self,
	) -> &T;

	fn as_nonzero_unchecked_mut(
		&mut self,
	) -> &mut T;

	fn into_nonzero_unchecked(
		self,
	) -> T;

	fn as_nonzero_unchecked_release(
		&self,
	) -> &T {
		#[cfg(debug_assertions)]
		match self.as_optional_nonzero_ref() {
			Some(t) => t,
			None => {
				error!("{ZERO_ERROR}");
				panic!();
			},
		}

		#[cfg(not(debug_assertions))]
		self.as_nonzero_unchecked_ref()
	}

	fn as_nonzero_unchecked_release_mut(
		&mut self,
	) -> &mut T {
		#[cfg(debug_assertions)]
		match self.as_optional_nonzero_mut() {
			Some(t) => t,
			None => {
				error!("{ZERO_ERROR}");
				panic!();
			},
		}

		#[cfg(not(debug_assertions))]
		self.as_nonzero_unchecked_mut()
	}

	fn into_nonzero_unchecked_release(
		self,
	) -> T {
		#[cfg(debug_assertions)]
		match self.into_optional_nonzero() {
			Some(t) => t,
			None => {
				error!("{ZERO_ERROR}");
				panic!();
			},
		}

		#[cfg(not(debug_assertions))]
		self.into_nonzero_unchecked()
	}
}