pub( crate ) mod private
{
use crate::*;
const LENGTH : usize = 3;
#[ allow( non_camel_case_types ) ]
pub trait X3NominalInterface
{
type Scalar : ScalarInterface;
fn _0( &self ) -> Self::Scalar;
fn _1( &self ) -> Self::Scalar;
#[ inline ]
fn x( &self ) -> Self::Scalar
{
self._0()
}
#[ inline ]
fn y( &self ) -> Self::Scalar
{
self._1()
}
#[ inline ]
fn z( &self ) -> Self::Scalar
{
self._2()
}
#[ inline ]
fn clone_as_tuple( &self ) -> ( Self::Scalar , Self::Scalar )
{
( self._0(), self._1(), self._2() )
}
#[ inline ]
fn clone_as_array( &self ) -> [ Self::Scalar ; LENGTH ]
{
[ self._0(), self._1(), self._2() ]
}
#[ inline ]
fn clone_as_canonical( &self ) -> X3< Self::Scalar >
{
X3::< Self::Scalar >( self._0(), self._1(), self._2() )
}
}
#[ allow( non_camel_case_types ) ]
pub trait X3BasicInterface : X3NominalInterface
{
fn make( _0 : Self::Scalar, _1 : Self::Scalar, _2 : Self::Scalar ) -> Self;
#[ inline ]
fn make_nan() -> Self
where
Self : Sized,
{
use crate::NanLikeInterface;
Self::make
(
Self::Scalar::make_nan_like(),
Self::Scalar::make_nan_like(),
Self::Scalar::make_nan_like(),
)
}
#[ inline ]
fn make_default() -> Self
where
Self : Sized,
{
Self::make( Self::Scalar::default(), Self::Scalar::default(), Self::Scalar::default() )
}
}
#[ allow( non_camel_case_types ) ]
pub trait X3CanonicalInterface : X3BasicInterface + Sized
{
#[ inline ]
fn assign< Src : X3BasicInterface< Scalar = Self::Scalar > >( &mut self, src : Src )
{
*self._0_mut() = src._0();
*self._1_mut() = src._1();
*self._2_mut() = src._2();
}
fn _0_ref( &self ) -> &Self::Scalar;
fn _1_ref( &self ) -> &Self::Scalar;
fn _2_ref( &self ) -> &Self::Scalar;
#[ inline ]
fn x_ref( &self ) -> &Self::Scalar
{
self._0_ref()
}
#[ inline ]
fn y_ref( &self ) -> &Self::Scalar
{
self._1_ref()
}
#[ inline ]
fn z_ref( &self ) -> &Self::Scalar
{
self._2_ref()
}
fn _0_mut( &mut self ) -> &mut Self::Scalar;
fn _1_mut( &mut self ) -> &mut Self::Scalar;
fn _2_mut( &mut self ) -> &mut Self::Scalar;
#[ inline ]
fn x_mut( &mut self ) -> &mut Self::Scalar
{
self._0_mut()
}
#[ inline ]
fn y_mut( &mut self ) -> &mut Self::Scalar
{
self._1_mut()
}
#[ inline ]
fn z_mut( &mut self ) -> &mut Self::Scalar
{
self._2_mut()
}
#[ inline ]
fn as_tuple( &self ) -> &( Self::Scalar , Self::Scalar , Self::Scalar )
{
debug_assert_eq!( core::mem::size_of::< Self >(), core::mem::size_of::< ( Self::Scalar , Self::Scalar , Self::Scalar ) >() );
unsafe
{
std::mem::transmute::< _, _ >( self.as_canonical() )
}
}
#[ inline ]
fn as_array( &self ) -> &[ Self::Scalar ; LENGTH ]
{
unsafe
{
std::mem::transmute::< _, _ >( self.as_canonical() )
}
}
#[ inline ]
fn as_slice( &self ) -> &[ Self::Scalar ]
{
&self.as_array()[ .. ]
}
fn as_canonical( &self ) -> &X3< Self::Scalar >;
#[ inline ]
fn as_tuple_mut( &mut self ) -> &mut ( Self::Scalar , Self::Scalar , Self::Scalar )
{
debug_assert_eq!( core::mem::size_of::< Self >(), core::mem::size_of::< ( Self::Scalar , Self::Scalar , Self::Scalar ) >() );
unsafe
{
std::mem::transmute::< _, _ >( self.as_canonical_mut() )
}
}
#[ inline ]
fn as_array_mut( &mut self ) -> &mut [ Self::Scalar ; LENGTH ]
{
unsafe
{
std::mem::transmute::< _, _ >( self.as_canonical_mut() )
}
}
#[ inline ]
fn as_slice_mut( &mut self ) -> &mut [ Self::Scalar ]
{
&mut self.as_array_mut()[ .. ]
}
fn as_canonical_mut( &mut self ) -> &mut X3< Self::Scalar >;
}
impl< Scalar, Original, Target > crate::From2< Original >
for Target
where
Scalar : ScalarInterface,
Original : X3NominalInterface< Scalar = Scalar >,
Target : X3BasicInterface< Scalar = Scalar >,
{
#[ inline ]
fn from2( original : Original ) -> Self
{
Self::make( original._0(), original._1() )
}
}
}
crate::mod_interface!
{
prelude use
{
X3NominalInterface,
X3NominalInterface as X3Interface,
X3BasicInterface,
X3CanonicalInterface,
};
}