1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use std::fmt;

use traits::{MatrixRawGet, MatrixRawSet, MatrixShape, MatrixTranspose, SameShape};
use matrix::write_mat;

impl<T: MatrixShape>
MatrixTranspose for
T
{
	fn t(self) -> Transposer<T>
	{
		Transposer::new(self)
	}
}

#[derive(Copy)]
pub struct Transposer<T>
{
	base: T
}

impl<T>
Transposer<T>
{
	pub fn new(base: T) -> Transposer<T>
	{
		Transposer{ base: base }
	}
}

impl<T: MatrixRawGet>
MatrixRawGet for
Transposer<T>
{
	unsafe fn raw_get(&self, r: usize, c: usize) -> f64
	{
		self.base.raw_get(c, r)
	}
}

impl<T: MatrixRawSet>
MatrixRawSet for
Transposer<T>
{
	unsafe fn raw_set(&self, r: usize, c: usize, val: f64)
	{
		self.base.raw_set(c, r, val)
	}
}

impl<T: MatrixShape>
MatrixShape for
Transposer<T>
{
	fn ncol(&self) -> usize
	{
		self.base.nrow()
	}

	fn nrow(&self) -> usize
	{
		self.base.ncol()
	}
}

impl<T: MatrixShape>
SameShape for
Transposer<T>
{
	fn same_shape(&self, nrow: usize, ncol: usize) -> bool
	{
		self.nrow() == nrow && self.ncol() == ncol
	}
}

impl<T: MatrixRawGet + MatrixShape>
fmt::Display for
Transposer<T>
{
	fn fmt(&self, buf: &mut fmt::Formatter) -> fmt::Result
	{
		write_mat(buf, self)
	}
} 

impl<T: Clone>
Clone for
Transposer<T>
{
	fn clone(&self) -> Transposer<T>
	{
		Transposer::new(self.base.clone())
	}
}