47#include <unordered_map>
59 inline int is_match(
const std::string& line_,
const std::string& pattern_)
62 const auto lineCStr = line_.c_str();
63 const auto patternCStr = pattern_.c_str();
65 const char* line = &(lineCStr[0]);
66 const char* pattern = &(patternCStr[0]);
72 const char* last_pattern_start = 0;
73 const char* last_line_start = 0;
76 if (*pattern == *line)
79 last_line_start = line + 1;
85 else if (*pattern ==
'?')
90 last_line_start = line + 1;
95 else if (*pattern ==
'*')
97 if (*(pattern + 1) ==
'\0')
100 last_pattern_start = pattern;
120 if ((*pattern) ==
'\0' && (*line) ==
'\0')
124 if (last_pattern_start != 0)
126 pattern = last_pattern_start;
127 line = last_line_start;
137 if (*pattern ==
'\0')
165 std::unordered_map<std::string, std::vector<std::string>>
database;
171 std::unordered_map<std::string, std::vector<std::string>>
defaults;
177 std::unordered_map<std::string, std::vector<std::string>>
vars;
183 std::unordered_map<std::string, std::vector<std::string>>
switchers;
196 std::istream& stream,
197 std::unordered_map<std::string, std::vector<std::string>>&
database,
198 std::vector<std::string> specificKey = {},
199 bool replaceVars =
false,
200 char openBracket =
'(',
char closeBracket =
')'
209 void MergeDbsWithoutRepeats(std::unordered_map<std::string, std::vector<std::string>>&
database,
const std::unordered_map<std::string, std::vector<std::string>>&);
232 StreamParser(
LogStream& infoStream,
const std::string& label, std::istream& mainStream, std::istream& defaultsStream, std::istream& switchersStream, std::istream& varsStream, std::vector<std::string> specificKey = {});
244 StreamParser(LogStream& infoStream,
const std::string& label, std::istream& mainStream, std::istream& defaultsStream, std::vector<std::string> specificKey = {});
256 StreamParser(LogStream& infoStream,
const std::string& label, std::istream& mainStream,
char openBracket =
'{',
char closeBracket =
'}');
265 static std::string
UpperCase(
const std::string& line);
274 static std::vector<std::string>
StringToVector(std::string line,
char openBracket =
'(',
char closeBracket =
')');
300 template <
typename T>
301 void SetDefault(
const std::string& name, T& res,
const T* defValue,
bool echoDefault)
const
303 if (defValue !=
nullptr)
307 info(
'i') <<
"parameter <" << name <<
" = " << res <<
"> set as default" << std::endl;
311 info(
'e') <<
"parameter " << name <<
" is not found" << std::endl;
324 bool get(
const std::string& name, std::vector<Point2D>& res,
const std::vector<Point2D>* defValue =
nullptr,
bool echoDefault =
true)
const
326 bool boolRes =
false;
330 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
332 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
336 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
343 if (((search_it = search_ita) !=
database.end()) ||
344 ((search_it = search_itb) !=
defaults.end()))
346 for (
size_t i = 0; i < (search_it->second).size(); ++i)
348 std::string s = (search_it->second)[i];
351 size_t pos = s.find(
',', 1);
352 std::stringstream(s.substr(1, pos - 1)) >> elem[0];
353 std::stringstream(s.substr(pos + 1, s.length() - pos - 2)) >> elem[1];
372 bool get(
const std::string& name, std::vector<v3D>& res,
const std::vector<v3D>* defValue =
nullptr,
bool echoDefault =
true)
const
374 bool boolRes =
false;
377 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
379 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
383 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
390 if (((search_it = search_ita) !=
database.end()) ||
391 ((search_it = search_itb) !=
defaults.end()))
393 for (
size_t i = 0; i < (search_it->second).size(); ++i)
395 std::string s = (search_it->second)[i];
398 size_t pos1 = s.find(
',', 1);
399 std::stringstream(s.substr(1, pos1 - 1)) >> elem[0];
400 size_t pos2 = s.find(
',', pos1 + 1);
401 std::stringstream(s.substr(pos1 + 1, pos2 - pos1 - 1)) >> elem[1];
402 std::stringstream(s.substr(pos2 + 1, s.length() - pos2 - 2)) >> elem[2];
421 template<
typename T,
typename P>
422 bool get(
const std::string& name, std::vector<std::pair<T,P>>& res,
const std::vector<std::pair<T, P>>* defValue =
nullptr,
bool echoDefault =
true)
const
424 bool boolRes =
false;
427 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
429 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
433 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
440 if (((search_it = search_ita) !=
database.end()) ||
441 ((search_it = search_itb) !=
defaults.end()))
443 for (
size_t i = 0; i < (search_it->second).size(); ++i)
445 std::string s = (search_it->second)[i];
448 size_t pos = s.find(
',', 1);
449 std::stringstream(s.substr(1, pos - 1)) >> elem.first;
450 std::stringstream(s.substr(pos + 1, s.length() - pos - 2)) >> elem.second;
473 bool boolRes =
false;
476 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
478 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
482 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
489 if (((search_it = search_ita) !=
database.end()) ||
490 ((search_it = search_itb) !=
defaults.end()))
492 for (
size_t i = 0; i < (search_it->second).size(); ++i)
494 std::string s = (search_it->second)[i];
497 size_t pos = s.find(
',', 1);
498 std::stringstream(s.substr(1, pos - 1)) >> elem[0];
499 std::stringstream(s.substr(pos + 1, s.length() - pos - 2)) >> elem[1];
519 bool get(
const std::string& name, std::vector<
Vortex2D>& res,
const std::vector<Vortex2D>* defValue =
nullptr,
bool echoDefault =
true)
const
521 bool boolRes =
false;
524 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
526 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
530 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
537 if (((search_it = search_ita) !=
database.end()) ||
538 ((search_it = search_itb) !=
defaults.end()))
540 for (
size_t i = 0; i < (search_it->second).size(); ++i)
542 std::string s = (search_it->second)[i];
546 size_t pos1 = s.find(
',', 1);
547 size_t pos2 = s.find(
',', pos1 + 1);
548 std::stringstream(s.substr(1, pos1 - 1)) >> r[0];
549 std::stringstream(s.substr(pos1 + 1, pos2 - pos1 - 1)) >> r[1];
550 std::stringstream(s.substr(pos2 + 1, s.length() - pos2 - 2)) >> g;
573 bool get(
const std::string& name, std::vector<GeomPoint>& res,
const std::vector<GeomPoint>* defValue =
nullptr,
bool echoDefault =
true)
const
575 bool boolRes =
false;
578 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
580 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
584 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
591 if (((search_it = search_ita) !=
database.end()) ||
592 ((search_it = search_itb) !=
defaults.end()))
594 for (
size_t i = 0; i < (search_it->second).size(); ++i)
596 std::string s = (search_it->second)[i];
600 size_t pos1 = s.find(
',', 1);
601 size_t pos2 = s.find(
',', pos1 + 1);
602 std::stringstream(s.substr(1, pos1 - 1)) >> r[0];
603 std::stringstream(s.substr(pos1 + 1, pos2 - pos1 - 1)) >> r[1];
604 std::stringstream(s.substr(pos2 + 1, s.length() - pos2 - 2)) >> type;
632 template <
typename T>
633 bool get(
const std::string& name, std::vector<T>& res,
const std::vector<T>* defValue =
nullptr,
bool echoDefault =
true)
const
635 bool boolRes =
false;
638 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
640 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
644 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
651 if (((search_it = search_ita) !=
database.end()) ||
652 ((search_it = search_itb) !=
defaults.end()))
654 for (
size_t i = 0; i < (search_it->second).size(); ++i)
656 std::string s = (search_it->second)[i];
658 std::stringstream ss(s);
661 if (
typeid(elem).name() ==
typeid(std::string(
"TestString")).name())
663 std::string* str =
reinterpret_cast<std::string*
>(&elem);
664 str->erase(remove(str->begin(), str->end(),
'\"'), str->end());
686 template <
typename T>
687 bool get(
const std::string& name, std::pair<std::string, T>& res,
const std::pair<std::string, T>* defValue =
nullptr,
bool echoDefault =
true)
const
689 bool boolRes =
false;
691 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
693 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
697 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
704 if ((((search_it = search_ita) !=
database.end()) && ((search_it->second).size() > 0)) ||
705 (((search_it = search_itb) !=
defaults.end()) && ((search_it->second).size() > 0)))
707 if ((search_it->second).size() == 1)
709 std::string s = (search_it->second)[0];
714 s = search_it->second[0];
716 std::stringstream ss(s);
719 if (
typeid(elem).name() ==
typeid(std::string(
"TestString")).name())
721 std::string* str =
reinterpret_cast<std::string*
>(&elem);
722 str->erase(remove(str->begin(), str->end(),
'\"'), str->end());
729 info(
'e') <<
"parameter " << name <<
" is list (only scalar is available)" << std::endl;
751 template <
typename T>
752 bool get(
const std::string& name, T& res,
const T* defValue =
nullptr,
bool echoDefault =
true)
const
754 bool boolRes =
false;
756 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
758 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
762 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
769 if ((((search_it = search_ita) !=
database.end()) && ((search_it->second).size() > 0)) ||
770 (((search_it = search_itb) !=
defaults.end()) && ((search_it->second).size() > 0)))
772 if ((search_it->second).size() == 1)
774 std::string s = (search_it->second)[0];
778 s = search_it->second[0];
780 std::stringstream ss(s);
783 if (
typeid(elem).name() ==
typeid(std::string(
"TestString")).name())
785 std::string* str =
reinterpret_cast<std::string*
>(&elem);
786 str->erase(remove(str->begin(), str->end(),
'\"'), str->end());
793 info(
'e') <<
"parameter " << name <<
" is list (only scalar is available)" << std::endl;
813 bool get(
const std::string& name,
Point2D& res,
const Point2D* defValue =
nullptr,
bool echoDefault =
true)
const
815 bool boolRes =
false;
817 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
819 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
823 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
830 if (((search_it = search_ita) !=
database.end()) ||
831 ((search_it = search_itb) !=
defaults.end()))
833 if ((search_it->second).size() == res.
size())
835 for (
size_t i = 0; i < (search_it->second).size(); ++i)
837 std::string s = (search_it->second)[i];
839 std::stringstream ss(s);
848 info(
'e') <<
"parameter " << name <<
" length differs from 2 (only Point2D is available)" << std::endl;
868 bool get(
const std::string& name,
v3D& res,
const v3D* defValue =
nullptr,
bool echoDefault =
true)
const
870 bool boolRes =
false;
872 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
874 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
878 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
885 if (((search_it = search_ita) !=
database.end()) ||
886 ((search_it = search_itb) !=
defaults.end()))
888 if ((search_it->second).size() == res.
size())
890 for (
size_t i = 0; i < (search_it->second).size(); ++i)
892 std::string s = (search_it->second)[i];
894 std::stringstream ss(s);
903 info(
'e') <<
"parameter " << name <<
" length differs from 3 (only v3D is available)" << std::endl;
923 bool get(
const std::string& name,
bool& res,
const bool* defValue =
nullptr,
bool echoDefault =
true)
const
925 bool boolRes =
false;
927 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
929 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
933 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
940 if ((((search_it = search_ita) !=
database.end()) && ((search_it->second).size() > 0)) ||
941 (((search_it = search_itb) !=
defaults.end()) && ((search_it->second).size() > 0)))
943 if ((search_it->second).size() == 1)
945 std::string s = (search_it->second)[0];
949 s = search_it->second[0];
960 info(
'e') <<
"parameter " << name <<
" is list (only scalar is available)" << std::endl;
980 bool get(
const std::string& name, std::pair<std::pair<std::string, int>, std::string>& res,
const std::pair<std::pair<std::string, int>, std::string>* defValue =
nullptr,
bool echoDefault =
true)
const
982 bool boolRes =
false;
984 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
986 for (search_ita =
database.begin(); search_ita !=
database.end(); ++search_ita)
990 for (search_itb =
defaults.begin(); search_itb !=
defaults.end(); ++search_itb)
997 if ((((search_it = search_ita) !=
database.end()) && ((search_it->second).size() > 0)) ||
998 (((search_it = search_itb) !=
defaults.end()) && ((search_it->second).size() > 0)))
1000 if ((search_it->second).size() == 1)
1002 std::string s = (search_it->second)[0];
1004 size_t posBegin = s.find(
'(');
1005 size_t posEnd = s.find(
')');
1007 if ((posBegin != -1) && (posEnd == -1))
1009 info(
'e') <<
"parameter " << name <<
" is given incorrectly" << std::endl;
1014 std::string str1a, str1b, str2;
1015 str1a = s.substr(0, posBegin);
1018 str1b = search_it->second[0];
1022 std::stringstream ssStr1b;
1027 str2 = s.substr(posBegin + 1, posEnd - posBegin - 1);
1029 if ((posBegin == -1) && (posEnd == -1))
1030 res = { {str1a, res1b},
"" };
1032 res = { {str1a, res1b}, str2 };
1039 info(
'e') <<
"parameter " << name <<
" is list (only scalar is available)" << std::endl;
1044 SetDefault(name, res, defValue, echoDefault);
Заголовочный файл с описанием класса Gpu.
Класс, определяющий работу с потоком логов
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
void SetDefault(const std::string &name, T &res, const T *defValue, bool echoDefault) const
Установка значения параметра по умолчанию
bool get(const std::string &name, std::vector< numvector< T, 2 > > &res, const std::vector< numvector< T, 2 > > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из пар чисел из базы данных
std::unordered_map< std::string, std::vector< std::string > > switchers
Данные считываемые из перечня параметров-переключателей
static std::vector< std::string > StringToVector(std::string line, char openBracket='(', char closeBracket=')')
Pазбор строки, содержащей запятые, на отдельные строки
bool get(const std::string &name, bool &res, const bool *defValue=nullptr, bool echoDefault=true) const
Считывание логической переменной из базы данных
StreamParser(LogStream &infoStream, const std::string &label, std::istream &mainStream, std::istream &defaultsStream, std::istream &switchersStream, std::istream &varsStream, std::vector< std::string > specificKey={})
Конструктор, принимающий четыре потока
bool get(const std::string &name, Point2D &res, const Point2D *defValue=nullptr, bool echoDefault=true) const
Считывание точки из базы данных
bool get(const std::string &name, std::pair< std::pair< std::string, int >, std::string > &res, const std::pair< std::pair< std::string, int >, std::string > *defValue=nullptr, bool echoDefault=true) const
Считывание пары: ((строка, целое число), строка) вида ((str1, int), string) из базы данных
bool get(const std::string &name, std::pair< std::string, T > &res, const std::pair< std::string, T > *defValue=nullptr, bool echoDefault=true) const
Считывание пары (строка, скаляр) из базы данных
static std::pair< std::string, std::string > SplitString(LogStream &info, std::string line, bool upcase=true)
Разбор строки на пару ключ-значение
bool get(const std::string &name, std::vector< GeomPoint > &res, const std::vector< GeomPoint > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из точек, задающих профиль, из базы данных
static std::string VectorStringToString(const std::vector< std::string > &_vecString)
Объединение вектора (списка) из строк в одну строку
bool get(const std::string &name, v3D &res, const v3D *defValue=nullptr, bool echoDefault=true) const
Считывание точки из базы данных
std::unordered_map< std::string, std::vector< std::string > > defaults
Данные считываемые из списка умолчаний
bool get(const std::string &name, std::vector< T > &res, const std::vector< T > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из простых типов из базы данных
std::unordered_map< std::string, std::vector< std::string > > database
Данные считываемые из основного файла-паспорта расчета
void MergeDbsWithoutRepeats(std::unordered_map< std::string, std::vector< std::string > > &database, const std::unordered_map< std::string, std::vector< std::string > > &)
Слияние двух баз данных
~StreamParser()
Деструктор
void ParseStream(std::istream &stream, std::unordered_map< std::string, std::vector< std::string > > &database, std::vector< std::string > specificKey={}, bool replaceVars=false, char openBracket='(', char closeBracket=')')
Парсинг заданного потока
bool get(const std::string &name, std::vector< v3D > &res, const std::vector< v3D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из трехмерных точек из базы данных
bool get(const std::string &name, std::vector< Vortex2D > &res, const std::vector< Vortex2D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из вихрей из базы данных
bool get(const std::string &name, T &res, const T *defValue=nullptr, bool echoDefault=true) const
Считывание скаляра из базы данных
LogStream info
Поток для вывода логов и сообщений об ошибках
std::unordered_map< std::string, std::vector< std::string > > vars
Данные считываемые из параметров конкретной задачи
bool get(const std::string &name, std::vector< Point2D > &res, const std::vector< Point2D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из двумерных точек из базы данных
bool get(const std::string &name, std::vector< std::pair< T, P > > &res, const std::vector< std::pair< T, P > > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из пар чисел из базы данных
static std::string UpperCase(const std::string &line)
Перевод строки в верхний регистр
void ReplaceVarsInString(std::string &st)
Замена переменных в строке их значениями
Класс, опеделяющий двумерный вихревой элемент
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
Класс, опеделяющий двумерный вектор
Описание базовых вспомогательных функций
int is_match(const std::string &line_, const std::string &pattern_)
Функция сверки строки с шаблоном, который может содержать знаки * и ?
Глобальные параметры по умолчанию
Класс, опеделяющий двумерный вектор