32#include <boost/scope_exit.hpp>
35#include <boost/spirit/include/qi.hpp>
36#include <boost/phoenix/bind/bind_function.hpp>
37#include <boost/phoenix/operator.hpp>
38#include <boost/spirit/include/support_istream_iterator.hpp>
39#include <boost/spirit/include/karma_real.hpp>
40#include <boost/spirit/include/karma.hpp>
44 std::vector<std::vector<AT>> scalarToVecVec(
const AT& x) {
45 return std::vector<std::vector<AT>>(1, std::vector<AT>(1, x));
58 template <
class Type,
class Row,
class Col,
class AT> std::istream& operator>>(std::istream &s,
Matrix<Type,Row,Col,AT> &A) {
59 namespace qi = boost::spirit::qi;
60 namespace phx = boost::phoenix;
63 qi::rule<It, std::vector<std::vector<AT>>()> scalar;
64 qi::rule<It, std::vector<AT>()> row;
65 qi::rule<It, std::vector<std::vector<AT>>()> matrix;
66 qi::rule<It, std::vector<std::vector<AT>>()> scalarOrMatrix;
68 qi::rule<It, AT()> &atomicType = getBoostSpiritQiRule<AT>();
69 scalar = *qi::space >> atomicType[qi::_val=phx::bind(&scalarToVecVec<AT>, qi::_1)];
70 row = atomicType % (+qi::blank | (*qi::blank >>
',' >> *qi::blank));
71 matrix = *qi::space >>
'[' >> *qi::space >>
72 -(row % (*qi::blank >> (
';' | qi::eol) >> *qi::blank))[qi::_val=qi::_1] >>
74 scalarOrMatrix = scalar | matrix;
76 auto savedFlags=s.flags();
77 s.unsetf(std::ios::skipws);
78 BOOST_SCOPE_EXIT_TPL(&s, &savedFlags) {
80 } BOOST_SCOPE_EXIT_END
82 std::vector<std::vector<AT>> Avecvec;
83 if(!qi::parse(It(s), It(), scalarOrMatrix, Avecvec))
84 throw std::runtime_error(
"The stream does not contain a valid scalar, vector or matrix expression. Not parsed content of stream:\n"+
85 std::string(std::istreambuf_iterator<char>(s), std::istreambuf_iterator<char>()));
86 A<<=Matrix<Type,Row,Col,AT>(Avecvec);
98 namespace karma = boost::spirit::karma;
99 using It = std::ostream_iterator<char>;
101 static boost::spirit::karma::rule<It, std::vector<std::vector<AT>>()> matrix;
102 static bool init=
false;
104 static karma::rule<It, std::vector<AT>()> row;
106 auto &atomicType=getBoostSpiritKarmaRule<AT>();
108 row = -(atomicType %
", ")[karma::_1=karma::_val];
109 matrix =
'[' << -(row %
"; ")[karma::_1=karma::_val] <<
']';
112 auto Avecvec=
static_cast<std::vector<std::vector<AT>
>>(A);
113 if(!karma::generate(It(os), matrix, Avecvec))
114 throw std::runtime_error(
"Failed to write matrix to stream");
This is the basic matrix class for arbitrary matrices.
Definition: matrix.h:52
Namespace fmatvec.
Definition: _memory.cc:28
ostream & operator<<(ostream &s, const SymbolicExpression &se)
Write a SymbolicExpression to a stream using serialization.
Definition: ast.cc:190