#ifndef READ_PARMS_H
#define READ_PARMS_H
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
template <typename T>
T readValue(const char* filename, const char* parameter,
int position = 0) throw (std::string) {
T value;
std::ifstream in(filename, std::ios::in);
if (!in) throw std::string("unable to open '") + filename + "' for input";
std::string line;
while (std::getline(in, line)) {
std::istringstream is(line);
std::string s;
is >> s; if (s == std::string(parameter)) { for (int i = 0; i < position; ++i) is >> s;
is >> value; if (is.fail())
throw std::string("error reading '") + parameter + "' from '" + filename + "'";
return value;
}
}
throw std::string("parameter '") + parameter + "' not found in '" + filename + "'";
}template <typename T>
T readValue(T value, const char* filename, const char* parameter,
int position = 0) {
T t;
try { t = readValue<T>(filename, parameter, position); }
catch (std::string&) { t = value; } return t;
}template <typename T>
std::vector<T> readRange(const char* filename, const char* parameter, int size) {
std::vector<T> range(size);
range[0] = readValue<T>(filename, parameter); range[size - 1] = readValue<T>(range[0], filename, parameter, 1); for (int i = 1; i < size - 1; ++i) {
double value = range[0] + (static_cast<double>(i) / (size - 1.)) *
(range[size - 1] - range[0]);
range[i] = static_cast<T>(value); if ((value - range[i]) > .5) ++range[i];
else if ((value - range[i]) < -.5) --range[i];
}
return range;
}template <typename T>
std::vector<T> readRange(T value, const char* filename, const char* parameter, int size) {
std::vector<T> range(size);
try { range = readRange<T>(filename, parameter, size); }
catch (std::string&) { range = std::vector<T>(size, value); } return range;
}
#endif // READ_PARMS_H