#![deny(rustdoc::broken_intra_doc_links)]
use crate::{
grids::traits::Grid1DIntervalBuilder,
intervals::{unbounded::*, *},
};
use duplicate::duplicate_item;
use num_valid::core::errors::capture_backtrace;
mod sealed {
use super::*;
pub trait SealedToIntervalFinitePositiveLength {}
#[duplicate_item(
T;
[IntervalClosed];
[IntervalOpen];
[IntervalLowerClosedUpperOpen];
[IntervalLowerOpenUpperClosed];
)]
impl<RealType: RealScalar> SealedToIntervalFinitePositiveLength for T<RealType> {}
pub trait SealedToIntervalInfiniteLength {}
#[duplicate_item(
T;
[IntervalLowerClosedUpperUnbounded];
[IntervalLowerOpenUpperUnbounded];
[IntervalLowerUnboundedUpperClosed];
[IntervalLowerUnboundedUpperOpen];
[IntervalLowerUnboundedUpperUnbounded];
)]
impl<RealType: RealScalar> SealedToIntervalInfiniteLength for T<RealType> {}
pub trait SealedToInterval {}
#[duplicate_item(
T;
[IntervalClosed];
[IntervalOpen];
[IntervalLowerClosedUpperOpen];
[IntervalLowerOpenUpperClosed];
[IntervalLowerClosedUpperUnbounded];
[IntervalLowerOpenUpperUnbounded];
[IntervalLowerUnboundedUpperClosed];
[IntervalLowerUnboundedUpperOpen];
[IntervalLowerUnboundedUpperUnbounded];
[IntervalFinitePositiveLength];
[IntervalFiniteLength];
[IntervalInfiniteLength];
[IntervalSingleton];
)]
impl<RealType: RealScalar> SealedToInterval for T<RealType> {}
}
trait ToIntervalFinitePositiveLength:
HasCoordType + sealed::SealedToIntervalFinitePositiveLength
{
fn to_interval_finite_positive_length(self) -> IntervalFinitePositiveLength<Self::CoordType>;
}
#[duplicate_item(
src tgt;
[IntervalClosed] [Closed];
[IntervalOpen] [Open];
[IntervalLowerClosedUpperOpen] [LowerClosedUpperOpen];
[IntervalLowerOpenUpperClosed] [LowerOpenUpperClosed];
)]
impl<RealType: RealScalar> ToIntervalFinitePositiveLength for src<RealType> {
fn to_interval_finite_positive_length(self) -> IntervalFinitePositiveLength<RealType> {
IntervalFinitePositiveLength::tgt(self)
}
}
trait ToIntervalInfiniteLength: HasCoordType + sealed::SealedToIntervalInfiniteLength {
fn to_interval_infinite_length(self) -> IntervalInfiniteLength<Self::CoordType>;
}
#[duplicate_item(
src tgt;
[IntervalLowerClosedUpperUnbounded] [LowerClosedUpperUnbounded];
[IntervalLowerOpenUpperUnbounded] [LowerOpenUpperUnbounded];
[IntervalLowerUnboundedUpperClosed] [LowerUnboundedUpperClosed];
[IntervalLowerUnboundedUpperOpen] [LowerUnboundedUpperOpen];
[IntervalLowerUnboundedUpperUnbounded] [LowerUnboundedUpperUnbounded];
)]
impl<RealType: RealScalar> ToIntervalInfiniteLength for src<RealType> {
#[inline(always)]
fn to_interval_infinite_length(self) -> IntervalInfiniteLength<RealType> {
IntervalInfiniteLength::tgt(self)
}
}
trait ToInterval: HasCoordType + sealed::SealedToInterval {
fn to_interval(self) -> Interval<Self::CoordType>;
}
#[duplicate_item(
src tgt;
[IntervalClosed] [Closed];
[IntervalOpen] [Open];
[IntervalLowerClosedUpperOpen] [LowerClosedUpperOpen];
[IntervalLowerOpenUpperClosed] [LowerOpenUpperClosed];
)]
impl<RealType: RealScalar> ToInterval for src<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::FiniteLength(IntervalFinitePositiveLength::tgt(self).into())
}
}
impl<RealType: RealScalar> ToInterval for IntervalSingleton<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::FiniteLength(IntervalFiniteLength::ZeroLength(self))
}
}
#[duplicate_item(
src tgt;
[IntervalLowerClosedUpperUnbounded] [LowerClosedUpperUnbounded];
[IntervalLowerOpenUpperUnbounded] [LowerOpenUpperUnbounded];
[IntervalLowerUnboundedUpperClosed] [LowerUnboundedUpperClosed];
[IntervalLowerUnboundedUpperOpen] [LowerUnboundedUpperOpen];
[IntervalLowerUnboundedUpperUnbounded] [LowerUnboundedUpperUnbounded];
)]
impl<RealType: RealScalar> ToInterval for src<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::InfiniteLength(IntervalInfiniteLength::tgt(self))
}
}
impl<RealType: RealScalar> ToInterval for IntervalFinitePositiveLength<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::FiniteLength(IntervalFiniteLength::PositiveLength(self))
}
}
impl<RealType: RealScalar> ToInterval for IntervalFiniteLength<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::FiniteLength(self)
}
}
impl<RealType: RealScalar> ToInterval for IntervalInfiniteLength<RealType> {
#[inline(always)]
fn to_interval(self) -> Interval<RealType> {
Interval::InfiniteLength(self)
}
}
#[duplicate_item(
T;
[Interval];
[IntervalFinitePositiveLength];
)]
impl<PartitionDomain1D: Grid1DIntervalBuilder> From<SubIntervalInPartition<PartitionDomain1D>>
for T<PartitionDomain1D::CoordType>
where
T<PartitionDomain1D::CoordType>: From<PartitionDomain1D>,
{
#[inline(always)]
fn from(src: SubIntervalInPartition<PartitionDomain1D>) -> Self {
match src {
SubIntervalInPartition::Single(interval) => interval.into(),
SubIntervalInPartition::First(interval) => interval.into(),
SubIntervalInPartition::Middle(interval) => interval.into(),
SubIntervalInPartition::Last(interval) => interval.into(),
}
}
}
impl<T> From<T> for Interval<T::CoordType>
where
T: ToInterval,
{
#[inline(always)]
fn from(interval: T) -> Self {
interval.to_interval()
}
}
impl<T> From<T> for IntervalFinitePositiveLength<T::CoordType>
where
T: ToIntervalFinitePositiveLength,
{
#[inline(always)]
fn from(interval: T) -> Self {
interval.to_interval_finite_positive_length()
}
}
impl<T> From<T> for IntervalFiniteLength<T::CoordType>
where
T: ToIntervalFinitePositiveLength,
{
#[inline(always)]
fn from(interval: T) -> Self {
IntervalFiniteLength::PositiveLength(IntervalFinitePositiveLength::from(interval))
}
}
impl<RealType: RealScalar> From<IntervalFinitePositiveLength<RealType>>
for IntervalFiniteLength<RealType>
{
#[inline(always)]
fn from(interval: IntervalFinitePositiveLength<RealType>) -> Self {
IntervalFiniteLength::PositiveLength(interval)
}
}
impl<RealType: RealScalar> From<IntervalSingleton<RealType>> for IntervalFiniteLength<RealType> {
#[inline(always)]
fn from(interval: IntervalSingleton<RealType>) -> Self {
IntervalFiniteLength::ZeroLength(interval)
}
}
impl<T> From<T> for IntervalInfiniteLength<T::CoordType>
where
T: ToIntervalInfiniteLength,
{
#[inline(always)]
fn from(interval: T) -> Self {
interval.to_interval_infinite_length()
}
}
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for IntervalFiniteLength<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
match interval {
Interval::FiniteLength(interval_finite_length) => Ok(interval_finite_length),
Interval::InfiniteLength(_) => Err(ErrorsIntervalConversion::NotIntervalFiniteLength {
interval,
backtrace: capture_backtrace(),
}),
}
}
}
#[inline(always)]
fn err_not_positive<RealType: RealScalar>(
interval: Interval<RealType>,
) -> ErrorsIntervalConversion<RealType> {
ErrorsIntervalConversion::NotIntervalPositiveLength {
interval,
backtrace: capture_backtrace(),
}
}
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for IntervalFinitePositiveLength<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
match interval {
Interval::FiniteLength(interval_finite_length) => match interval_finite_length {
IntervalFiniteLength::PositiveLength(interval_positive_length) => {
Ok(interval_positive_length)
}
IntervalFiniteLength::ZeroLength(interval_zero_length) => {
Err(err_not_positive(interval_zero_length.into()))
}
},
Interval::InfiniteLength(_) => Err(err_not_positive(interval)),
}
}
}
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for IntervalInfiniteLength<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
match interval {
Interval::InfiniteLength(interval_infinite_length) => Ok(interval_infinite_length),
_ => Err(ErrorsIntervalConversion::NotIntervalInfiniteLength {
interval,
backtrace: capture_backtrace(),
}),
}
}
}
#[duplicate_item(
src ok_enum err ;
[IntervalClosed] [Closed] [NotIntervalClosed];
[IntervalOpen] [Open] [NotIntervalOpen];
[IntervalLowerOpenUpperClosed] [LowerOpenUpperClosed] [NotIntervalLowerOpenUpperClosed];
[IntervalLowerClosedUpperOpen] [LowerClosedUpperOpen] [NotIntervalLowerClosedUpperOpen];
)]
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for src<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
let interval_finite_positive_length: IntervalFinitePositiveLength<RealType> =
interval.try_into()?;
match interval_finite_positive_length {
IntervalFinitePositiveLength::ok_enum(interval) => Ok(interval),
_ => Err(ErrorsIntervalConversion::err {
interval: interval_finite_positive_length.into(),
backtrace: capture_backtrace(),
}),
}
}
}
#[duplicate_item(
src ok_enum err ;
[IntervalClosed] [Closed] [NotIntervalClosed];
[IntervalOpen] [Open] [NotIntervalOpen];
[IntervalLowerOpenUpperClosed] [LowerOpenUpperClosed] [NotIntervalLowerOpenUpperClosed];
[IntervalLowerClosedUpperOpen] [LowerClosedUpperOpen] [NotIntervalLowerClosedUpperOpen];
)]
impl<RealType: RealScalar> TryFrom<IntervalFinitePositiveLength<RealType>> for src<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(
interval_finite_positive_length: IntervalFinitePositiveLength<RealType>,
) -> Result<Self, Self::Error> {
match interval_finite_positive_length {
IntervalFinitePositiveLength::ok_enum(interval) => Ok(interval),
_ => Err(ErrorsIntervalConversion::err {
interval: interval_finite_positive_length.into(),
backtrace: capture_backtrace(),
}),
}
}
}
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for IntervalSingleton<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
let interval_finite_length: IntervalFiniteLength<RealType> = interval.try_into()?;
match interval_finite_length {
IntervalFiniteLength::ZeroLength(singleton) => Ok(singleton),
_ => Err(ErrorsIntervalConversion::NotIntervalSingleton {
interval: interval_finite_length.into(),
backtrace: capture_backtrace(),
}),
}
}
}
#[duplicate_item(
src variant error_variant;
[IntervalLowerUnboundedUpperClosed] [LowerUnboundedUpperClosed] [NotIntervalLowerUnboundedUpperClosed];
[IntervalLowerUnboundedUpperOpen] [LowerUnboundedUpperOpen] [NotIntervalLowerUnboundedUpperOpen];
[IntervalLowerClosedUpperUnbounded] [LowerClosedUpperUnbounded] [NotIntervalLowerClosedUpperUnbounded];
[IntervalLowerOpenUpperUnbounded] [LowerOpenUpperUnbounded] [NotIntervalLowerOpenUpperUnbounded];
)]
impl<RealType: RealScalar> TryFrom<Interval<RealType>> for src<RealType> {
type Error = ErrorsIntervalConversion<RealType>;
fn try_from(interval: Interval<RealType>) -> Result<Self, Self::Error> {
let interval_infinite_length: IntervalInfiniteLength<RealType> = interval.try_into()?;
match interval_infinite_length {
IntervalInfiniteLength::variant(interval) => Ok(interval),
_ => Err(ErrorsIntervalConversion::error_variant {
interval: interval_infinite_length.into(),
backtrace: capture_backtrace(),
}),
}
}
}