/*!
* \brief Input and output of vectors and matrices
*
* \author O. Krause
* \date 2013
*
*
* \par Copyright 1995-2015 Shark Development Team
*
*
* This file is part of Shark.
*
*
* Shark is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Shark is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Shark. If not, see .
*
*/
#ifndef REMORA_IO_HPP
#define REMORA_IO_HPP
// Only forward definition required to define stream operations
#include
#include
#include "expression_types.hpp"
namespace remora{
/** \brief output stream operator for vector expressions
*
* Any vector expressions can be written to a standard output stream
* as defined in the C++ standard library. For example:
* \code
* vector v1(3),v2(3);
* for(size_t i=0; i<3; i++)
* {
* v1(i) = i+0.2;
* v2(i) = i+0.3;
* }
* cout << v1+v2 << endl;
* \endcode
* will display the some of the 2 vectors like this:
* \code
* [3](0.5,2.5,4.5)
* \endcode
*
* \param os is a standard basic output stream
* \param vec is a vector expression
* \return a reference to the resulting output stream
*/
template
// This function seems to be big. So we do not let the compiler inline it.
std::basic_ostream &operator << (std::basic_ostream &os,
const vector_expression &vec) {
auto&& v = eval_block(vec);
typedef typename VE::size_type size_type;
size_type size = v.size ();
std::basic_ostringstream > s;
s.flags (os.flags ());
s.imbue (os.getloc ());
s.precision (os.precision ());
s << '[' << size << "](";
if (size > 0)
s << v(0);
for (size_type i = 1; i < size; ++ i)
s << ',' << v(i);
s << ')';
return os << s.str ().c_str ();
}
/** \brief output stream operator for matrix expressions
*
* it outputs the content of a \f$ (M \times N) \f$ matrix to a standard output
* stream using the following format:
* \c [ (rows),)(columns)](((m00),(m01),...,(m0N)),...,((mM0),(mM1),...,(mMN)))
*
* For example:
* \code
* matrix m(3,3) = scalar_matrix(3,3,1.0) - diagonal_matrix(3,3,1.0);
* cout << m << endl;
* \encode
* will display
* \code
* [3,3]((0,1,1),(1,0,1),(1,1,0))
* \endcode
* This output is made for storing and retrieving matrices in a simple way but you can
* easily recognize the following:
* \f[ \left( \begin{array}{ccc} 1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1 \end{array} \right) - \left( \begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{array} \right) = \left( \begin{array}{ccc} 0 & 1 & 1\\ 1 & 0 & 1\\ 1 & 1 & 0 \end{array} \right) \f]
*
* \param os is a standard basic output stream
* \param mat is a matrix expression
* \return a reference to the resulting output stream
*/
template
// This function seems to be big. So we do not let the compiler inline it.
std::basic_ostream &operator << (std::basic_ostream &os,
const matrix_expression &mat) {
auto&& m=eval_block(mat);
typedef typename ME::size_type size_type;
size_type size1 = m.size1 ();
size_type size2 = m.size2 ();
std::basic_ostringstream > s;
s.flags (os.flags ());
s.imbue (os.getloc ());
s.precision (os.precision ());
s << '[' << size1 << ',' << size2 << "](";
if (size1 > 0) {
s << '(' ;
if (size2 > 0)
s << m(0, 0);
for (size_type j = 1; j < size2; ++ j)
s << ',' << m(0, j);
s << ')';
}
for (size_type i = 1; i < size1; ++ i) {
s << ",(" ;
if (size2 > 0)
s << m(i, 0);
for (size_type j = 1; j < size2; ++ j)
s << ',' << m(i, j);
s << ')';
}
s << ')';
return os << s.str().c_str ();
}
}
#endif