first approach including first tests
This commit is contained in:
		
							
								
								
									
										16
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,12 +4,16 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# SYNOPSIS
 | 
					# SYNOPSIS
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					#   AX_REQUIRE_STDCXX_11
 | 
				
			||||||
 | 
					#   AX_REQUIRE_STDCXX_14
 | 
				
			||||||
#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
 | 
					#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
 | 
				
			||||||
 | 
					#   AX_CXX_COMPILE_STDCXX_14([ext|noext],[mandatory|optional])
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# DESCRIPTION
 | 
					# DESCRIPTION
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   Check for baseline language coverage in the compiler for the C++11
 | 
					#   Check for baseline language coverage in the compiler for the C++11
 | 
				
			||||||
#   standard; if necessary, add switches to CXXFLAGS to enable support.
 | 
					#   or C++14 standard; if necessary, add switches to CXXFLAGS to
 | 
				
			||||||
 | 
					#   enable support.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#   The first argument, if specified, indicates whether you insist on an
 | 
					#   The first argument, if specified, indicates whether you insist on an
 | 
				
			||||||
#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
 | 
					#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
 | 
				
			||||||
@@ -131,3 +135,94 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
 | 
				
			|||||||
    AC_SUBST(HAVE_CXX11)
 | 
					    AC_SUBST(HAVE_CXX11)
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [dnl
 | 
				
			||||||
 | 
					  m4_if([$1], [], [],
 | 
				
			||||||
 | 
					        [$1], [ext], [],
 | 
				
			||||||
 | 
					        [$1], [noext], [],
 | 
				
			||||||
 | 
					        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_14])])dnl
 | 
				
			||||||
 | 
					  m4_if([$2], [], [ax_cxx_compile_cxx14_required=true],
 | 
				
			||||||
 | 
					        [$2], [mandatory], [ax_cxx_compile_cxx14_required=true],
 | 
				
			||||||
 | 
					        [$2], [optional], [ax_cxx_compile_cxx14_required=false],
 | 
				
			||||||
 | 
					        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_14])])dnl
 | 
				
			||||||
 | 
					  AC_LANG_PUSH([C++])dnl
 | 
				
			||||||
 | 
					  ac_success=no
 | 
				
			||||||
 | 
					  AC_CACHE_CHECK(whether $CXX supports C++14 features by default,
 | 
				
			||||||
 | 
					  ax_cv_cxx_compile_cxx14,
 | 
				
			||||||
 | 
					  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
 | 
				
			||||||
 | 
					    [ax_cv_cxx_compile_cxx14=yes],
 | 
				
			||||||
 | 
					    [ax_cv_cxx_compile_cxx14=no])])
 | 
				
			||||||
 | 
					  if test x$ax_cv_cxx_compile_cxx14 = xyes; then
 | 
				
			||||||
 | 
					    ac_success=yes
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m4_if([$1], [noext], [], [dnl
 | 
				
			||||||
 | 
					  if test x$ac_success = xno; then
 | 
				
			||||||
 | 
					    for switch in -std=gnu++14 -std=gnu++0y; do
 | 
				
			||||||
 | 
					      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
 | 
				
			||||||
 | 
					      AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
 | 
				
			||||||
 | 
					                     $cachevar,
 | 
				
			||||||
 | 
					        [ac_save_CXXFLAGS="$CXXFLAGS"
 | 
				
			||||||
 | 
					         CXXFLAGS="$CXXFLAGS $switch"
 | 
				
			||||||
 | 
					         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
 | 
				
			||||||
 | 
					          [eval $cachevar=yes],
 | 
				
			||||||
 | 
					          [eval $cachevar=no])
 | 
				
			||||||
 | 
					         CXXFLAGS="$ac_save_CXXFLAGS"])
 | 
				
			||||||
 | 
					      if eval test x\$$cachevar = xyes; then
 | 
				
			||||||
 | 
					        CXXFLAGS="$CXXFLAGS $switch"
 | 
				
			||||||
 | 
					        ac_success=yes
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					  fi])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  m4_if([$1], [ext], [], [dnl
 | 
				
			||||||
 | 
					  if test x$ac_success = xno; then
 | 
				
			||||||
 | 
					    for switch in -std=c++14 -std=c++0y; do
 | 
				
			||||||
 | 
					      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx14_$switch])
 | 
				
			||||||
 | 
					      AC_CACHE_CHECK(whether $CXX supports C++14 features with $switch,
 | 
				
			||||||
 | 
					                     $cachevar,
 | 
				
			||||||
 | 
					        [ac_save_CXXFLAGS="$CXXFLAGS"
 | 
				
			||||||
 | 
					         CXXFLAGS="$CXXFLAGS $switch"
 | 
				
			||||||
 | 
					         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
 | 
				
			||||||
 | 
					          [eval $cachevar=yes],
 | 
				
			||||||
 | 
					          [eval $cachevar=no])
 | 
				
			||||||
 | 
					         CXXFLAGS="$ac_save_CXXFLAGS"])
 | 
				
			||||||
 | 
					      if eval test x\$$cachevar = xyes; then
 | 
				
			||||||
 | 
					        CXXFLAGS="$CXXFLAGS $switch"
 | 
				
			||||||
 | 
					        ac_success=yes
 | 
				
			||||||
 | 
					        break
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					  fi])
 | 
				
			||||||
 | 
					  AC_LANG_POP([C++])
 | 
				
			||||||
 | 
					  if test x$ax_cxx_compile_cxx14_required = xtrue; then
 | 
				
			||||||
 | 
					    if test x$ac_success = xno; then
 | 
				
			||||||
 | 
					      AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    if test x$ac_success = xno; then
 | 
				
			||||||
 | 
					      HAVE_CXX14=0
 | 
				
			||||||
 | 
					      AC_MSG_NOTICE([No compiler with C++14 support was found])
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      HAVE_CXX14=1
 | 
				
			||||||
 | 
					      AC_DEFINE(HAVE_CXX14,1,
 | 
				
			||||||
 | 
					                [define if the compiler supports basic C++14 syntax])
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    HAVE_CXX11=${HAVE_CXX14}
 | 
				
			||||||
 | 
					    AC_SUBST(HAVE_CXX11)
 | 
				
			||||||
 | 
					    AC_SUBST(HAVE_CXX14)
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_DEFUN([AX_REQUIRE_STDCXX_11], [
 | 
				
			||||||
 | 
					  if test x${HAVE_CXX11} != x1; then
 | 
				
			||||||
 | 
					    AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_DEFUN([AX_REQUIRE_STDCXX_14], [
 | 
				
			||||||
 | 
					  if test x${HAVE_CXX14} != x1; then
 | 
				
			||||||
 | 
					    AC_MSG_ERROR([*** A compiler with support for C++14 language features is required.])
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -273,7 +273,7 @@ EOF
 | 
				
			|||||||
AC_DEFUN([AX_USE_CXX], [
 | 
					AC_DEFUN([AX_USE_CXX], [
 | 
				
			||||||
  m4_include(ax_cxx_compile_stdcxx_11.m4)
 | 
					  m4_include(ax_cxx_compile_stdcxx_11.m4)
 | 
				
			||||||
  AC_LANG(C++)
 | 
					  AC_LANG(C++)
 | 
				
			||||||
  AX_CXX_COMPILE_STDCXX_11(noext, optional)
 | 
					  AX_CXX_COMPILE_STDCXX_14(noext, optional)
 | 
				
			||||||
  AC_PROG_CXX
 | 
					  AC_PROG_CXX
 | 
				
			||||||
  AC_PROG_CPP
 | 
					  AC_PROG_CPP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ AX_BUILD_EXAMPLES
 | 
				
			|||||||
#AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
					#AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
				
			||||||
#AX_REQUIRE_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
					#AX_REQUIRE_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
				
			||||||
#AX_QT_NO_KEYWORDS
 | 
					#AX_QT_NO_KEYWORDS
 | 
				
			||||||
 | 
					AX_REQUIRE_STDCXX_14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# create output
 | 
					# create output
 | 
				
			||||||
AC_OUTPUT
 | 
					AC_OUTPUT
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
 | 
					AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
 | 
				
			||||||
AM_LDFLAGS = -L${abs_top_builddir}/src/.libs
 | 
					AM_LDFLAGS = -L${abs_top_builddir}/src/.libs
 | 
				
			||||||
LDADD = -lmatricxx
 | 
					#LDADD = -lmatricxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noinst_PROGRAMS = matrix-sample
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					matrix_sample_SOURCES = matrix-sample.cxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MAINTAINERCLEANFILES = makefile.in
 | 
					MAINTAINERCLEANFILES = makefile.in
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								examples/matrix-sample.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								examples/matrix-sample.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,4 +8,6 @@
 | 
				
			|||||||
##       1         2         3         4         5         6         7         8
 | 
					##       1         2         3         4         5         6         7         8
 | 
				
			||||||
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
					## 45678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include_HEADERS = matrix.hxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MAINTAINERCLEANFILES = makefile.in
 | 
					MAINTAINERCLEANFILES = makefile.in
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										299
									
								
								src/matrix.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								src/matrix.hxx
									
									
									
									
									
										Normal file
									
								
							@@ -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';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										215
									
								
								test/basic.cxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								test/basic.cxx
									
									
									
									
									
										Normal file
									
								
							@@ -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;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
@@ -10,8 +10,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
 | 
					AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
 | 
				
			||||||
AM_LDFLAGS = -L${abs_top_builddir}/src/.libs
 | 
					AM_LDFLAGS = -L${abs_top_builddir}/src/.libs
 | 
				
			||||||
LDADD = -lmatricxx
 | 
					LDADD = -lcppunit
 | 
				
			||||||
 | 
					#LDADD = -lmatricxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTS =
 | 
					check_PROGRAMS = basic
 | 
				
			||||||
 | 
					TESTS = ${check_PROGRAMS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basic_SOURCES = basic.cxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MAINTAINERCLEANFILES = makefile.in
 | 
					MAINTAINERCLEANFILES = makefile.in
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user