8#ifndef model_TextFileParser_H_
9#define model_TextFileParser_H_
36 throw std::runtime_error(
"Unknown conversion from std::string "+
key+
" to "+
typeid(T).name()+
".");
46 return std::atoi(str.c_str());
56 return std::atol(str.c_str());
64 static long long toScalar(
const std::string& str)
66 return std::atoll(str.c_str());
74 static unsigned long toScalar(
const std::string& str)
76 return std::stoul(str.c_str());
84 static unsigned long long toScalar(
const std::string& str)
86 return std::stoull(str.c_str());
96 return std::stof(str.c_str());
106 return std::stod(str.c_str());
115 static long double toScalar(
const std::string& str)
117 return std::stold(str.c_str());
125 template <
typename Scalar>
126 using EigenMapType=Eigen::Map<const Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>, 0, Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic> >;
128 std::vector<std::pair<std::string,std::string>> readKey(
const std::string&
key)
132 std::vector<std::pair<std::string,std::string>> returnVector;
135 while (std::getline(*
this, line))
137 const size_t foundKey=line.find(
key);
138 const size_t foundEqual=line.find(
"=");
140 if( foundKey!=std::string::npos
141 && foundEqual!=std::string::npos
142 && foundKey<foundEqual)
150 const size_t foundSemiCol=line.find(
";");
151 const size_t foundPound=line.find(
"#");
154 foundEqual!=std::string::npos
155 && foundSemiCol!=std::string::npos
157 && foundEqual<foundSemiCol
158 && foundSemiCol<foundPound
161 const std::string
read(line.substr(foundEqual+1,foundSemiCol-foundEqual-1));
163 if(foundPound!=std::string::npos)
165 const std::string comment(line.substr(foundPound,line.size()-foundPound));
166 returnVector.emplace_back(
read,comment);
170 returnVector.emplace_back(
read,std::string());
186 std::ifstream(_fileName)
191 throw std::runtime_error(
"File "+
fileName+
" cannot be opened.");
204 const auto strPair(readKey(
key));
208 return strPair[0].first;
212 throw std::runtime_error(
"File "+
fileName+
" does not cointain line with format "+
key+
"=...;");
213 return std::string();
226 std::stringstream
ss(valStr);
228 std::set<std::string> tempS;
229 while (
ss >> tempVal)
231 tempS.insert(tempVal);
237 template<
typename Scalar>
240 const auto strPair(readKey(
key));
245 if(verbose) std::cout<<
read<<
" "<<strPair[0].second<<
defaultColor<<std::endl;
250 throw std::runtime_error(
"File "+
fileName+
" does not cointain line with format "+
key+
"=...;");
260 template<
typename Scalar>
261 std::set<Scalar>
readSet(
const std::string&
key,
const bool&verbose=
false)
264 std::set<Scalar> tempS;
265 for(
const auto& val : tempV)
272 for(
const auto& val : tempS)
281 template<
typename KeyType,
typename Scalar>
282 std::tuple<bool,bool,KeyType,std::vector<Scalar>,std::string>
splitMapLine(
const std::string& line)
const
284 std::tuple<bool,bool,KeyType,std::vector<Scalar>,std::string>
temp(std::make_tuple(
false,
false,
KeyType(),std::vector<Scalar>(),std::string()));
286 const size_t foundCol=line.find(
":");
287 const size_t foundSemiCol=line.find(
";");
288 const size_t foundPound=line.find(
"#");
290 if(foundCol!=std::string::npos
291 && (foundPound==std::string::npos || foundPound>foundSemiCol))
293 std::get<0>(
temp)=
true;
294 std::get<1>(
temp)=(foundPound!=std::string::npos);
297 const std::string valStr(foundSemiCol==std::string::npos? line.substr(foundCol+1,line.size()-foundCol-1) : line.substr(foundCol+1,foundSemiCol-foundCol-1));
299 std::stringstream
ss(valStr);
300 while (
ss >> tempVal)
302 std::get<3>(
temp).push_back(tempVal);
304 if(foundPound!=std::string::npos)
306 std::get<4>(
temp)=line.substr(foundPound+1,line.size()-foundPound-1);
313 template<
typename KeyType,
typename Scalar>
314 std::map<KeyType,std::vector<Scalar>>
readArrayMap(
const std::string&
key,
const bool&verbose=
false)
321 std::map<KeyType,std::vector<Scalar>>
temp;
323 while (std::getline(*
this, line) || !
success)
326 const size_t foundKey=line.find(
key);
327 const size_t foundEqual=line.find(
"=");
332 && foundKey!=std::string::npos
333 && foundEqual!=std::string::npos
334 && foundKey<foundEqual)
341 temp.emplace(std::get<2>(tup),std::get<3>(tup));
350 while(std::getline(*
this, line))
356 temp.emplace(std::get<2>(tup),std::get<3>(tup));
371 throw std::runtime_error(
"File "+
fileName+
" does not cointain line with format "+
key+
"=...;");
377 for(
const auto& pair :
temp)
379 std::cout<<pair.first<<
" : ";
380 for(
const auto& val : pair.second)
384 std::cout<<std::endl;
394 template<
typename Scalar>
395 std::vector<Scalar>
readArray(
const std::string&
key,
const bool&verbose=
false)
403 std::vector<Scalar> array;
406 while (std::getline(*
this, line))
409 const size_t foundKey=line.find(
key);
410 const size_t foundEqual=line.find(
"=");
416 size_t foundSemiCol=line.find(
";");
417 size_t foundPound=line.find(
"#");
419 if( foundKey!=std::string::npos
420 && foundEqual!=std::string::npos
421 && foundKey<foundEqual
422 && (foundPound==std::string::npos || foundPound>foundSemiCol)
426 foundSemiCol=line.find(
";");
428 if( foundSemiCol!=std::string::npos
429 && foundEqual<foundSemiCol)
435 while(std::getline(*
this, line))
438 foundSemiCol=lines.find(
";");
439 if(foundSemiCol!=std::string::npos && foundEqual<foundSemiCol)
449 foundPound=line.find(
"#");
450 if(foundPound!=std::string::npos)
452 comment=lines.substr(foundPound,lines.size()-foundPound);
457 std::stringstream
ss(lines.substr(foundEqual+1,foundSemiCol-foundEqual-1));
460 array.push_back(
temp);
470 throw std::runtime_error(
"File "+
fileName+
" does not cointain line with format "+
key+
"=...;");
476 for(
const auto& val : array)
487 template<
typename Scalar>
488 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
readMatrix(
const std::string&
key,
const size_t& rows,
const size_t& cols,
const bool&verbose=
false)
492 if(array.size()!=rows*cols)
494 throw std::runtime_error(
"Error in reading matrix "+
key+
": array.size="+std::to_string(array.size())+
" is not equal to rows x cols ("+std::to_string(rows)+
"x"+std::to_string(cols)+
").");
500 EigenMapType<Scalar> em(array.data(), rows, cols, Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic>(1, cols));
502 return Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>(em);
506 template<
typename Scalar,
int rows,
int cols>
507 Eigen::Matrix<Scalar,rows,cols>
readMatrix(
const std::string&
key,
const bool&verbose=
false)
513 template<
typename Scalar>
514 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
readMatrixCols(
const std::string&
key,
const size_t& cols,
const bool&verbose=
false)
518 if(array.size()%cols!=0)
520 throw std::runtime_error(
"Error in reading matrix "+
key+
": array.size="+std::to_string(array.size())+
" is not a multiple of cols ("+std::to_string(cols)+
").");
522 const size_t rows(array.size()/cols);
523 EigenMapType<Scalar> em(array.data(), rows, cols, Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic>(1, cols));
525 return Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>(em);
529 template<
typename Scalar>
530 Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>
readMatrixRows(
const std::string&
key,
const size_t& rows,
const bool&verbose=
false)
534 if(array.size()%rows!=0)
536 throw std::runtime_error(
"Error in reading matrix "+
key+
": array.size="+std::to_string(array.size())+
" is not a multiple of rows ("+std::to_string(rows)+
").");
538 const size_t cols(array.size()/rows);
539 EigenMapType<Scalar> em(array.data(), rows, cols, Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic>(1, cols));
541 return Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic>(em);
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > readMatrixCols(const std::string &key, const size_t &cols, const bool &verbose=false)
TextFileParser(const std::string &_fileName)
std::vector< std::pair< std::string, std::string > > readStringVector(const std::string &key)
std::map< KeyType, std::vector< Scalar > > readArrayMap(const std::string &key, const bool &verbose=false)
const std::string fileName
std::vector< Scalar > readArray(const std::string &key, const bool &verbose=false)
std::string readString(const std::string &key, const bool &verbose=false)
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > readMatrix(const std::string &key, const size_t &rows, const size_t &cols, const bool &verbose=false)
Scalar readScalar(const std::string &key, const bool &verbose=false)
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > readMatrixRows(const std::string &key, const size_t &rows, const bool &verbose=false)
std::tuple< bool, bool, KeyType, std::vector< Scalar >, std::string > splitMapLine(const std::string &line) const
std::set< std::string > readStringSet(const std::string &key, const bool &verbose=false)
std::set< Scalar > readSet(const std::string &key, const bool &verbose=false)
Eigen::Matrix< Scalar, rows, cols > readMatrix(const std::string &key, const bool &verbose=false)
static std::string cyanColor
static std::string defaultColor
static std::string removeSpaces(std::string key)
static double toScalar(const std::string &str)
static float toScalar(const std::string &str)
static int toScalar(const std::string &str)
static long toScalar(const std::string &str)
static long double toScalar(const std::string &str)
static long long toScalar(const std::string &str)
static unsigned long toScalar(const std::string &str)
static unsigned long long toScalar(const std::string &str)
static T toScalar(const std::string &key)
std::string read(const fs::path &path)
enum insertvertexresult success