#[cfg(feature = "v2_2")]
use crate::MatrixF64;
use crate::Value;
use crate::{MatrixComplexF32, MatrixComplexF64, MatrixF32, VectorF64};
use ffi::FFI;
use std::fmt;
use std::fmt::{Debug, Formatter};
ffi_wrapper!(Permutation, *mut sys::gsl_permutation, gsl_permutation_free);
impl Permutation {
#[doc(alias = "gsl_permutation_alloc")]
pub fn new(n: usize) -> Option<Permutation> {
let tmp = unsafe { sys::gsl_permutation_alloc(n) };
if tmp.is_null() {
None
} else {
Some(Self::wrap(tmp))
}
}
#[doc(alias = "gsl_permutation_calloc")]
pub fn new_with_init(n: usize) -> Option<Permutation> {
let tmp = unsafe { sys::gsl_permutation_calloc(n) };
if tmp.is_null() {
None
} else {
Some(Self::wrap(tmp))
}
}
#[doc(alias = "gsl_permutation_init")]
pub fn init(&mut self) {
unsafe { sys::gsl_permutation_init(self.unwrap_unique()) }
}
#[doc(alias = "gsl_permutation_memcpy")]
pub fn copy(&self, dest: &mut Permutation) -> Value {
Value::from(unsafe {
sys::gsl_permutation_memcpy(dest.unwrap_unique(), self.unwrap_shared())
})
}
#[doc(alias = "gsl_permutation_get")]
pub fn get(&self, i: usize) -> usize {
unsafe { sys::gsl_permutation_get(self.unwrap_shared(), i) }
}
#[doc(alias = "gsl_permutation_swap")]
pub fn swap(&mut self, i: usize, j: usize) -> Value {
Value::from(unsafe { sys::gsl_permutation_swap(self.unwrap_unique(), i, j) })
}
#[doc(alias = "gsl_permutation_size")]
pub fn size(&self) -> usize {
unsafe { sys::gsl_permutation_size(self.unwrap_shared()) }
}
#[doc(alias = "gsl_permutation_data")]
pub fn as_slice(&self) -> &[usize] {
unsafe {
let data = sys::gsl_permutation_data(self.unwrap_shared());
::std::slice::from_raw_parts(data, self.size())
}
}
#[doc(alias = "gsl_permutation_data")]
pub fn as_mut_slice(&mut self) -> &mut [usize] {
unsafe {
let data = sys::gsl_permutation_data(self.unwrap_shared());
::std::slice::from_raw_parts_mut(data, self.size())
}
}
#[doc(alias = "gsl_permutation_valid")]
pub fn is_valid(&self) -> bool {
Value::from(unsafe { sys::gsl_permutation_valid(self.unwrap_shared()) }) == ::Value::Success
}
#[doc(alias = "gsl_permutation_reverse")]
pub fn reverse(&mut self) {
unsafe { sys::gsl_permutation_reverse(self.unwrap_unique()) }
}
#[doc(alias = "gsl_permutation_inverse")]
pub fn inverse(&self, inv: &mut Permutation) -> Value {
Value::from(unsafe {
sys::gsl_permutation_inverse(inv.unwrap_unique(), self.unwrap_shared())
})
}
#[doc(alias = "gsl_permutation_next")]
pub fn next(&mut self) -> Value {
Value::from(unsafe { sys::gsl_permutation_next(self.unwrap_unique()) })
}
#[doc(alias = "gsl_permutation_prev")]
pub fn prev(&mut self) -> Value {
Value::from(unsafe { sys::gsl_permutation_prev(self.unwrap_unique()) })
}
#[doc(alias = "gsl_permute")]
pub fn permute(&mut self, data: &mut [f64], stride: usize) -> Value {
Value::from(unsafe {
let data_ptr = sys::gsl_permutation_data(self.unwrap_shared());
sys::gsl_permute(data_ptr, data.as_mut_ptr(), stride, data.len() as _)
})
}
#[doc(alias = "gsl_permute_inverse")]
pub fn permute_inverse(&mut self, data: &mut [f64], stride: usize) -> Value {
Value::from(unsafe {
let data_ptr = sys::gsl_permutation_data(self.unwrap_shared());
sys::gsl_permute_inverse(data_ptr, data.as_mut_ptr(), stride, data.len() as _)
})
}
#[doc(alias = "gsl_permute_vector")]
pub fn permute_vector(&mut self, v: &mut VectorF64) -> Value {
Value::from(unsafe { sys::gsl_permute_vector(self.unwrap_unique(), v.unwrap_unique()) })
}
#[doc(alias = "gsl_permute_vector_inverse")]
pub fn permute_vector_inverse(&self, v: &mut VectorF64) -> Value {
Value::from(unsafe {
sys::gsl_permute_vector_inverse(self.unwrap_shared(), v.unwrap_unique())
})
}
#[cfg(feature = "v2_2")]
#[cfg_attr(feature = "dox", doc(cfg(feature = "v2_2")))]
#[doc(alias = "gsl_permute_matrix")]
pub fn permute_matrix(&self, A: &mut MatrixF64) -> Value {
Value::from(unsafe { sys::gsl_permute_matrix(self.unwrap_shared(), A.unwrap_unique()) })
}
#[doc(alias = "gsl_permute_matrix_float")]
pub fn permute_matrix_float(&self, A: &mut MatrixF32) -> Value {
Value::from(unsafe {
sys::gsl_permute_matrix_float(self.unwrap_shared(), A.unwrap_unique())
})
}
#[doc(alias = "gsl_permute_matrix_complex")]
pub fn permute_matrix_complex(&self, A: &mut MatrixComplexF64) -> Value {
Value::from(unsafe {
sys::gsl_permute_matrix_complex(self.unwrap_shared(), A.unwrap_unique())
})
}
#[doc(alias = "gsl_permute_matrix_complex_float")]
pub fn permute_matrix_complex_float(&self, A: &mut MatrixComplexF32) -> Value {
Value::from(unsafe {
sys::gsl_permute_matrix_complex_float(self.unwrap_shared(), A.unwrap_unique())
})
}
#[doc(alias = "gsl_permutation_mul")]
pub fn mul(&mut self, pa: &Permutation, pb: &Permutation) -> Value {
Value::from(unsafe {
sys::gsl_permutation_mul(self.unwrap_unique(), pa.unwrap_shared(), pb.unwrap_shared())
})
}
#[doc(alias = "gsl_permutation_linear_to_canonical")]
pub fn linear_to_canonical(&self, q: &mut Permutation) -> Value {
Value::from(unsafe {
sys::gsl_permutation_linear_to_canonical(q.unwrap_unique(), self.unwrap_shared())
})
}
#[doc(alias = "gsl_permutation_canonical_to_linear")]
pub fn canonical_to_linear(&self, p: &mut Permutation) -> Value {
Value::from(unsafe {
sys::gsl_permutation_canonical_to_linear(p.unwrap_unique(), self.unwrap_shared())
})
}
#[doc(alias = "gsl_permutation_inversions")]
pub fn inversions(&self) -> usize {
unsafe { sys::gsl_permutation_inversions(self.unwrap_shared()) }
}
#[doc(alias = "gsl_permutation_linear_cycles")]
pub fn linear_cycles(&self) -> usize {
unsafe { sys::gsl_permutation_linear_cycles(self.unwrap_shared()) }
}
#[doc(alias = "gsl_permutation_canonical_cycles")]
pub fn canonical_cycles(&self) -> usize {
unsafe { sys::gsl_permutation_canonical_cycles(self.unwrap_shared()) }
}
}
impl Debug for Permutation {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
if self.unwrap_shared().is_null() {
write!(f, "<null>")
} else {
write!(f, "{:?}", self.as_slice())
}
}
}