#ifndef HPC_MATVEC_PRINT_H
#define HPC_MATVEC_PRINT_H 1
#include <complex>
#include <type_traits>
#include <hpc/matvec/isgematrix.h>
#include <hpc/matvec/isdensevector.h>
namespace hpc { namespace matvec {
template <typename T>
struct Format
{
};
template <>
struct Format<long>
{
static const char *
value()
{
return " %10ld";
}
};
template <>
struct Format<unsigned long>
{
static const char *
value()
{
return " %10lu";
}
};
template <>
struct Format<float>
{
static const char *
value()
{
return " %10.3f";
}
};
template <>
struct Format<double>
{
static const char *
value()
{
return " %10.3lf";
}
};
template <>
struct Format<std::complex<double> >
{
static const char *
value()
{
return " (%10.3lf, %10.3lf)";
}
};
//------------------------------------------------------------------------------
template <typename T>
void
print_value(T value) {
std::printf(Format<T>::value(), value);
}
template <typename T>
void
print_value(const std::complex<T> &value) {
std::printf(Format<std::complex<T> >::value(), value.real(), value.imag());
}
template <typename MA>
typename std::enable_if<IsGeMatrix<MA>::value,
void>::type
print(const MA &A, const char *name = "")
{
typedef typename MA::Index Index;
if (*name) {
printf("%s = \n", name);
}
for (Index i=0; i<A.numRows; ++i) {
for (Index j=0; j<A.numCols; ++j) {
print_value(A(i,j));
}
printf("\n");
}
printf("\n");
}
template <typename VX>
typename std::enable_if<IsDenseVector<VX>::value,
void>::type
print(const VX &x, const char *name = "")
{
typedef typename VX::Index Index;
if (*name) {
printf("%s = \n", name);
}
for (Index i=0; i<x.length; ++i) {
print_value(x(i));
}
printf("\n");
}
} } // namespace matvec, hpc
#endif // HPC_MATVEC_PRINT_H