parent
17e6364f45
commit
b54af4681a
12 changed files with 666 additions and 5 deletions
@ -0,0 +1,16 @@ |
|||||||
|
2016-07-30 08:50 |
||||||
|
|
||||||
|
* ., AUTHORS, ChangeLog, NEWS, README, autogen.sh, ax_check_qt.m4, |
||||||
|
ax_cxx_compile_stdcxx_11.m4, ax_init_standard_project.m4, |
||||||
|
bootstrap.sh, build-in-docker.conf, build-in-docker.sh, |
||||||
|
build-resource-file.sh, configure.ac, debian, |
||||||
|
debian/changelog.in, debian/compat, debian/control.in, |
||||||
|
debian/docs, debian/libmatricxx-dev.install, |
||||||
|
debian/libmatricxx.install, debian/rules, doc, doc/doxyfile.in, |
||||||
|
doc/makefile.am, examples, examples/makefile.am, |
||||||
|
libmatricxx.desktop.in, libmatricxx.spec.in, |
||||||
|
mac-create-app-bundle.sh, makefile.am, resolve-debbuilddeps.sh, |
||||||
|
resolve-rpmbuilddeps.sh, sql-to-dot.sed, src, |
||||||
|
src/libmatricxx.pc.in, src/makefile.am, src/version.cxx, |
||||||
|
src/version.hxx, test, test/makefile.am: initial project |
||||||
|
|
@ -0,0 +1,23 @@ |
|||||||
|
/*! @file
|
||||||
|
|
||||||
|
@id $Id$ |
||||||
|
*/ |
||||||
|
// 1 2 3 4 5 6 7 8
|
||||||
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||||
|
|
||||||
|
#include <matrix.hxx> |
||||||
|
|
||||||
|
int main(int, char**) { |
||||||
|
// Matrix<int, 3, 4> m1{1, 2, 3, 4,
|
||||||
|
// 5, 6, 7, 8,
|
||||||
|
// 9, 10, 11, 12};
|
||||||
|
// std::cout<<"m1 = "<<m1<<'\n';
|
||||||
|
// Matrix<int, 3, 4> m2 = m1;
|
||||||
|
// std::cout<<"m1 = "<<m1<<'\n';
|
||||||
|
// Matrix<int, 3, 4> m3;
|
||||||
|
// m3 = m1 + m2;
|
||||||
|
// std::cout<<"m1 = "<<m1<<'\n';
|
||||||
|
// std::cout<<"m2 = "<<m2<<'\n';
|
||||||
|
// std::cout<<"m3 = "<<m3<<'\n';
|
||||||
|
return 0; |
||||||
|
} |
@ -0,0 +1,299 @@ |
|||||||
|
/*! @file
|
||||||
|
|
||||||
|
@id $Id$ |
||||||
|
*/ |
||||||
|
// 1 2 3 4 5 6 7 8
|
||||||
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <cstring> |
||||||
|
#include <cassert> |
||||||
|
#include <type_traits> |
||||||
|
|
||||||
|
#define LOG std::cout<<__PRETTY_FUNCTION__<<std::endl |
||||||
|
|
||||||
|
template<typename T, size_t ROWS=0, size_t COLUMNS=0> class Matrix { |
||||||
|
|
||||||
|
//........................................................const.variables
|
||||||
|
protected: |
||||||
|
|
||||||
|
static const size_t SIZE = ROWS*COLUMNS; |
||||||
|
static const size_t MEM_SIZE = ROWS*COLUMNS*sizeof(T); |
||||||
|
|
||||||
|
//...............................................................typedefs
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// @name Auxiliary Classes
|
||||||
|
///{
|
||||||
|
|
||||||
|
/// Return One Row as Vector, internally used for element access
|
||||||
|
/** Only used to access values:
|
||||||
|
|
||||||
|
@code |
||||||
|
Matrix<int,4,4> m; |
||||||
|
m[2][2] = 1; |
||||||
|
@endcode */ |
||||||
|
class RowVector { |
||||||
|
public: |
||||||
|
T& operator[](size_t column) { |
||||||
|
return _v[column]; |
||||||
|
} |
||||||
|
protected: |
||||||
|
friend class Matrix; |
||||||
|
RowVector() = delete; // forbidden
|
||||||
|
RowVector(T c[COLUMNS]): _v(c) {} |
||||||
|
T *_v; |
||||||
|
}; |
||||||
|
|
||||||
|
/// Same as RowVector, but in a constant environment.
|
||||||
|
class ConstRowVector { |
||||||
|
public: |
||||||
|
const T& operator[](size_t column) const { |
||||||
|
return _v[column]; |
||||||
|
} |
||||||
|
protected: |
||||||
|
friend class Matrix; |
||||||
|
ConstRowVector() = delete; // forbidden
|
||||||
|
ConstRowVector(const T c[COLUMNS]): _v(c) {} |
||||||
|
const T *_v; |
||||||
|
}; |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
//................................................................methods
|
||||||
|
public: |
||||||
|
|
||||||
|
/// @name construction
|
||||||
|
///{
|
||||||
|
|
||||||
|
Matrix() { |
||||||
|
LOG; |
||||||
|
memset(_c, 0, MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
template<typename ...ARGS> |
||||||
|
Matrix(ARGS...t): _c{std::forward<T>(t)...} { |
||||||
|
LOG; |
||||||
|
static_assert(sizeof...(t)==SIZE, "variadic matrix initialisation requires correct array size"); |
||||||
|
} |
||||||
|
|
||||||
|
Matrix(const Matrix& o) { |
||||||
|
LOG; |
||||||
|
memcpy(_c, o._c, MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
/// @name operators
|
||||||
|
///{
|
||||||
|
|
||||||
|
Matrix& operator=(T oc[ROWS][COLUMNS]) { |
||||||
|
LOG; |
||||||
|
memcpy(_c, oc, MEM_SIZE); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
Matrix& operator=(const Matrix& o) { |
||||||
|
LOG; |
||||||
|
memcpy(_c, o._c, MEM_SIZE); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
Matrix& operator+=(const Matrix& o) { |
||||||
|
LOG; |
||||||
|
T *to((T*)(_c)+MEM_SIZE), *from((T*)(o._c)+MEM_SIZE); |
||||||
|
while (to>(T*)(_c)) *--to += *--from; |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
RowVector operator[](size_t row) { |
||||||
|
return RowVector(_c[row]); |
||||||
|
} |
||||||
|
|
||||||
|
const ConstRowVector operator[](size_t row) const { |
||||||
|
return ConstRowVector(_c[row]); |
||||||
|
} |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
//..............................................................variables
|
||||||
|
protected: |
||||||
|
|
||||||
|
T _c[ROWS][COLUMNS]; |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
template<typename T> class Matrix<T, 0, 0> { |
||||||
|
|
||||||
|
//..............................................................constants
|
||||||
|
public: |
||||||
|
|
||||||
|
const size_t ROWS; |
||||||
|
const size_t COLUMNS; |
||||||
|
const size_t SIZE; |
||||||
|
const size_t MEM_SIZE; |
||||||
|
|
||||||
|
//...............................................................typedefs
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// @name Auxiliary Classes
|
||||||
|
///{
|
||||||
|
|
||||||
|
/// Return One Row as Vector, internally used for element access
|
||||||
|
/** Only used to access values:
|
||||||
|
|
||||||
|
@code |
||||||
|
Matrix<int,4,4> m; |
||||||
|
m[2][2] = 1; |
||||||
|
@endcode */ |
||||||
|
class RowVector { |
||||||
|
public: |
||||||
|
T& operator[](size_t column) { |
||||||
|
assert(column<_m.COLUMNS); |
||||||
|
return _v[column]; |
||||||
|
} |
||||||
|
protected: |
||||||
|
friend class Matrix; |
||||||
|
RowVector() = delete; // forbidden
|
||||||
|
RowVector(const Matrix& m, T c[]): _m(m), _v(c) {} |
||||||
|
const Matrix& _m; |
||||||
|
T *_v; |
||||||
|
}; |
||||||
|
|
||||||
|
/// Same as RowVector, but in a constant environment.
|
||||||
|
class ConstRowVector { |
||||||
|
public: |
||||||
|
const T& operator[](size_t column) const { |
||||||
|
assert(column<_m.COLUMNS); |
||||||
|
return _v[column]; |
||||||
|
} |
||||||
|
protected: |
||||||
|
friend class Matrix; |
||||||
|
ConstRowVector() = delete; // forbidden
|
||||||
|
ConstRowVector(const Matrix& m, const T c[]): _m(m), _v(c) {} |
||||||
|
const Matrix& _m; |
||||||
|
const T *_v; |
||||||
|
}; |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
//................................................................methods
|
||||||
|
public: |
||||||
|
|
||||||
|
/// @name construction
|
||||||
|
///{
|
||||||
|
|
||||||
|
Matrix(size_t rows, size_t columns): |
||||||
|
ROWS(rows), |
||||||
|
COLUMNS(columns), |
||||||
|
SIZE(rows*columns), |
||||||
|
MEM_SIZE(rows*columns*sizeof(T)), |
||||||
|
_c(new T[rows*columns]) { |
||||||
|
LOG; |
||||||
|
memset(_c, 0, MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
template<typename ...ARGS> |
||||||
|
Matrix(size_t rows, size_t columns, ARGS...t): |
||||||
|
Matrix(rows, columns) { |
||||||
|
LOG; |
||||||
|
assert(sizeof...(t)==SIZE); |
||||||
|
copy_args(_c, t...); |
||||||
|
} |
||||||
|
|
||||||
|
Matrix(const Matrix& o): Matrix(o.ROWS, o.COLUMNS) { |
||||||
|
LOG; |
||||||
|
memcpy(_c, o._c, MEM_SIZE); |
||||||
|
} |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
/// @name destruction
|
||||||
|
///{
|
||||||
|
|
||||||
|
~Matrix() { |
||||||
|
delete[] _c; |
||||||
|
} |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
/// @name operators
|
||||||
|
///{
|
||||||
|
|
||||||
|
Matrix& operator=(T oc[]) { |
||||||
|
LOG; |
||||||
|
assert(sizeof(oc)==MEM_SIZE); |
||||||
|
memcpy(_c, oc, MEM_SIZE); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
Matrix& operator=(const Matrix& o) { |
||||||
|
LOG; |
||||||
|
if (o.ROWS!=ROWS&&o.COLUMNS!=COLUMNS) { |
||||||
|
delete[] _c; |
||||||
|
ROWS = o.ROWS; |
||||||
|
COLUMNS = o.COLUMNS; |
||||||
|
SIZE = o.SIZE; |
||||||
|
MEM_SIZE = o.MEM_SIZE; |
||||||
|
_c = new T[SIZE]; |
||||||
|
} |
||||||
|
memcpy(_c, o._c, MEM_SIZE); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
Matrix& operator+=(const Matrix& o) { |
||||||
|
LOG; |
||||||
|
assert(o.ROWS==ROWS); |
||||||
|
assert(o.COLUMNS==COLUMNS); |
||||||
|
T *to((T*)(_c)+MEM_SIZE), *from((T*)(o._c)+MEM_SIZE); |
||||||
|
while (to>(T*)(_c)) *--to += *--from; |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
RowVector operator[](size_t row) { |
||||||
|
assert(row<ROWS); |
||||||
|
return RowVector(*this, _c+row*COLUMNS); |
||||||
|
} |
||||||
|
|
||||||
|
const ConstRowVector operator[](size_t row) const { |
||||||
|
assert(row<ROWS); |
||||||
|
return ConstRowVector(*this, _c+row*COLUMNS); |
||||||
|
} |
||||||
|
|
||||||
|
///}
|
||||||
|
|
||||||
|
//................................................................methods
|
||||||
|
protected: |
||||||
|
|
||||||
|
void copy_args(T*) {} |
||||||
|
template<typename ...ARGS> |
||||||
|
void copy_args(T* to, T t1, ARGS...t) { |
||||||
|
*to = t1; |
||||||
|
copy_args(++to, t...); |
||||||
|
} |
||||||
|
|
||||||
|
//..............................................................variables
|
||||||
|
protected: |
||||||
|
|
||||||
|
T* _c; |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
template<typename T, size_t ROWS, size_t COLUMNS> |
||||||
|
Matrix<T, ROWS, COLUMNS> operator+(const Matrix<T, ROWS, COLUMNS>& m1, const Matrix<T, ROWS, COLUMNS>& m2) { |
||||||
|
LOG; |
||||||
|
Matrix<T, ROWS, COLUMNS> res(m1); |
||||||
|
return res+=m2; |
||||||
|
} |
||||||
|
|
||||||
|
template<typename T, size_t ROWS, size_t COLUMNS> |
||||||
|
std::ostream& operator<<(std::ostream& s, const Matrix<T, ROWS, COLUMNS>& m) { |
||||||
|
LOG; |
||||||
|
for (size_t w = 0; w < m.ROWS; ++w) { |
||||||
|
for (size_t h = 0; h < m.COLUMNS;++h) { |
||||||
|
s<<m[w][h]<<' '; |
||||||
|
} |
||||||
|
s<<'\n'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,215 @@ |
|||||||
|
/*! @file
|
||||||
|
|
||||||
|
@id $Id$ |
||||||
|
*/ |
||||||
|
// 1 2 3 4 5 6 7 8
|
||||||
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||||
|
|
||||||
|
#include <matrix.hxx> |
||||||
|
#include <cppunit/TestFixture.h> |
||||||
|
#include <cppunit/ui/text/TestRunner.h> |
||||||
|
#include <cppunit/extensions/HelperMacros.h> |
||||||
|
#include <cppunit/extensions/TestFactoryRegistry.h> |
||||||
|
#include <cppunit/XmlOutputter.h> |
||||||
|
#include <fstream> |
||||||
|
|
||||||
|
class TemplateMatrixTest: public CppUnit::TestFixture {
|
||||||
|
public: |
||||||
|
template<typename T> |
||||||
|
void initFromArray1() { |
||||||
|
Matrix<T,2,4> m {1, 2, 3, 4, |
||||||
|
5, 6, 7, 8}; |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromArray2() { |
||||||
|
Matrix<T,2,4> m(1, 2, 3, 4, |
||||||
|
5, 6, 7, 8); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromArray3() { |
||||||
|
Matrix<T,2,4> m({1, 2, 3, 4, |
||||||
|
5, 6, 7, 8}); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromOtherMatrix() { |
||||||
|
Matrix<T,2,4> m1(1, 2, 3, 4, |
||||||
|
5, 6, 7, 8); |
||||||
|
m1[1][2] = 13; |
||||||
|
Matrix<T,2,4> m2(m1); |
||||||
|
m1[0][2] = 16; |
||||||
|
m2[0][0] = 0; |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromDefault() { |
||||||
|
Matrix<T,2,2> m; |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); |
||||||
|
} |
||||||
|
CPPUNIT_TEST_SUITE(TemplateMatrixTest); |
||||||
|
CPPUNIT_TEST(initFromArray1<int>); |
||||||
|
CPPUNIT_TEST(initFromArray1<long>); |
||||||
|
CPPUNIT_TEST(initFromArray1<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromArray1<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromArray1<float>); |
||||||
|
CPPUNIT_TEST(initFromArray1<double>); |
||||||
|
CPPUNIT_TEST(initFromArray2<int>); |
||||||
|
CPPUNIT_TEST(initFromArray2<long>); |
||||||
|
CPPUNIT_TEST(initFromArray2<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromArray2<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromArray2<float>); |
||||||
|
CPPUNIT_TEST(initFromArray2<double>); |
||||||
|
CPPUNIT_TEST(initFromArray3<int>); |
||||||
|
CPPUNIT_TEST(initFromArray3<long>); |
||||||
|
CPPUNIT_TEST(initFromArray3<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromArray3<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromArray3<float>); |
||||||
|
CPPUNIT_TEST(initFromArray3<double>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<int>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<long>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<float>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<double>); |
||||||
|
CPPUNIT_TEST_SUITE_END(); |
||||||
|
}; |
||||||
|
CPPUNIT_TEST_SUITE_REGISTRATION(TemplateMatrixTest); |
||||||
|
|
||||||
|
class VariableMatrixTest: public CppUnit::TestFixture {
|
||||||
|
public: |
||||||
|
template<typename T> |
||||||
|
void initFromArray1() { |
||||||
|
Matrix<T> m(2,4, |
||||||
|
1, 2, 3, 4, |
||||||
|
5, 6, 7, 8); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromArray2() { |
||||||
|
Matrix<T> m(2, 4, |
||||||
|
1, 2, 3, 4, |
||||||
|
5, 6, 7, 8); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromOtherMatrix() { |
||||||
|
Matrix<T> m1(2, 4, |
||||||
|
1, 2, 3, 4, |
||||||
|
5, 6, 7, 8); |
||||||
|
m1[1][2] = 13; |
||||||
|
Matrix<T> m2(m1); |
||||||
|
m1[0][2] = 16; |
||||||
|
m2[0][0] = 0; |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); |
||||||
|
} |
||||||
|
template<typename T> |
||||||
|
void initFromDefault() { |
||||||
|
Matrix<T> m(2, 4); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); |
||||||
|
CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); |
||||||
|
} |
||||||
|
CPPUNIT_TEST_SUITE(VariableMatrixTest); |
||||||
|
CPPUNIT_TEST(initFromArray1<int>); |
||||||
|
CPPUNIT_TEST(initFromArray1<long>); |
||||||
|
CPPUNIT_TEST(initFromArray1<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromArray1<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromArray1<float>); |
||||||
|
CPPUNIT_TEST(initFromArray1<double>); |
||||||
|
CPPUNIT_TEST(initFromArray2<int>); |
||||||
|
CPPUNIT_TEST(initFromArray2<long>); |
||||||
|
CPPUNIT_TEST(initFromArray2<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromArray2<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromArray2<float>); |
||||||
|
CPPUNIT_TEST(initFromArray2<double>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<int>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<long>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<unsigned>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<unsigned long>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<float>); |
||||||
|
CPPUNIT_TEST(initFromOtherMatrix<double>); |
||||||
|
CPPUNIT_TEST_SUITE_END(); |
||||||
|
}; |
||||||
|
CPPUNIT_TEST_SUITE_REGISTRATION(VariableMatrixTest); |
||||||
|
|
||||||
|
int main(int argc, char** argv) try { |
||||||
|
std::ofstream ofs((*argv+std::string(".xml")).c_str()); |
||||||
|
CppUnit::TextUi::TestRunner runner; |
||||||
|
runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs)); |
||||||
|
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); |
||||||
|
return runner.run() ? 0 : 1; |
||||||
|
} catch (std::exception& e) { |
||||||
|
std::cerr<<"***Exception: "<<e.what()<<std::endl; |
||||||
|
return 1; |
||||||
|
} |
Loading…
Reference in new issue