pub( crate ) mod private
{
use crate::*;
const LENGTH : usize = 2;
#[ allow( non_camel_case_types ) ]
pub trait X2NominalInterface
{
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 clone_as_tuple( &self ) -> ( Self::Scalar , Self::Scalar )
{
( self._0(), self._1() )
}
#[ inline ]
fn clone_as_array( &self ) -> [ Self::Scalar ; LENGTH ]
{
[ self._0(), self._1() ]
}
#[ inline ]
fn clone_as_canonical( &self ) -> X2< Self::Scalar >
{
X2::< Self::Scalar >( self._0(), self._1() )
}
}
#[ allow( non_camel_case_types ) ]
pub trait X2BasicInterface : X2NominalInterface
{
fn make( _0 : Self::Scalar, _1 : 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(),
)
}
#[ inline ]
fn make_default() -> Self
where
Self : Sized,
{
Self::make( Self::Scalar::default(), Self::Scalar::default() )
}
}
#[ allow( non_camel_case_types ) ]
pub trait X2CanonicalInterface : X2BasicInterface + Sized
{
#[ inline ]
fn assign< Src : X2BasicInterface< Scalar = Self::Scalar > >( &mut self, src : Src )
{
*self._0_mut() = src._0();
*self._1_mut() = src._1();
}
fn _0_ref( &self ) -> &Self::Scalar;
fn _1_ref( &self ) -> &Self::Scalar;
#[ inline ]
fn x_ref( &self ) -> &Self::Scalar
{
self._0_ref()
}
#[ inline ]
fn y_ref( &self ) -> &Self::Scalar
{
self._1_ref()
}
fn _0_mut( &mut self ) -> &mut Self::Scalar;
fn _1_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 as_tuple( &self ) -> &( Self::Scalar , Self::Scalar )
{
debug_assert_eq!( core::mem::size_of::< Self >(), core::mem::size_of::< ( 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 ) -> &X2< Self::Scalar >;
#[ inline ]
fn as_tuple_mut( &mut self ) -> &mut ( Self::Scalar , Self::Scalar )
{
debug_assert_eq!( core::mem::size_of::< Self >(), core::mem::size_of::< ( 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 X2< Self::Scalar >;
}
impl< Scalar, Original, Target > crate::From2< Original >
for Target
where
Scalar : ScalarInterface,
Original : X2NominalInterface< Scalar = Scalar >,
Target : X2BasicInterface< Scalar = Scalar >,
{
#[ inline ]
fn from2( original : Original ) -> Self
{
Self::make( original._0(), original._1() )
}
}
}
crate::mod_interface!
{
prelude use
{
X2NominalInterface,
X2NominalInterface as X2Interface,
X2BasicInterface,
X2CanonicalInterface,
};
}