// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#ifndef EIGEN_IO_H
#define EIGEN_IO_H

// IWYU pragma: private
#include "./InternalHeaderCheck.h"

namespace Eigen {

enum { DontAlignCols = 1 };
enum { StreamPrecision = -1, FullPrecision = -2 };

namespace internal {
template <typename Derived>
std::ostream& print_matrix(std::ostream& s, const Derived& _m, const IOFormat& fmt);
}

/** \class IOFormat
 * \ingroup Core_Module
 *
 * \brief Stores a set of parameters controlling the way matrices are printed
 *
 * List of available parameters:
 *  - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c
 * FullPrecision. The default is the special value \c StreamPrecision which means to use the stream's own precision
 * setting, as set for instance using \c cout.precision(3). The other special value \c FullPrecision means that the
 * number of digits will be computed to match the full precision of each floating-point type.
 *  - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c
 * DontAlignCols which allows to disable the alignment of columns, resulting in faster code.
 *  - \b coeffSeparator string printed between two coefficients of the same row
 *  - \b rowSeparator string printed between two rows
 *  - \b rowPrefix string printed at the beginning of each row
 *  - \b rowSuffix string printed at the end of each row
 *  - \b matPrefix string printed at the beginning of the matrix
 *  - \b matSuffix string printed at the end of the matrix
 *  - \b fill character printed to fill the empty space in aligned columns
 *
 * Example: \include IOFormat.cpp
 * Output: \verbinclude IOFormat.out
 *
 * \sa DenseBase::format(), class WithFormat
 */
struct IOFormat {
  /** Default constructor, see class IOFormat for the meaning of the parameters */
  IOFormat(int _precision = StreamPrecision, int _flags = 0, const std::string& _coeffSeparator = " ",
           const std::string& _rowSeparator = "\n", const std::string& _rowPrefix = "",
           const std::string& _rowSuffix = "", const std::string& _matPrefix = "", const std::string& _matSuffix = "",
           const char _fill = ' ')
      : matPrefix(_matPrefix),
        matSuffix(_matSuffix),
        rowPrefix(_rowPrefix),
        rowSuffix(_rowSuffix),
        rowSeparator(_rowSeparator),
        rowSpacer(""),
        coeffSeparator(_coeffSeparator),
        fill(_fill),
        precision(_precision),
        flags(_flags) {
    // TODO: check if rowPrefix, rowSuffix or rowSeparator contains a newline
    // don't add rowSpacer if columns are not to be aligned
    if ((flags & DontAlignCols)) return;
    int i = int(matPrefix.length()) - 1;
    while (i >= 0 && matPrefix[i] != '\n') {
      rowSpacer += ' ';
      i--;
    }
  }
  std::string matPrefix, matSuffix;
  std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer;
  std::string coeffSeparator;
  char fill;
  int precision;
  int flags;
};

/** \class WithFormat
 * \ingroup Core_Module
 *
 * \brief Pseudo expression providing matrix output with given format
 *
 * \tparam ExpressionType the type of the object on which IO stream operations are performed
 *
 * This class represents an expression with stream operators controlled by a given IOFormat.
 * It is the return type of DenseBase::format()
 * and most of the time this is the only way it is used.
 *
 * See class IOFormat for some examples.
 *
 * \sa DenseBase::format(), class IOFormat
 */
template <typename ExpressionType>
class WithFormat {
 public:
  WithFormat(const ExpressionType& matrix, const IOFormat& format) : m_matrix(matrix), m_format(format) {}

  friend std::ostream& operator<<(std::ostream& s, const WithFormat& wf) {
    return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
  }

 protected:
  typename ExpressionType::Nested m_matrix;
  IOFormat m_format;
};

namespace internal {

// NOTE: This helper is kept for backward compatibility with previous code specializing
//       this internal::significant_decimals_impl structure. In the future we should directly
//       call max_digits10().
template <typename Scalar>
struct significant_decimals_impl {
  static inline int run() { return NumTraits<Scalar>::max_digits10(); }
};

/** \internal
 * print the matrix \a _m to the output stream \a s using the output format \a fmt */
template <typename Derived>
std::ostream& print_matrix(std::ostream& s, const Derived& _m, const IOFormat& fmt) {
  if (_m.size() == 0) {
    s << fmt.matPrefix << fmt.matSuffix;
    return s;
  }

  typename Derived::Nested m = _m;
  using Scalar = typename Derived::Scalar;
  using PrintType =
      std::conditional_t<std::is_same<Scalar, char>::value || std::is_same<Scalar, unsigned char>::value ||
                             std::is_same<Scalar, numext::int8_t>::value ||
                             std::is_same<Scalar, numext::uint8_t>::value,
                         int,
                         std::conditional_t<std::is_same<Scalar, std::complex<char> >::value ||
                                                std::is_same<Scalar, std::complex<unsigned char> >::value ||
                                                std::is_same<Scalar, std::complex<numext::int8_t> >::value ||
                                                std::is_same<Scalar, std::complex<numext::uint8_t> >::value,
                                            std::complex<int>, const Scalar&> >;

  Index width = 0;

  std::streamsize explicit_precision;
  if (fmt.precision == StreamPrecision) {
    explicit_precision = 0;
  } else if (fmt.precision == FullPrecision) {
    EIGEN_IF_CONSTEXPR (NumTraits<Scalar>::IsInteger) {
      explicit_precision = 0;
    } else {
      explicit_precision = significant_decimals_impl<Scalar>::run();
    }
  } else {
    explicit_precision = fmt.precision;
  }

  std::streamsize old_precision = 0;
  if (explicit_precision) old_precision = s.precision(explicit_precision);

  bool align_cols = !(fmt.flags & DontAlignCols);
  if (align_cols) {
    // compute the largest width
    for (Index j = 0; j < m.cols(); ++j)
      for (Index i = 0; i < m.rows(); ++i) {
        std::stringstream sstr;
        sstr.copyfmt(s);
        sstr << static_cast<PrintType>(m.coeff(i, j));
        width = std::max<Index>(width, Index(sstr.str().length()));
      }
  }
  std::streamsize old_width = s.width();
  char old_fill_character = s.fill();
  s << fmt.matPrefix;
  for (Index i = 0; i < m.rows(); ++i) {
    if (i) s << fmt.rowSpacer;
    s << fmt.rowPrefix;
    if (width) {
      s.fill(fmt.fill);
      s.width(width);
    }
    s << static_cast<PrintType>(m.coeff(i, 0));
    for (Index j = 1; j < m.cols(); ++j) {
      s << fmt.coeffSeparator;
      if (width) {
        s.fill(fmt.fill);
        s.width(width);
      }
      s << static_cast<PrintType>(m.coeff(i, j));
    }
    s << fmt.rowSuffix;
    if (i < m.rows() - 1) s << fmt.rowSeparator;
  }
  s << fmt.matSuffix;
  if (explicit_precision) s.precision(old_precision);
  if (width) {
    s.fill(old_fill_character);
    s.width(old_width);
  }
  return s;
}

}  // end namespace internal

/** \relates DenseBase
 *
 * Outputs the matrix, to the given stream.
 *
 * If you wish to print the matrix with a format different than the default, use DenseBase::format().
 *
 * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers.
 * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default
 * parameters.
 *
 * \sa DenseBase::format()
 */
template <typename Derived>
std::ostream& operator<<(std::ostream& s, const DenseBase<Derived>& m) {
  return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT);
}

template <typename Derived>
std::ostream& operator<<(std::ostream& s, const DiagonalBase<Derived>& m) {
  return internal::print_matrix(s, m.derived(), EIGEN_DEFAULT_IO_FORMAT);
}

}  // end namespace Eigen

#endif  // EIGEN_IO_H
