| 230 | EIGEN_DONT_INLINE void call_ref_7(Ref<Matrix<float,Dynamic,3> > a, const B &b) { VERIFY_IS_EQUAL(a,b); } |
| 231 | |
| 232 | void call_ref() |
| 233 | { |
| 234 | VectorXcf ca = VectorXcf::Random(10); |
| 235 | VectorXf a = VectorXf::Random(10); |
| 236 | RowVectorXf b = RowVectorXf::Random(10); |
| 237 | MatrixXf A = MatrixXf::Random(10,10); |
| 238 | RowVector3f c = RowVector3f::Random(); |
| 239 | const VectorXf& ac(a); |
| 240 | VectorBlock<VectorXf> ab(a,0,3); |
| 241 | const VectorBlock<VectorXf> abc(a,0,3); |
| 242 | |
| 243 | |
| 244 | VERIFY_EVALUATION_COUNT( call_ref_1(a,a), 0); |
| 245 | VERIFY_EVALUATION_COUNT( call_ref_1(b,b.transpose()), 0); |
| 246 | // call_ref_1(ac,a<c); // does not compile because ac is const |
| 247 | VERIFY_EVALUATION_COUNT( call_ref_1(ab,ab), 0); |
| 248 | VERIFY_EVALUATION_COUNT( call_ref_1(a.head(4),a.head(4)), 0); |
| 249 | VERIFY_EVALUATION_COUNT( call_ref_1(abc,abc), 0); |
| 250 | VERIFY_EVALUATION_COUNT( call_ref_1(A.col(3),A.col(3)), 0); |
| 251 | // call_ref_1(A.row(3),A.row(3)); // does not compile because innerstride!=1 |
| 252 | VERIFY_EVALUATION_COUNT( call_ref_3(A.row(3),A.row(3).transpose()), 0); |
| 253 | VERIFY_EVALUATION_COUNT( call_ref_4(A.row(3),A.row(3).transpose()), 0); |
| 254 | // call_ref_1(a+a, a+a); // does not compile for obvious reason |
| 255 | |
| 256 | MatrixXf tmp = A*A.col(1); |
| 257 | VERIFY_EVALUATION_COUNT( call_ref_2(A*A.col(1), tmp), 1); // evaluated into a temp |
| 258 | VERIFY_EVALUATION_COUNT( call_ref_2(ac.head(5),ac.head(5)), 0); |
| 259 | VERIFY_EVALUATION_COUNT( call_ref_2(ac,ac), 0); |
| 260 | VERIFY_EVALUATION_COUNT( call_ref_2(a,a), 0); |
| 261 | VERIFY_EVALUATION_COUNT( call_ref_2(ab,ab), 0); |
| 262 | VERIFY_EVALUATION_COUNT( call_ref_2(a.head(4),a.head(4)), 0); |
| 263 | tmp = a+a; |
| 264 | VERIFY_EVALUATION_COUNT( call_ref_2(a+a,tmp), 1); // evaluated into a temp |
| 265 | VERIFY_EVALUATION_COUNT( call_ref_2(ca.imag(),ca.imag()), 1); // evaluated into a temp |
| 266 | |
| 267 | VERIFY_EVALUATION_COUNT( call_ref_4(ac.head(5),ac.head(5)), 0); |
| 268 | tmp = a+a; |
| 269 | VERIFY_EVALUATION_COUNT( call_ref_4(a+a,tmp), 1); // evaluated into a temp |
| 270 | VERIFY_EVALUATION_COUNT( call_ref_4(ca.imag(),ca.imag()), 0); |
| 271 | |
| 272 | VERIFY_EVALUATION_COUNT( call_ref_5(a,a), 0); |
| 273 | VERIFY_EVALUATION_COUNT( call_ref_5(a.head(3),a.head(3)), 0); |
| 274 | VERIFY_EVALUATION_COUNT( call_ref_5(A,A), 0); |
| 275 | // call_ref_5(A.transpose(),A.transpose()); // does not compile because storage order does not match |
| 276 | VERIFY_EVALUATION_COUNT( call_ref_5(A.block(1,1,2,2),A.block(1,1,2,2)), 0); |
| 277 | VERIFY_EVALUATION_COUNT( call_ref_5(b,b), 0); // storage order do not match, but this is a degenerate case that should work |
| 278 | VERIFY_EVALUATION_COUNT( call_ref_5(a.row(3),a.row(3)), 0); |
| 279 | |
| 280 | VERIFY_EVALUATION_COUNT( call_ref_6(a,a), 0); |
| 281 | VERIFY_EVALUATION_COUNT( call_ref_6(a.head(3),a.head(3)), 0); |
| 282 | VERIFY_EVALUATION_COUNT( call_ref_6(A.row(3),A.row(3)), 1); // evaluated into a temp thouth it could be avoided by viewing it as a 1xn matrix |
| 283 | tmp = A+A; |
| 284 | VERIFY_EVALUATION_COUNT( call_ref_6(A+A,tmp), 1); // evaluated into a temp |
| 285 | VERIFY_EVALUATION_COUNT( call_ref_6(A,A), 0); |
| 286 | VERIFY_EVALUATION_COUNT( call_ref_6(A.transpose(),A.transpose()), 1); // evaluated into a temp because the storage orders do not match |
| 287 | VERIFY_EVALUATION_COUNT( call_ref_6(A.block(1,1,2,2),A.block(1,1,2,2)), 0); |
| 288 | |
| 289 | VERIFY_EVALUATION_COUNT( call_ref_7(c,c), 0); |
no test coverage detected