Skip to content
Snippets Groups Projects
Commit d6ef5943 authored by Van Herck, Walter's avatar Van Herck, Walter
Browse files

Refactor: extracted functions

parent f0d04cc2
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@
#include "Utils.h"
#include "OutputData.h"
#include "FileSystem.h"
#include <iostream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
......@@ -148,13 +149,11 @@ IAxis *OutputDataIOHelper::createFixedBinAxis(std::string line)
size_t nbins(0);
std::istringstream iss(line);
iss.imbue(std::locale::classic());
if( !(iss >> type >> name >> nbins) )
throw Exceptions::FormatErrorException("OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string.");
std::vector<double> boundaries;
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), back_inserter(boundaries));
readLineOfDoubles(boundaries, iss);
if(boundaries.size() != 2)
throw Exceptions::FormatErrorException("OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string at p2.");
......@@ -185,12 +184,10 @@ IAxis *OutputDataIOHelper::createVariableBinAxis(std::string line)
size_t nbins(0);
std::istringstream iss(line);
iss.imbue(std::locale::classic());
if( !(iss >> type >> name >> nbins) )
throw Exceptions::FormatErrorException("OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string.");
std::vector<double> boundaries;
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), back_inserter(boundaries));
readLineOfDoubles(boundaries, iss);
if(boundaries.size() != nbins+1)
throw Exceptions::FormatErrorException("OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string at p2.");
return new VariableBinAxis(name, nbins, boundaries);
......@@ -207,10 +204,8 @@ void OutputDataIOHelper::fillOutputData(OutputData<double> *data, std::istream &
if(line.empty() || line[0] == '#') break;
std::istringstream iss(line);
iss.imbue(std::locale::classic());
std::vector<double> buffer;
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), back_inserter(buffer));
readLineOfDoubles(buffer, iss);
for (auto value : buffer) {
*it = value;
++it;
......@@ -219,3 +214,10 @@ void OutputDataIOHelper::fillOutputData(OutputData<double> *data, std::istream &
if(it!= data->end())
throw Exceptions::FormatErrorException("OutputDataIOHelper::fillOutputData() -> Error while parsing data.");
}
void OutputDataIOHelper::readLineOfDoubles(std::vector<double> &buffer, std::istringstream &iss)
{
iss.imbue(std::locale::classic());
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), back_inserter(buffer));
}
......@@ -20,6 +20,7 @@
#include "WinDllMacros.h"
#include <string>
#include <iostream>
#include <vector>
class IAxis;
template <class T> class OutputData;
......@@ -69,7 +70,7 @@ BA_CORE_API_ IAxis *createVariableBinAxis(std::string line);
BA_CORE_API_ void fillOutputData(OutputData<double> *data, std::istream &input_stream);
void readLineOfDoubles(std::vector<double> &buffer, std::istringstream &iss);
}
#endif
......@@ -20,7 +20,9 @@
#include <iostream>
#include <iomanip>
double IOutputDataWriteStrategy::ignoreDenormalized(double value)
static const int precision { 12 };
double IgnoreDenormalized(double value)
{
if (std::abs(value)<std::numeric_limits<double>::min()) {
return 0.0;
......@@ -28,6 +30,23 @@ double IOutputDataWriteStrategy::ignoreDenormalized(double value)
return value;
}
void WriteOutputDataDoubles(const OutputData<double> &data, std::ostream &output_stream,
size_t n_columns)
{
OutputData<double>::const_iterator it = data.begin();
output_stream.imbue(std::locale::classic());
output_stream << std::scientific << std::setprecision(precision);
size_t ncol(0);
while(it != data.end()) {
ncol++;
double z_value = *it++;
output_stream << IgnoreDenormalized(z_value) << " ";
if(ncol == n_columns) {
output_stream << std::endl;
ncol = 0;
}
}
}
void OutputDataWriteINTStrategy::writeOutputData(const OutputData<double> &data,
std::ostream &output_stream)
......@@ -44,18 +63,7 @@ void OutputDataWriteINTStrategy::writeOutputData(const OutputData<double> &data,
output_stream << std::endl;
output_stream << "# data" << std::endl;
OutputData<double>::const_iterator it = data.begin();
size_t ncol(0);
while(it != data.end()) {
ncol++;
double z_value = *it++;
output_stream << std::scientific << std::setprecision(m_precision)
<< ignoreDenormalized(z_value) << " ";
if(ncol == n_columns) {
output_stream << std::endl;
ncol = 0;
}
}
WriteOutputDataDoubles(data, output_stream, n_columns);
output_stream << std::endl;
}
......@@ -78,18 +86,7 @@ void OutputDataWriteNumpyTXTStrategy::writeOutputData(const OutputData<double> &
output_stream << "# [nrows=" << nrows
<< ", ncols=" << ncols << "]" << std::endl;
std::vector<int> axes_indices(2);
for(size_t row=0; row<nrows; ++row) {
for(size_t col=0; col<ncols; ++col) {
axes_indices[0] = col;
axes_indices[1] = nrows - 1 - row;
size_t global_index = data.toGlobalIndex(axes_indices);
output_stream << std::scientific << std::setprecision(m_precision)
<< ignoreDenormalized(data[global_index]) << " ";
}
output_stream << std::endl;
}
WriteOutputDataDoubles(data,output_stream, ncols);
}
// ----------------------------------------------------------------------------
......
......@@ -29,13 +29,10 @@ template <class T> class OutputData;
class BA_CORE_API_ IOutputDataWriteStrategy
{
public:
IOutputDataWriteStrategy() : m_precision(12) {}
IOutputDataWriteStrategy() {}
virtual ~IOutputDataWriteStrategy(){}
virtual void writeOutputData(const OutputData<double>& data, std::ostream& output_stream) = 0;
protected:
double ignoreDenormalized(double value);
int m_precision;
};
//! @class OutputDataWriteINTStrategy
......
......@@ -15,6 +15,8 @@
#include "Utils.h"
#include "Exceptions.h"
#include "OutputDataIOHelper.h"
#include <iostream>
#include <iomanip>
#include <boost/regex.hpp>
......@@ -45,9 +47,7 @@ vdouble1d_t Utils::String::parse_doubles(const std::string& str)
{
vdouble1d_t buff_1d;
std::istringstream iss(str);
iss.imbue(std::locale::classic());
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), back_inserter(buff_1d));
OutputDataIOHelper::readLineOfDoubles(buff_1d, iss);
if( buff_1d.empty() ) {
std::cout << "Utils::String::parse_doubles -> "
"Warning! No parsed values in 1d vector of doubles." << std::endl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment