use std::mem;
use std::ptr;
use std::ops::*;
pub trait Array1<Element: Copy>: Index<usize, Output=Element> + IndexMut<usize, Output=Element> {
fn ptr<'a>(&'a self) -> &'a Element {
&self[0]
}
fn mut_ptr<'a>(&'a mut self) -> &'a mut Element {
&mut self[0]
}
#[inline]
fn swap_elems(&mut self, i: usize, j: usize) {
unsafe { ptr::swap(&mut self[i], &mut self[j]) };
}
#[inline]
fn replace_elem(&mut self, i: usize, src: Element) -> Element {
mem::replace(&mut self[i], src)
}
}
pub trait Array2<Column: Array1<Element>+'static, Row: Array1<Element>, Element: Copy>:
Index<usize, Output=Column> + IndexMut<usize, Output=Column> {
fn ptr<'a>(&'a self) -> &'a Element {
&self[0][0]
}
fn mut_ptr<'a>(&'a mut self) -> &'a mut Element {
&mut self[0][0]
}
#[inline]
fn swap_cols(&mut self, a: usize, b: usize) {
unsafe { ptr::swap(&mut self[a], &mut self[b]) };
}
#[inline]
fn replace_col(&mut self, c: usize, src: Column) -> Column {
mem::replace(&mut self[c], src)
}
fn row(&self, r: usize) -> Row;
fn swap_rows(&mut self, a: usize, b: usize);
#[inline]
fn swap_elems(&mut self, a: (usize, usize), b: (usize, usize)) {
let (ac, ar) = a;
let (bc, br) = b;
unsafe { ptr::swap(&mut self[ac][ar], &mut self[bc][br]) };
}
}