Skip to content

Commit d613055

Browse files
kamilritzjkflying
authored andcommitted
Add more assignment operators for slices
1 parent 976ada4 commit d613055

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed

matrix/Slice.hpp

+84
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,90 @@ class Slice {
100100
return self;
101101
}
102102

103+
template<size_t MM, size_t NN>
104+
Slice<Type, P, Q, M, N>& operator+=(const Slice<Type, P, Q, MM, NN>& other)
105+
{
106+
Slice<Type, P, Q, M, N>& self = *this;
107+
for (size_t i = 0; i < P; i++) {
108+
for (size_t j = 0; j < Q; j++) {
109+
self(i, j) += other(i, j);
110+
}
111+
}
112+
return self;
113+
}
114+
115+
Slice<Type, P, Q, M, N>& operator+=(const Matrix<Type, P, Q>& other)
116+
{
117+
Slice<Type, P, Q, M, N>& self = *this;
118+
for (size_t i = 0; i < P; i++) {
119+
for (size_t j = 0; j < Q; j++) {
120+
self(i, j) += other(i, j);
121+
}
122+
}
123+
return self;
124+
}
125+
126+
Slice<Type, P, Q, M, N>& operator+=(const Type& other)
127+
{
128+
Slice<Type, P, Q, M, N>& self = *this;
129+
for (size_t i = 0; i < P; i++) {
130+
for (size_t j = 0; j < Q; j++) {
131+
self(i, j) += other;
132+
}
133+
}
134+
return self;
135+
}
136+
137+
template<size_t MM, size_t NN>
138+
Slice<Type, P, Q, M, N>& operator-=(const Slice<Type, P, Q, MM, NN>& other)
139+
{
140+
Slice<Type, P, Q, M, N>& self = *this;
141+
for (size_t i = 0; i < P; i++) {
142+
for (size_t j = 0; j < Q; j++) {
143+
self(i, j) -= other(i, j);
144+
}
145+
}
146+
return self;
147+
}
148+
149+
Slice<Type, P, Q, M, N>& operator-=(const Matrix<Type, P, Q>& other)
150+
{
151+
Slice<Type, P, Q, M, N>& self = *this;
152+
for (size_t i = 0; i < P; i++) {
153+
for (size_t j = 0; j < Q; j++) {
154+
self(i, j) -= other(i, j);
155+
}
156+
}
157+
return self;
158+
}
159+
160+
Slice<Type, P, Q, M, N>& operator-=(const Type& other)
161+
{
162+
Slice<Type, P, Q, M, N>& self = *this;
163+
for (size_t i = 0; i < P; i++) {
164+
for (size_t j = 0; j < Q; j++) {
165+
self(i, j) -= other;
166+
}
167+
}
168+
return self;
169+
}
170+
171+
Slice<Type, P, Q, M, N>& operator*=(const Type& other)
172+
{
173+
Slice<Type, P, Q, M, N>& self = *this;
174+
for (size_t i = 0; i < P; i++) {
175+
for (size_t j = 0; j < Q; j++) {
176+
self(i, j) *= other;
177+
}
178+
}
179+
return self;
180+
}
181+
182+
Slice<Type, P, Q, M, N>& operator/=(const Type& other)
183+
{
184+
return operator*=(Type(1) / other);
185+
}
186+
103187
template<size_t R, size_t S>
104188
const Slice<Type, R, S, M, N> slice(size_t x0, size_t y0) const
105189
{

test/slice.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,60 @@ int main()
154154
Vector2f v8_check = {2, 6};
155155
TEST(isEqual(v8,v8_check));
156156

157+
// Different assignment operators
158+
SquareMatrix3f O(data);
159+
float operand_data [4] = {2, 1, -3, -1};
160+
const SquareMatrix<float, 2> operand(operand_data);
161+
162+
O.slice<2,2>(1,0) += operand;
163+
float O_check_data_1 [9] = {0, 2, 3, 6, 6, 6, 4, 7, 10};
164+
TEST(isEqual(O, SquareMatrix3f(O_check_data_1)));
165+
166+
O = SquareMatrix3f(data);
167+
O.slice<2,1>(1,1) += operand.slice<2,1>(0,0);
168+
float O_check_data_2 [9] = {0, 2, 3, 4, 7, 6, 7, 5, 10};
169+
TEST(isEqual(O, SquareMatrix3f(O_check_data_2)));
170+
171+
O = SquareMatrix3f(data);
172+
O.slice<3,3>(0,0) += -1;
173+
float O_check_data_3 [9] = {-1, 1, 2, 3, 4, 5, 6, 7, 9};
174+
TEST(isEqual(O, SquareMatrix3f(O_check_data_3)));
175+
176+
O = SquareMatrix3f(data);
177+
O.col(1) += Vector3f{1, -2, 3};
178+
float O_check_data_4 [9] = {0, 3, 3, 4, 3, 6, 7, 11, 10};
179+
TEST(isEqual(O, SquareMatrix3f(O_check_data_4)));
180+
181+
O = SquareMatrix3f(data);
182+
O.slice<2,2>(1,0) -= operand;
183+
float O_check_data_5 [9] = {0, 2, 3, 2, 4, 6, 10, 9, 10};
184+
TEST(isEqual(O, SquareMatrix3f(O_check_data_5)));
185+
186+
O = SquareMatrix3f(data);
187+
O.slice<2,1>(1,1) -= operand.slice<2,1>(0,0);
188+
float O_check_data_6 [9] = {0, 2, 3, 4, 3, 6, 7, 11, 10};
189+
TEST(isEqual(O, SquareMatrix3f(O_check_data_6)));
190+
191+
O = SquareMatrix3f(data);
192+
O.slice<3,3>(0,0) -= -1;
193+
float O_check_data_7 [9] = {1, 3, 4, 5, 6, 7, 8, 9, 11};
194+
TEST(isEqual(O, SquareMatrix3f(O_check_data_7)));
195+
196+
O = SquareMatrix3f(data);
197+
O.col(1) -= Vector3f{1, -2, 3};
198+
float O_check_data_8 [9] = {0, 1, 3, 4, 7, 6, 7, 5, 10};
199+
TEST(isEqual(O, SquareMatrix3f(O_check_data_8)));
200+
201+
O = SquareMatrix3f(data);
202+
O.slice<2,1>(1,1) *= 5.f;
203+
float O_check_data_9 [9] = {0, 2, 3, 4, 25, 6, 7, 40, 10};
204+
TEST(isEqual(O, SquareMatrix3f(O_check_data_9)));
205+
206+
O = SquareMatrix3f(data);
207+
O.slice<2,1>(1,1) /= 2.f;
208+
float O_check_data_10 [9] = {0, 2, 3, 4, 2.5, 6, 7, 4, 10};
209+
TEST(isEqual(O, SquareMatrix3f(O_check_data_10)));
210+
157211
return 0;
158212
}
159213

0 commit comments

Comments
 (0)