22#ifndef __ANTARES_LIBS_ARRAY_MATRIX_TO_BUFFER_SENDER_HXX__
23#define __ANTARES_LIBS_ARRAY_MATRIX_TO_BUFFER_SENDER_HXX__
26#define ANTARES_MATRIX_SNPRINTF sprintf_s
28#define ANTARES_MATRIX_SNPRINTF snprintf
31#include <antares/utils/utils.h>
40 static inline void Append(std::string& file, T v,
const char*
const)
44 file.append(std::to_string(0));
48 file.append(std::to_string(v));
54struct MatrixScalar<double>
56 static void Append(std::string& file,
double v,
const char*
const format)
64 char ConversionBuffer[128];
65 const int sizePrintf = Utils::isZero(v - floor(v))
66 ? ANTARES_MATRIX_SNPRINTF(ConversionBuffer,
67 sizeof(ConversionBuffer),
70 : ANTARES_MATRIX_SNPRINTF(ConversionBuffer,
71 sizeof(ConversionBuffer),
75 if (sizePrintf >= 0 and sizePrintf < (
int)(
sizeof(ConversionBuffer)))
77 file += (
const char*)ConversionBuffer;
88struct MatrixScalar<float>
90 static void Append(std::string& file,
float v,
const char*
const format)
98 char ConversionBuffer[128];
99 const int sizePrintf = Utils::isZero(v - floor(v))
100 ? ANTARES_MATRIX_SNPRINTF(ConversionBuffer,
101 sizeof(ConversionBuffer),
104 : ANTARES_MATRIX_SNPRINTF(ConversionBuffer,
105 sizeof(ConversionBuffer),
109 if (sizePrintf >= 0 and sizePrintf < (
int)(
sizeof(ConversionBuffer)))
111 file += (
const char*)ConversionBuffer;
123template<
class T,
class ReadWriteT,
class PredicateT>
124I_mtx_to_buffer_dumper<T, ReadWriteT, PredicateT>* matrix_to_buffer_dumper_factory::get_dumper(
125 const Matrix<T, ReadWriteT>* mtx,
127 PredicateT& predicate)
131 return new one_column__dumper<T, ReadWriteT, PredicateT>(mtx, data, predicate);
135 return new multiple_columns__dumper<T, ReadWriteT, PredicateT>(mtx, data, predicate);
139template<
class T,
class ReadWriteT,
class PredicateT>
140void I_mtx_to_buffer_dumper<T, ReadWriteT, PredicateT>::set_print_format(
bool isDecimal,
146 if (isDecimal and precision)
148 const char*
const sfmt[] = {
167 assert(precision <= 16);
168 format_ = sfmt[precision];
172template<
class T,
class ReadWriteT,
class PredicateT>
173void one_column__dumper<T, ReadWriteT, PredicateT>::run()
175 for (uint y = 0; y != (this->mtx_)->height; ++y)
177 MatrixScalar<ReadWriteT>::Append(this->buffer_,
178 (ReadWriteT)this->predicate_((this->mtx_)->entry[0][y]),
180 this->buffer_ +=
'\n';
184template<
class T,
class ReadWriteT,
class PredicateT>
185void multiple_columns__dumper<T, ReadWriteT, PredicateT>::run()
187 for (uint y = 0; y < (this->mtx_)->height; ++y)
189 MatrixScalar<ReadWriteT>::Append(this->buffer_,
190 (ReadWriteT)this->predicate_((this->mtx_)->entry[0][y]),
192 for (uint x = 1; x < (this->mtx_)->width; ++x)
194 this->buffer_ +=
'\t';
195 MatrixScalar<ReadWriteT>::Append(this->buffer_,
196 (ReadWriteT)this->predicate_(
197 (this->mtx_)->entry[x][y]),
200 this->buffer_ +=
'\n';
206#undef ANTARES_MATRIX_SNPRINTF