diff --git a/linear_ops/Cargo.toml b/linear_ops/Cargo.toml index 885f45f..c1bc3ef 100644 --- a/linear_ops/Cargo.toml +++ b/linear_ops/Cargo.toml @@ -4,12 +4,15 @@ version = "0.1.0" edition = "2021" [features] -default=["named-fields"] +default=["named-fields","fixed-wide"] named-fields=[] +fixed-wide=["dep:fixed_wide","dep:paste"] deferred-division=["dep:ratio_ops"] [dependencies] ratio_ops = { path = "../ratio_ops", optional = true } +fixed_wide = { path = "../fixed_wide", optional = true } +paste = { version = "1.0.15", optional = true } [dev-dependencies] -fixed_wide = { version = "0.1.0", path = "../fixed_wide", features = ["wide-mul"] } +fixed_wide = { path = "../fixed_wide", features = ["wide-mul"] } diff --git a/linear_ops/src/macros/fixed_wide.rs b/linear_ops/src/macros/fixed_wide.rs new file mode 100644 index 0000000..199e7fb --- /dev/null +++ b/linear_ops/src/macros/fixed_wide.rs @@ -0,0 +1,79 @@ +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! impl_fixed_wide_vector_not_const_generic { + ( + (), + $n:expr + ) => { + impl Vector>{ + #[inline] + pub fn length(self)-> as core::ops::Mul>::Output{ + self.length_squared().sqrt_unchecked() + } + #[inline] + pub fn with_length(self,length:U)-> as core::ops::Div< as core::ops::Mul>::Output>>::Output + where + fixed_wide::fixed::Fixed<$n,{$n*32}>:core::ops::Mul, + U:Copy, + V:core::ops::Div< as core::ops::Mul>::Output>, + { + self*length/self.length() + } + } + }; +} + +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! macro_4 { + ( $macro: ident, $any:tt ) => { + $crate::macro_repeated!($macro,$any,1,2,3,4); + } +} + +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! impl_fixed_wide_vector { + () => { + $crate::macro_4!(impl_fixed_wide_vector_not_const_generic,()); + // I LOVE NOT BEING ABLE TO USE CONST GENERICS + $crate::macro_repeated!( + impl_fix_not_const_generic,(), + (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),(11,1),(12,1),(13,1),(14,1),(15,1),(16,1), + (1,2),(2,2),(3,2),(4,2),(5,2),(6,2),(7,2),(8,2),(9,2),(10,2),(11,2),(12,2),(13,2),(14,2),(15,2),(16,2), + (1,3),(2,3),(3,3),(4,3),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3),(12,3),(13,3),(14,3),(15,3),(16,3), + (1,4),(2,4),(3,4),(4,4),(5,4),(6,4),(7,4),(8,4),(9,4),(10,4),(11,4),(12,4),(13,4),(14,4),(15,4),(16,4), + (1,5),(2,5),(3,5),(4,5),(5,5),(6,5),(7,5),(8,5),(9,5),(10,5),(11,5),(12,5),(13,5),(14,5),(15,5),(16,5), + (1,6),(2,6),(3,6),(4,6),(5,6),(6,6),(7,6),(8,6),(9,6),(10,6),(11,6),(12,6),(13,6),(14,6),(15,6),(16,6), + (1,7),(2,7),(3,7),(4,7),(5,7),(6,7),(7,7),(8,7),(9,7),(10,7),(11,7),(12,7),(13,7),(14,7),(15,7),(16,7), + (1,8),(2,8),(3,8),(4,8),(5,8),(6,8),(7,8),(8,8),(9,8),(10,8),(11,8),(12,8),(13,8),(14,8),(15,8),(16,8), + (1,9),(2,9),(3,9),(4,9),(5,9),(6,9),(7,9),(8,9),(9,9),(10,9),(11,9),(12,9),(13,9),(14,9),(15,9),(16,9), + (1,10),(2,10),(3,10),(4,10),(5,10),(6,10),(7,10),(8,10),(9,10),(10,10),(11,10),(12,10),(13,10),(14,10),(15,10),(16,10), + (1,11),(2,11),(3,11),(4,11),(5,11),(6,11),(7,11),(8,11),(9,11),(10,11),(11,11),(12,11),(13,11),(14,11),(15,11),(16,11), + (1,12),(2,12),(3,12),(4,12),(5,12),(6,12),(7,12),(8,12),(9,12),(10,12),(11,12),(12,12),(13,12),(14,12),(15,12),(16,12), + (1,13),(2,13),(3,13),(4,13),(5,13),(6,13),(7,13),(8,13),(9,13),(10,13),(11,13),(12,13),(13,13),(14,13),(15,13),(16,13), + (1,14),(2,14),(3,14),(4,14),(5,14),(6,14),(7,14),(8,14),(9,14),(10,14),(11,14),(12,14),(13,14),(14,14),(15,14),(16,14), + (1,15),(2,15),(3,15),(4,15),(5,15),(6,15),(7,15),(8,15),(9,15),(10,15),(11,15),(12,15),(13,15),(14,15),(15,15),(16,15), + (1,16),(2,16),(3,16),(4,16),(5,16),(6,16),(7,16),(8,16),(9,16),(10,16),(11,16),(12,16),(13,16),(14,16),(15,16),(16,16) + ); + }; +} + +#[doc(hidden)] +#[macro_export(local_inner_macros)] +macro_rules! impl_fix_not_const_generic{ + ( + (), + ($lhs:expr,$rhs:expr) + )=>{ + impl Vector> + { + paste::item!{ + #[inline] + pub fn [](self)->Vector>{ + self.map(|t|t.[]()) + } + } + } + } +} diff --git a/linear_ops/src/macros/mod.rs b/linear_ops/src/macros/mod.rs index d551722..e0a9d02 100644 --- a/linear_ops/src/macros/mod.rs +++ b/linear_ops/src/macros/mod.rs @@ -2,6 +2,9 @@ pub mod common; pub mod vector; pub mod matrix; +#[cfg(feature="fixed-wide")] +pub mod fixed_wide; + #[doc(hidden)] #[macro_export(local_inner_macros)] macro_rules! macro_repeated{ diff --git a/linear_ops/src/macros/vector.rs b/linear_ops/src/macros/vector.rs index b375509..d3beecf 100644 --- a/linear_ops/src/macros/vector.rs +++ b/linear_ops/src/macros/vector.rs @@ -164,6 +164,10 @@ macro_rules! impl_vector { $crate::impl_vector_shift_operator!(Shl, shl); $crate::impl_vector_shift_assign_operator!(ShrAssign, shr_assign); $crate::impl_vector_shift_operator!(Shr, shr); + + // dedicated methods for this type + #[cfg(feature="fixed-wide")] + $crate::impl_fixed_wide_vector!(); } } #[doc(hidden)]