-
Notifications
You must be signed in to change notification settings - Fork 0
/
UMatrix.ipp
103 lines (87 loc) · 3.03 KB
/
UMatrix.ipp
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
95
96
97
98
99
100
101
102
103
#ifdef __UMatrix__
template <typename __matrix_elem_type>
void UMatrix<__matrix_elem_type>::assign(const IMatrix<__matrix_elem_type>& r) {
matrix = new __matrix_elem_type[this->row * this->col]{};
for (size_t i = 0; i < this->row; ++i) {
for (size_t j = 0; j < this->col; ++j) {
set(i, j, r.get(i, j));
}
}
}
template <typename __matrix_elem_type>
void UMatrix<__matrix_elem_type>::clear() {
delete[] matrix;
matrix = nullptr;
}
template <typename __matrix_elem_type>
void UMatrix<__matrix_elem_type>::re_alloc(size_t r, size_t c) {
clear();
this->row = r, this->col = c;
matrix = new __matrix_elem_type[r * c]{};
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type>::UMatrix(size_t r, size_t c) {
this->row = r, this->col = c;
matrix = new __matrix_elem_type[this->row * this->col]{};
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type>::UMatrix(UMatrix<__matrix_elem_type>&& r) noexcept : IMatrix<__matrix_elem_type>(r) {
matrix = r.matrix;
r.matrix = nullptr;
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type>::UMatrix(const UMatrix<__matrix_elem_type>& r) : IMatrix<__matrix_elem_type>(r) {
assign(r);
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type>::UMatrix(const IMatrix<__matrix_elem_type>& r) : IMatrix<__matrix_elem_type>(r) {
assign(r);
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type>::~UMatrix() {
clear();
}
template <typename __matrix_elem_type>
IMatrix<__matrix_elem_type>& UMatrix<__matrix_elem_type>::operator=(UMatrix<__matrix_elem_type>&& r) noexcept {
if (this == &r) return *this;
matrix = r.matrix;
r.matrix = nullptr;
return *this;
}
template <typename __matrix_elem_type>
IMatrix<__matrix_elem_type>& UMatrix<__matrix_elem_type>::operator=(const IMatrix<__matrix_elem_type>& r) {
if (this == &r) return *this;
clear();
assign(r);
return *this;
}
template <typename __matrix_elem_type>
IMatrix<__matrix_elem_type>& UMatrix<__matrix_elem_type>::operator=(const UMatrix<__matrix_elem_type>& r) {
if (this == &r) return *this;
clear();
assign(r);
return *this;
}
template <typename __matrix_elem_type>
void UMatrix<__matrix_elem_type>::set(size_t r, size_t c, __matrix_elem_type value, void(*f)(void)) {
if (r > this->row || c > this->col) f();
matrix[r * this->col + c] = value;
}
template <typename __matrix_elem_type>
__matrix_elem_type UMatrix<__matrix_elem_type>::get(size_t r, size_t c, __matrix_elem_type(*def)(void)) const {
if (r > this->row || c > this->col) return def();
return matrix[r * this->col + c];
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type> UMatrix<__matrix_elem_type>::operator+(const IMatrix<__matrix_elem_type>& r) const {
UMatrix res(*this);
res += r;
return res;
}
template <typename __matrix_elem_type>
UMatrix<__matrix_elem_type> UMatrix<__matrix_elem_type>::operator*(const IMatrix<__matrix_elem_type>& r) const {
UMatrix res(*this);
res *= r;
return res;
}
#endif // __UMatrix__