16#include "./InternalHeaderCheck.h"
20enum { DontAlignCols = 1 };
21enum { StreamPrecision = -1, FullPrecision = -2 };
24template <
typename Derived>
25std::ostream& print_matrix(std::ostream& s,
const Derived& _m,
const IOFormat& fmt);
55 IOFormat(
int _precision = StreamPrecision,
int _flags = 0,
const std::string& _coeffSeparator =
" ",
56 const std::string& _rowSeparator =
"\n",
const std::string& _rowPrefix =
"",
57 const std::string& _rowSuffix =
"",
const std::string& _matPrefix =
"",
const std::string& _matSuffix =
"",
58 const char _fill =
' ')
59 : matPrefix(_matPrefix),
60 matSuffix(_matSuffix),
61 rowPrefix(_rowPrefix),
62 rowSuffix(_rowSuffix),
63 rowSeparator(_rowSeparator),
65 coeffSeparator(_coeffSeparator),
67 precision(_precision),
71 if ((flags & DontAlignCols))
return;
72 int i = int(matPrefix.length()) - 1;
73 while (i >= 0 && matPrefix[i] !=
'\n') {
78 std::string matPrefix, matSuffix;
79 std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer;
80 std::string coeffSeparator;
101template <
typename ExpressionType>
104 WithFormat(
const ExpressionType& matrix,
const IOFormat& format) : m_matrix(matrix), m_format(format) {}
106 friend std::ostream& operator<<(std::ostream& s,
const WithFormat& wf) {
107 return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
111 typename ExpressionType::Nested m_matrix;
120template <
typename Scalar>
121struct significant_decimals_impl {
122 static inline int run() {
return NumTraits<Scalar>::max_digits10(); }
127template <
typename Derived>
128std::ostream& print_matrix(std::ostream& s,
const Derived& _m,
const IOFormat& fmt) {
129 if (_m.size() == 0) {
130 s << fmt.matPrefix << fmt.matSuffix;
134 typename Derived::Nested m = _m;
135 using Scalar =
typename Derived::Scalar;
137 std::conditional_t<std::is_same<Scalar, char>::value || std::is_same<Scalar, unsigned char>::value ||
138 std::is_same<Scalar, numext::int8_t>::value ||
139 std::is_same<Scalar, numext::uint8_t>::value,
141 std::conditional_t<std::is_same<Scalar, std::complex<char> >::value ||
142 std::is_same<Scalar, std::complex<unsigned char> >::value ||
143 std::is_same<Scalar, std::complex<numext::int8_t> >::value ||
144 std::is_same<Scalar, std::complex<numext::uint8_t> >::value,
145 std::complex<int>,
const Scalar&> >;
149 std::streamsize explicit_precision;
150 if (fmt.precision == StreamPrecision) {
151 explicit_precision = 0;
152 }
else if (fmt.precision == FullPrecision) {
153 EIGEN_IF_CONSTEXPR (NumTraits<Scalar>::IsInteger) {
154 explicit_precision = 0;
156 explicit_precision = significant_decimals_impl<Scalar>::run();
159 explicit_precision = fmt.precision;
162 std::streamsize old_precision = 0;
163 if (explicit_precision) old_precision = s.precision(explicit_precision);
165 bool align_cols = !(fmt.flags & DontAlignCols);
168 for (Index j = 0; j < m.cols(); ++j)
169 for (Index i = 0; i < m.rows(); ++i) {
170 std::stringstream sstr;
172 sstr << static_cast<PrintType>(m.coeff(i, j));
173 width = std::max<Index>(width, Index(sstr.str().length()));
176 std::streamsize old_width = s.width();
177 char old_fill_character = s.fill();
179 for (Index i = 0; i < m.rows(); ++i) {
180 if (i) s << fmt.rowSpacer;
186 s << static_cast<PrintType>(m.coeff(i, 0));
187 for (Index j = 1; j < m.cols(); ++j) {
188 s << fmt.coeffSeparator;
193 s << static_cast<PrintType>(m.coeff(i, j));
196 if (i < m.rows() - 1) s << fmt.rowSeparator;
199 if (explicit_precision) s.precision(old_precision);
201 s.fill(old_fill_character);
221template <
typename Derived>
223 return internal::print_matrix(s, m.
eval(), EIGEN_DEFAULT_IO_FORMAT);
226template <
typename Derived>
228 return internal::print_matrix(s, m.
derived(), EIGEN_DEFAULT_IO_FORMAT);
std::ostream & operator<<(std::ostream &s, const DenseBase< Derived > &m)
Definition IO.h:222
constexpr DenseBase()=default
EvalReturnType eval() const
Definition DenseBase.h:385
Base class for diagonal matrices and expressions.
Definition DiagonalMatrix.h:34
const Derived & derived() const
Definition DiagonalMatrix.h:60