adv_linalg_lib 0.1.1

Core library for Adv_LinAlg procedral macros
Documentation
use adv_linalg_proc_macro::{impl_dot_product, impl_vector_add, impl_vector_sub};
use core::ops::{Add, Mul, Sub};
use cfg_if::cfg_if;

cfg_if! {
    if #[cfg(feature = "full")] {
        use alloc::vec::Vec;

        mod vector;
        mod mut_vector;

        pub struct Vector<T> {
            values: Vec<T>,
        }

        pub struct MutVector<T> {
            values: Vec<T>,
        }
    }
}

cfg_if! {
    if #[cfg(feature = "no_std")]  {
        mod vector_slice;
        mod mut_vector_slice;

        pub struct VectorSlice<'v, T> {
            values: &'v [T]
        }

        pub struct MutVectorSlice<'v, T> {
            values: &'v mut [T]
        }
    }
}

cfg_if! {
    if #[cfg(feature = "full")] {
        impl_vector_add!(
            impl<T: Clone + Add<Output = T>> Add for [Vector<T>] + [Vector<T>];
            impl<'lhs, T: Clone + Add<Output = T>> Add for [VectorSlice<'lhs, T>] + [Vector<T>];
            impl<'rhs, T: Clone + Add<Output = T>> Add for [Vector<T>] + [VectorSlice<'rhs, T>];
            impl<'lhs, 'rhs, T: Clone + Add<Output = T>> Add for [VectorSlice<'lhs, T>] + [VectorSlice<'rhs, T>];

            #[mut_left] impl<T: Clone + Add<Output = T>> Add for [MutVector<T>] + [Vector<T>];
            #[mut_left] impl<'lhs, T: Clone + Add<Output = T>> Add for [MutVectorSlice<'lhs, T>] + [Vector<T>];
            #[mut_left] impl<'rhs, T: Clone + Add<Output = T>> Add for [MutVector<T>] + [VectorSlice<'rhs, T>];
            #[mut_left] impl<'lhs, 'rhs, T: Clone + Add<Output = T>> Add for [MutVectorSlice<'lhs, T>] + [VectorSlice<'rhs, T>];

            #[mut_right] impl<T: Clone + Add<Output = T>> Add for [Vector<T>] + [MutVector<T>];
            #[mut_right] impl<'lhs, T: Clone + Add<Output = T>> Add for [VectorSlice<'lhs, T>] + [MutVector<T>];
            #[mut_right] impl<'rhs, T: Clone + Add<Output = T>> Add for [Vector<T>] + [MutVectorSlice<'rhs, T>];
            #[mut_right] impl<'lhs, 'rhs, T: Clone + Add<Output = T>> Add for [VectorSlice<'lhs, T>] + [MutVectorSlice<'rhs, T>];

            #[mut_both] impl<T: Clone + Add<Output = T>> Add for [MutVector<T>] + [MutVector<T>];
            #[mut_both] impl<'lhs, T: Clone + Add<Output = T>> Add for [MutVectorSlice<'lhs, T>] + [MutVector<T>];
            #[mut_both] impl<'rhs, T: Clone + Add<Output = T>> Add for [MutVector<T>] + [MutVectorSlice<'rhs, T>];
            #[mut_both] impl<'lhs, 'rhs, T: Clone + Add<Output = T>> Add for [MutVectorSlice<'lhs, T>] + [MutVectorSlice<'rhs, T>]
        );

        impl_dot_product!(
            impl<T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [Vector<T>] * [Vector<T>];
            impl<'lhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [VectorSlice<'lhs, T>] * [Vector<T>];
            impl<'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [Vector<T>] * [VectorSlice<'rhs, T>];
            impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [VectorSlice<'lhs, T>] * [VectorSlice<'rhs, T>];

            #[mut_left] impl<T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVector<T>] * [Vector<T>];
            #[mut_left] impl<'lhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVectorSlice<'lhs, T>] * [Vector<T>];
            #[mut_left] impl<'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVector<T>] * [VectorSlice<'rhs, T>];
            #[mut_left] impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVectorSlice<'lhs, T>] * [VectorSlice<'rhs, T>];

            #[mut_right] impl<T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [Vector<T>] * [MutVector<T>];
            #[mut_right] impl<'lhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [VectorSlice<'lhs, T>] * [MutVector<T>];
            #[mut_right] impl<'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [Vector<T>] * [MutVectorSlice<'rhs, T>];
            #[mut_right] impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [VectorSlice<'lhs, T>] * [MutVectorSlice<'rhs, T>];

            #[mut_both] impl<T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVector<T>] * [MutVector<T>];
            #[mut_both] impl<'lhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVectorSlice<'lhs, T>] * [MutVector<T>];
            #[mut_both] impl<'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVector<T>] * [MutVectorSlice<'rhs, T>];
            #[mut_both] impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>> Mul for [MutVectorSlice<'lhs, T>] * [MutVectorSlice<'rhs, T>]
        );

        impl_vector_sub!(
            impl<T: Clone + Sub<Output = T>> Sub for [Vector<T>] - [Vector<T>];
            impl<'lhs, T: Clone + Sub<Output = T>> Sub for [VectorSlice<'lhs, T>] - [Vector<T>];
            impl<'rhs, T: Clone + Sub<Output = T>> Sub for [Vector<T>] - [VectorSlice<'rhs, T>];
            impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [VectorSlice<'lhs, T>] - [VectorSlice<'rhs, T>];

            #[mut_left] impl<T: Clone + Sub<Output = T>> Sub for [MutVector<T>] - [Vector<T>];
            #[mut_left] impl<'lhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [Vector<T>];
            #[mut_left] impl<'rhs, T: Clone + Sub<Output = T>> Sub for [MutVector<T>] - [VectorSlice<'rhs, T>];
            #[mut_left] impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [VectorSlice<'rhs, T>];

            #[mut_right] impl<T: Clone + Sub<Output = T>> Sub for [Vector<T>] - [MutVector<T>];
            #[mut_right] impl<'lhs, T: Clone + Sub<Output = T>> Sub for [VectorSlice<'lhs, T>] - [MutVector<T>];
            #[mut_right] impl<'rhs, T: Clone + Sub<Output = T>> Sub for [Vector<T>] - [MutVectorSlice<'rhs, T>];
            #[mut_right] impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [VectorSlice<'lhs, T>] - [MutVectorSlice<'rhs, T>];

            #[mut_both] impl<T: Clone + Sub<Output = T>> Sub for [MutVector<T>] - [MutVector<T>];
            #[mut_both] impl<'lhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [MutVector<T>];
            #[mut_both] impl<'rhs, T: Clone + Sub<Output = T>> Sub for [MutVector<T>] - [MutVectorSlice<'rhs, T>];
            #[mut_both] impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [MutVectorSlice<'rhs, T>]
        );
    } else if #[cfg(feature = "no_std")] {
        impl_vector_add!(
            #[no_std] #[mut_left]
            impl<'lhs, 'rhs, T: Clone + Add<Output = T>>
                Add for
                    [MutVectorSlice<'lhs, T>] + [VectorSlice<'rhs, T>];
    
            #[no_std] #[mut_both]
            impl<'lhs, 'rhs, T: Clone + Add<Output = T>>
                Add for
                    [MutVectorSlice<'lhs, T>] + [MutVectorSlice<'rhs, T>]
        );
    
        impl_dot_product!(
            #[mut_left]
            impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>>
                Mul for
                    [MutVectorSlice<'lhs, T>] * [VectorSlice<'rhs, T>];
    
            #[mut_both]
            impl<'lhs, 'rhs, T: Clone + Default + Add<Output = T> + Mul<Output = T>>
                Mul for
                    [MutVectorSlice<'lhs, T>] * [MutVectorSlice<'rhs, T>]
        );
    
        impl_vector_sub!(
            #[no_std]
            #[mut_left]
            impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [VectorSlice<'rhs, T>];
    
            #[no_std]
            #[mut_both] 
            impl<'lhs, 'rhs, T: Clone + Sub<Output = T>> Sub for [MutVectorSlice<'lhs, T>] - [MutVectorSlice<'rhs, T>]
        );
    }
}