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));
54 struct 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;
88 struct 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;
123 template<
class T,
class ReadWriteT,
class PredicateT>
124 std::unique_ptr<I_mtx_to_buffer_dumper<T, ReadWriteT, PredicateT>>
125 matrix_to_buffer_dumper_factory::get_dumper(
const Matrix<T, ReadWriteT>* mtx,
127 PredicateT& predicate)
131 return std::make_unique<one_column__dumper<T, ReadWriteT, PredicateT>>(mtx,
137 return std::make_unique<multiple_columns__dumper<T, ReadWriteT, PredicateT>>(mtx,
143 template<
class T,
class ReadWriteT,
class PredicateT>
144 void I_mtx_to_buffer_dumper<T, ReadWriteT, PredicateT>::set_print_format(
bool isDecimal,
150 if (isDecimal and precision)
152 const char*
const sfmt[] = {
171 assert(precision <= 16);
172 format_ = sfmt[precision];
176 template<
class T,
class ReadWriteT,
class PredicateT>
177 void one_column__dumper<T, ReadWriteT, PredicateT>::run()
179 for (uint y = 0; y != (this->mtx_)->height; ++y)
181 MatrixScalar<ReadWriteT>::Append(this->buffer_,
182 (ReadWriteT)this->predicate_((this->mtx_)->entry[0][y]),
183 this->format_.c_str());
184 this->buffer_ +=
'\n';
188 template<
class T,
class ReadWriteT,
class PredicateT>
189 void multiple_columns__dumper<T, ReadWriteT, PredicateT>::run()
191 for (uint y = 0; y < (this->mtx_)->height; ++y)
193 MatrixScalar<ReadWriteT>::Append(this->buffer_,
194 (ReadWriteT)this->predicate_((this->mtx_)->entry[0][y]),
195 this->format_.c_str());
196 for (uint x = 1; x < (this->mtx_)->width; ++x)
198 this->buffer_ +=
'\t';
199 MatrixScalar<ReadWriteT>::Append(this->buffer_,
200 (ReadWriteT)this->predicate_(
201 (this->mtx_)->entry[x][y]),
202 this->format_.c_str());
204 this->buffer_ +=
'\n';
210 #undef ANTARES_MATRIX_SNPRINTF