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
 | 
			
		||||
#
 | 
			
		||||
#   AX_REQUIRE_STDCXX_11
 | 
			
		||||
#   AX_REQUIRE_STDCXX_14
 | 
			
		||||
#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
 | 
			
		||||
#   AX_CXX_COMPILE_STDCXX_14([ext|noext],[mandatory|optional])
 | 
			
		||||
#
 | 
			
		||||
# DESCRIPTION
 | 
			
		||||
#
 | 
			
		||||
#   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
 | 
			
		||||
#   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)
 | 
			
		||||
  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], [
 | 
			
		||||
  m4_include(ax_cxx_compile_stdcxx_11.m4)
 | 
			
		||||
  AC_LANG(C++)
 | 
			
		||||
  AX_CXX_COMPILE_STDCXX_11(noext, optional)
 | 
			
		||||
  AX_CXX_COMPILE_STDCXX_14(noext, optional)
 | 
			
		||||
  AC_PROG_CXX
 | 
			
		||||
  AC_PROG_CPP
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@ AX_BUILD_EXAMPLES
 | 
			
		||||
#AX_CHECK_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
			
		||||
#AX_REQUIRE_QT([QT], [QtCore QtGui QtNetwork], [QtWidgets])
 | 
			
		||||
#AX_QT_NO_KEYWORDS
 | 
			
		||||
AX_REQUIRE_STDCXX_14
 | 
			
		||||
 | 
			
		||||
# create output
 | 
			
		||||
AC_OUTPUT
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,10 @@
 | 
			
		||||
 | 
			
		||||
AM_CPPFLAGS = -I${top_srcdir}/src -I${top_builddir}/src
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
## 45678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
			
		||||
 | 
			
		||||
include_HEADERS = matrix.hxx
 | 
			
		||||
 | 
			
		||||
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_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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user