]> git.tdb.fi Git - libs/math.git/commitdiff
Add formatted output operators for vector and matrix classes
authorMikko Rasa <tdb@tdb.fi>
Sun, 2 Jun 2019 11:29:25 +0000 (14:29 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 2 Jun 2019 16:13:09 +0000 (19:13 +0300)
source/linal/dynamicmatrix.h
source/linal/dynamicvector.h
source/linal/matrix.h
source/linal/vector.h
tests/boundingbox.cpp
tests/matrix.cpp

index 1bbed275844c3fe06a60e4f09644c7c668bd4c5d..6d45657a6f4fd99a41aaec63e0c401cc6c3587d5 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_LINAL_DYNAMICMATRIX_H_
 
 #include <algorithm>
+#include <ostream>
 #include "dynamicvector.h"
 #include "matrixops.h"
 
@@ -317,6 +318,27 @@ inline DynamicMatrix<T> invert(const DynamicMatrix<T> &m)
        return r.invert();
 }
 
+template<typename T>
+inline std::ostream &operator<<(std::ostream &s, const DynamicMatrix<T> &m)
+{
+       s << "DynamicMatrix" << m.rows() << 'x' << m.columns() << '(';
+       for(unsigned i=0; i<m.columns(); ++i)
+       {
+               if(i)
+                       s << ", ";
+               s << '[';
+               for(unsigned j=0; j<m.rows(); ++j)
+               {
+                       if(j)
+                               s << ", ";
+                       s << m(j, i);
+               }
+               s << ']';
+       }
+       s << ')';
+       return s;
+}
+
 } // namespace LinAl
 } // namespace Msp
 
index 8839c3365dd34f264c7653892e3ce2ada81210d9..a5379d87002cdea25b4059629c1eb5a4c96b358f 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <algorithm>
 #include <cmath>
+#include <ostream>
 #include <stdexcept>
 
 namespace Msp {
@@ -243,6 +244,20 @@ inline DynamicVector<T> normalize(const DynamicVector<T> &v)
        return r.normalize();
 }
 
+template<typename T>
+inline std::ostream &operator<<(std::ostream &s, const DynamicVector<T> &v)
+{
+       s << "DynamicVector" << v.size() << '(';
+       for(unsigned i=0; i<v.size(); ++i)
+       {
+               if(i)
+                       s << ", ";
+               s << v[i];
+       }
+       s << ')';
+       return s;
+}
+
 } // namespace LinAL
 } // namespace Msp
 
index daf9cb898e04393f2fc2d0f4d75b52d69bca4b94..2711d40a637489c1bfa3cc9676c2fb8043f978d4 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_LINAL_MATRIX_H_
 
 #include <algorithm>
+#include <ostream>
 #include "vector.h"
 
 namespace Msp {
@@ -260,6 +261,27 @@ inline Matrix<T, N, M> transpose(const Matrix<T, M, N> &m)
        return r;
 }
 
+template<typename T, unsigned M, unsigned N>
+inline std::ostream &operator<<(std::ostream &s, const Matrix<T, M, N> &m)
+{
+       s << "Matrix" << M << 'x' << N << '(';
+       for(unsigned i=0; i<N; ++i)
+       {
+               if(i)
+                       s << ", ";
+               s << '[';
+               for(unsigned j=0; j<M; ++j)
+               {
+                       if(j)
+                               s << ", ";
+                       s << m(j, i);
+               }
+               s << ']';
+       }
+       s << ')';
+       return s;
+}
+
 } // namespace LinAl
 } // namespace Msp
 
index 9a9d02822aebe554627178803b4c6bd4c2621ddc..c9b2a179fe5fd0ce595e4dda796b3c2d7b13ab5d 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <algorithm>
 #include <cmath>
+#include <ostream>
 
 namespace Msp {
 namespace LinAl {
@@ -325,6 +326,20 @@ inline Vector<T, 3> cross(const Vector<T, 3> &v1, const Vector<T, 3> &v2)
        return Vector<T, 3>(v1.y*v2.z-v1.z*v2.y, v1.z*v2.x-v1.x*v2.z, v1.x*v2.y-v1.y*v2.x);
 }
 
+template<typename T, unsigned N>
+inline std::ostream &operator<<(std::ostream &s, const Vector<T, N> &v)
+{
+       s << "Vector" << N << '(';
+       for(unsigned i=0; i<N; ++i)
+       {
+               if(i)
+                       s << ", ";
+               s << v[i];
+       }
+       s << ')';
+       return s;
+}
+
 } // namespace LinAl
 } // namespace Msp
 
index f0cae4da492540ea17299ebaaf318c480c3a9d25..d5e011bd98d66c4940ed34adf43b9fa4dfd407af 100644 (file)
@@ -23,16 +23,6 @@ private:
        void special_cases();
 };
 
-namespace Msp {
-namespace LinAl {
-
-void operator<<(LexicalConverter &conv, const Vector<double, 3> &vec)
-{
-       conv.result(format("[%g %g %g]", vec.x, vec.y, vec.z));
-}
-
-} }
-
 BoundingBoxTests::BoundingBoxTests()
 {
        add(&BoundingBoxTests::simple_union, "Union");
index 10e3ffd97e8284705ef398d27887c579372d947a..5b303dbe8cd99f706d4ce4889d766ee71f291657 100644 (file)
@@ -35,8 +35,8 @@ void MatrixTests::multiply()
 
        LinAl::Matrix<double, 3, 2> a(data);
        LinAl::Matrix<double, 2, 3> b(data+6);
-       EXPECT(a*b == (LinAl::Matrix<double, 3, 3>(data+12)));
-       EXPECT(b*a == (LinAl::Matrix<double, 2, 2>(data+21)));
+       EXPECT_EQUAL(a*b, (LinAl::Matrix<double, 3, 3>(data+12)));
+       EXPECT_EQUAL(b*a, (LinAl::Matrix<double, 2, 2>(data+21)));
 }
 
 template<typename T, unsigned N>