use faer::traits::{ComplexField, RealField};
use num_traits::float::TotalOrder;
use num_traits::{Float, FromPrimitive, ToPrimitive};
use std::fmt::Display;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
pub trait BixverseFloat:
Float
+ FromPrimitive
+ ToPrimitive
+ ComplexField
+ Copy
+ 'static
+ RealField
+ AddAssign
+ DivAssign
+ SubAssign
+ MulAssign
+ Div
+ Display
+ Sub
+ Mul
+ Div
+ TotalOrder
+ Clone
{
}
impl<T> BixverseFloat for T where
T: Float
+ FromPrimitive
+ ToPrimitive
+ ComplexField
+ Copy
+ 'static
+ RealField
+ AddAssign
+ DivAssign
+ SubAssign
+ MulAssign
+ Div
+ Display
+ Sub
+ Mul
+ Div
+ TotalOrder
+ Clone
{
}
pub trait BixverseNumeric:
Clone
+ Default
+ Copy
+ Sync
+ Send
+ Add<Output = Self>
+ Mul<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ PartialEq
+ Sub
+ DivAssign
{
}
impl<T> BixverseNumeric for T where
T: Clone
+ Default
+ Copy
+ Sync
+ Send
+ Add<Output = Self>
+ Mul<Output = Self>
+ Sub<Output = Self>
+ AddAssign
+ PartialEq
+ Sub
+ DivAssign
{
}
pub trait VecIndexCast<U> {
fn index_cast(self) -> Vec<U>;
}
impl VecIndexCast<u32> for Vec<usize> {
fn index_cast(self) -> Vec<u32> {
self.into_iter().map(|x| x as u32).collect()
}
}
impl VecIndexCast<u32> for &[usize] {
fn index_cast(self) -> Vec<u32> {
self.iter().map(|&x| x as u32).collect()
}
}
impl VecIndexCast<usize> for Vec<u32> {
fn index_cast(self) -> Vec<usize> {
self.into_iter().map(|x| x as usize).collect()
}
}
impl VecIndexCast<usize> for &[u32] {
fn index_cast(self) -> Vec<usize> {
self.iter().map(|&x| x as usize).collect()
}
}
pub trait VecConvert<U> {
fn r_int_convert(self) -> Vec<U>;
fn r_int_convert_shift(self) -> Vec<U>;
}
impl VecConvert<i32> for Vec<usize> {
fn r_int_convert(self) -> Vec<i32> {
self.into_iter().map(|x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.into_iter().map(|x| (x as i32) + 1).collect()
}
}
impl VecConvert<i32> for &[&usize] {
fn r_int_convert(self) -> Vec<i32> {
self.iter().map(|&&x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.iter().map(|&&x| (x as i32) + 1).collect()
}
}
impl VecConvert<i32> for Vec<u32> {
fn r_int_convert(self) -> Vec<i32> {
self.into_iter().map(|x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.into_iter().map(|x| (x as i32) + 1).collect()
}
}
impl VecConvert<usize> for Vec<i32> {
fn r_int_convert(self) -> Vec<usize> {
self.into_iter().map(|x| x as usize).collect()
}
fn r_int_convert_shift(self) -> Vec<usize> {
self.into_iter().map(|x| (x - 1) as usize).collect()
}
}
impl VecConvert<i32> for &[usize] {
fn r_int_convert(self) -> Vec<i32> {
self.iter().map(|&x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.iter().map(|&x| (x as i32) + 1).collect()
}
}
impl VecConvert<usize> for &[i32] {
fn r_int_convert(self) -> Vec<usize> {
self.iter().map(|&x| x as usize).collect()
}
fn r_int_convert_shift(self) -> Vec<usize> {
self.iter().map(|&x| (x - 1) as usize).collect()
}
}
pub trait VecFloatConvert<U> {
fn r_float_convert(self) -> Vec<U>;
}
impl VecFloatConvert<f32> for Vec<f64> {
fn r_float_convert(self) -> Vec<f32> {
self.into_iter().map(|x| x as f32).collect()
}
}
impl VecFloatConvert<f64> for Vec<f32> {
fn r_float_convert(self) -> Vec<f64> {
self.into_iter().map(|x| x as f64).collect()
}
}
impl VecFloatConvert<f64> for &[f32] {
fn r_float_convert(self) -> Vec<f64> {
self.iter().map(|x| *x as f64).collect()
}
}
impl VecFloatConvert<f32> for &[f64] {
fn r_float_convert(self) -> Vec<f32> {
self.iter().map(|&x| x as f32).collect()
}
}