diff --git a/Device/InputOutput/DataFormatUtils.cpp b/Device/InputOutput/DataFormatUtils.cpp index dcfcf000a2c2ed164e41ea4d20da105ec0a902d3..7570df4716029e23b6e5e2ad249df2632e217936 100644 --- a/Device/InputOutput/DataFormatUtils.cpp +++ b/Device/InputOutput/DataFormatUtils.cpp @@ -23,13 +23,76 @@ #include <iterator> namespace { -std::istringstream getAxisStringRepresentation(std::istream& input_stream); +using createAxisFun = std::function<std::unique_ptr<IAxis>(std::istringstream iss)>; -template <class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istringstream iss); -std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss); -std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss); +const std::string GzipExtension = ".gz"; +const std::string BzipExtension = ".bz2"; +const std::string IntExtension = ".int"; +const std::string NicosExtension = ".001"; +const std::string TiffExtension = ".tif"; +const std::string TiffExtension2 = ".tiff"; + +std::istringstream getAxisStringRepresentation(std::istream& input_stream) +{ + std::string line; + std::getline(input_stream, line); + const std::vector<std::string> to_replace = {",", "\"", "(", ")", "[", "]"}; + StringUtils::replaceItemsFromString(line, to_replace, " "); + return std::istringstream(line); +} + +//! Creates one of FixedBinAxis from string representation +//! FixedBinAxis("axis0", 10, -1, 1) +//! ConstKBinAxis("axis0", 10, -1, 1) +//! CustomBinAxis("axis0", 10, -1, 1) +template <class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istringstream iss) +{ + std::string name; + size_t nbins(0); + if (!(iss >> name >> nbins)) + throw std::runtime_error("createFixedBinLikeAxis() -> Error. Can't parse the string."); + + std::vector<double> boundaries; + DataFormatUtils::readLineOfDoubles(boundaries, iss); + if (boundaries.size() != 2) + throw std::runtime_error("Error in createFixedBinLikeAxis: Can't parse the string while " + "reading boundaries."); + + return std::make_unique<Axis>(name, nbins, boundaries[0], boundaries[1]); +} + +//! Creates VariableBinAxis from string representation +//! VariableBinAxis("axis0", 4, [-1, -0.5, 0.5, 1, 2]) +std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss) +{ + std::string name; + size_t nbins(0); + if (!(iss >> name >> nbins)) + throw std::runtime_error("Error in createVariableBinAxis: Can't parse the string."); + + std::vector<double> boundaries; + DataFormatUtils::readLineOfDoubles(boundaries, iss); + if (boundaries.size() != nbins + 1) + throw std::runtime_error( + "Error in createVariableBinAxis: wrong number of boundaries read."); + + return std::make_unique<VariableBinAxis>(name, nbins, boundaries); +} + +//! Creates createPointwiseAxis from string representation +//! PointwiseAxis("axis0", [-0.5, 0.5, 1, 2]) +std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss) +{ + std::string name; + if (!(iss >> name)) + throw std::runtime_error("Error in createPointwiseAxis:Can't parse the string."); + + std::vector<double> coordinates; + DataFormatUtils::readLineOfDoubles(coordinates, iss); + + return std::make_unique<PointwiseAxis>(name, coordinates); +} -using createAxisFun = std::function<std::unique_ptr<IAxis>(std::istringstream iss)>; const std::vector<std::pair<std::string, createAxisFun>> type_map = { {"ConstKBinAxis", createFixedBinLikeAxis<ConstKBinAxis>}, {"CustomBinAxis", createFixedBinLikeAxis<CustomBinAxis>}, @@ -37,14 +100,9 @@ const std::vector<std::pair<std::string, createAxisFun>> type_map = { {"PointwiseAxis", createPointwiseAxis}, {"VariableBinAxis", createVariableBinAxis}}; -const std::string GzipExtension = ".gz"; -const std::string BzipExtension = ".bz2"; -const std::string IntExtension = ".int"; -const std::string NicosExtension = ".001"; -const std::string TiffExtension = ".tif"; -const std::string TiffExtension2 = ".tiff"; } // namespace + bool DataFormatUtils::isCompressed(const std::string& name) { return isGZipped(name) || isBZipped(name); @@ -160,66 +218,3 @@ void DataFormatUtils::readLineOfDoubles(std::vector<double>& buffer, std::istrin std::copy(std::istream_iterator<double>(iss), std::istream_iterator<double>(), back_inserter(buffer)); } - -namespace { -std::istringstream getAxisStringRepresentation(std::istream& input_stream) -{ - std::string line; - std::getline(input_stream, line); - const std::vector<std::string> to_replace = {",", "\"", "(", ")", "[", "]"}; - StringUtils::replaceItemsFromString(line, to_replace, " "); - return std::istringstream(line); -} - -//! Creates one of FixedBinAxis from string representation -//! FixedBinAxis("axis0", 10, -1, 1) -//! ConstKBinAxis("axis0", 10, -1, 1) -//! CustomBinAxis("axis0", 10, -1, 1) -template <class Axis> std::unique_ptr<IAxis> createFixedBinLikeAxis(std::istringstream iss) -{ - std::string name; - size_t nbins(0); - if (!(iss >> name >> nbins)) - throw std::runtime_error("createFixedBinLikeAxis() -> Error. Can't parse the string."); - - std::vector<double> boundaries; - DataFormatUtils::readLineOfDoubles(boundaries, iss); - if (boundaries.size() != 2) - throw std::runtime_error("Error in createFixedBinLikeAxis: Can't parse the string while " - "reading boundaries."); - - return std::make_unique<Axis>(name, nbins, boundaries[0], boundaries[1]); -} - -//! Creates VariableBinAxis from string representation -//! VariableBinAxis("axis0", 4, [-1, -0.5, 0.5, 1, 2]) -std::unique_ptr<IAxis> createVariableBinAxis(std::istringstream iss) -{ - std::string name; - size_t nbins(0); - if (!(iss >> name >> nbins)) - throw std::runtime_error("Error in createVariableBinAxis: Can't parse the string."); - - std::vector<double> boundaries; - DataFormatUtils::readLineOfDoubles(boundaries, iss); - if (boundaries.size() != nbins + 1) - throw std::runtime_error( - "Error in createVariableBinAxis: wrong number of boundaries read."); - - return std::make_unique<VariableBinAxis>(name, nbins, boundaries); -} - -//! Creates createPointwiseAxis from string representation -//! PointwiseAxis("axis0", [-0.5, 0.5, 1, 2]) -std::unique_ptr<IAxis> createPointwiseAxis(std::istringstream iss) -{ - std::string name; - if (!(iss >> name)) - throw std::runtime_error("Error in createPointwiseAxis:Can't parse the string."); - - std::vector<double> coordinates; - DataFormatUtils::readLineOfDoubles(coordinates, iss); - - return std::make_unique<PointwiseAxis>(name, coordinates); -} -} // namespace