VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VMlib::StreamParser Class Reference

Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
More...

#include <StreamParser.h>

Collaboration diagram for VMlib::StreamParser:

Public Member Functions

 StreamParser (LogStream &infoStream, const std::string &label, std::istream &mainStream, std::istream &defaultsStream, std::istream &switchersStream, std::istream &varsStream, std::vector< std::string > specificKey={})
 Конструктор, принимающий четыре потока
 
 StreamParser (LogStream &infoStream, const std::string &label, std::istream &mainStream, std::istream &defaultsStream, std::vector< std::string > specificKey={})
 Конструктор, принимающий два потока
 
 StreamParser (LogStream &infoStream, const std::string &label, std::istream &mainStream, char openBracket='{', char closeBracket='}')
 Конструктор, принимающий один поток
 
 ~StreamParser ()
 Деструктор
 
template<typename T >
void SetDefault (const std::string &name, T &res, const T *defValue, bool echoDefault) const
 Установка значения параметра по умолчанию
 
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< v3D > &res, const std::vector< v3D > *defValue=nullptr, bool echoDefault=true) const
 Считывание вектора из трехмерных точек из базы данных
 
template<typename T , typename P >
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
 Считывание вектора из пар чисел из базы данных
 
template<typename T >
bool get (const std::string &name, std::vector< numvector< T, 2 > > &res, const std::vector< numvector< T, 2 > > *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, std::vector< GeomPoint > &res, const std::vector< GeomPoint > *defValue=nullptr, bool echoDefault=true) const
 Считывание вектора из точек, задающих профиль, из базы данных
 
template<typename T >
bool get (const std::string &name, std::vector< T > &res, const std::vector< T > *defValue=nullptr, bool echoDefault=true) const
 Считывание вектора из простых типов из базы данных
 
template<typename T >
bool get (const std::string &name, std::pair< std::string, T > &res, const std::pair< std::string, T > *defValue=nullptr, bool echoDefault=true) const
 Считывание пары (строка, скаляр) из базы данных
 
template<typename T >
bool get (const std::string &name, T &res, const T *defValue=nullptr, bool echoDefault=true) const
 Считывание скаляра из базы данных
 
bool get (const std::string &name, Point2D &res, const Point2D *defValue=nullptr, bool echoDefault=true) const
 Считывание точки из базы данных
 
bool get (const std::string &name, v3D &res, const v3D *defValue=nullptr, bool echoDefault=true) const
 Считывание точки из базы данных
 
bool get (const std::string &name, bool &res, const bool *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) из базы данных
 

Static Public Member Functions

static std::string UpperCase (const std::string &line)
 Перевод строки в верхний регистр
 
static std::vector< std::string > StringToVector (std::string line, char openBracket='(', char closeBracket=')')
 Pазбор строки, содержащей запятые, на отдельные строки
 
static std::string VectorStringToString (const std::vector< std::string > &_vecString)
 Объединение вектора (списка) из строк в одну строку
 
static std::pair< std::string, std::string > SplitString (LogStream &info, std::string line, bool upcase=true)
 Разбор строки на пару ключ-значение
 

Public Attributes

std::unordered_map< std::string, std::vector< std::string > > database
 Данные считываемые из основного файла-паспорта расчета
 

Private Member Functions

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=')')
 Парсинг заданного потока
 
void MergeDbsWithoutRepeats (std::unordered_map< std::string, std::vector< std::string > > &database, const std::unordered_map< std::string, std::vector< std::string > > &)
 Слияние двух баз данных
 
void ReplaceVarsInString (std::string &st)
 Замена переменных в строке их значениями
 

Private Attributes

LogStream info
 Поток для вывода логов и сообщений об ошибках
 
std::unordered_map< std::string, std::vector< std::string > > defaults
 Данные считываемые из списка умолчаний
 
std::unordered_map< std::string, std::vector< std::string > > vars
 Данные считываемые из параметров конкретной задачи
 
std::unordered_map< std::string, std::vector< std::string > > switchers
 Данные считываемые из перечня параметров-переключателей
 

Detailed Description

Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами

Author
Марчевский Илья Константинович \Version 1.14
Date
6 марта 2026 г.

Definition at line 153 of file StreamParser.h.

Constructor & Destructor Documentation

◆ StreamParser() [1/3]

StreamParser::StreamParser ( LogStream infoStream,
const std::string &  label,
std::istream &  mainStream,
std::istream &  defaultsStream,
std::istream &  switchersStream,
std::istream &  varsStream,
std::vector< std::string >  specificKey = {} 
)

Конструктор, принимающий четыре потока

Заполняет 4 базы данных — database, defaults, switchers, vars
Используется для установки основных параметров расчета

Parameters
[in,out]infoStreamбазовый поток для вывода логов
[in]labelконстантная ссылка на метку парсера для вывода логов
[in]mainStreamссылка на основной поток параметров
[in]defaultsStreamссылка на поток по умолчанию
[in]switchersStreamссылка на поток параметров-переключателей
[in]varsStreamссылка на поток переменных
[in]specificKeyпоиск только ключей из данного списка (по умолчанию — пустой список, что означает разбор всех ключей)

Definition at line 45 of file StreamParser.cpp.

46{
47 info.inheritStream(infoStream, label);
48
49 ParseStream(varsStream, vars);
50 ParseStream(defaultsStream, defaults);
51
52 //Добавление defaults в vars
54
55 ParseStream(switchersStream, switchers);
56 ParseStream(mainStream, database, specificKey, true);
57}//StreamParser(...)
void inheritStream(LogStream &infoStream_, const std::string &label_)
Связывание потока логов с потоком вывода от другого потока логов
Definition LogStream.h:93
std::unordered_map< std::string, std::vector< std::string > > switchers
Данные считываемые из перечня параметров-переключателей
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 > > &)
Слияние двух баз данных
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=')')
Парсинг заданного потока
LogStream info
Поток для вывода логов и сообщений об ошибках
std::unordered_map< std::string, std::vector< std::string > > vars
Данные считываемые из параметров конкретной задачи
Глобальные параметры по умолчанию
Definition defs.h:100
Here is the call graph for this function:

◆ StreamParser() [2/3]

StreamParser::StreamParser ( LogStream infoStream,
const std::string &  label,
std::istream &  mainStream,
std::istream &  defaultsStream,
std::vector< std::string >  specificKey = {} 
)

Конструктор, принимающий два потока

Заполняет 2 базы данных — database, defaults; базы данных switchers и vars остаются пустыми
Используется для первоначального считывания параметров задач из списка задач и формирования очереди

Parameters
[in,out]infoStreamбазовый поток для вывода логов
[in]labelконстантная ссылка на метку парсера для вывода логов
[in]mainStreamссылка на основной поток параметров
[in]defaultsStreamссылка на поток по умолчанию
[in]specificKeyпоиск только ключей из данного списка (по умолчанию — пустой список, что означает разбор всех ключей)

Definition at line 61 of file StreamParser.cpp.

62{
63 info.inheritStream(infoStream, label);
64
65 ParseStream(mainStream, database, specificKey);
66 ParseStream(defaultsStream, defaults);
67
68 switchers.clear();
69 vars.clear();
70}//StreamParser(...)
Here is the call graph for this function:

◆ StreamParser() [3/3]

StreamParser::StreamParser ( LogStream infoStream,
const std::string &  label,
std::istream &  mainStream,
char  openBracket = '{',
char  closeBracket = '}' 
)

Конструктор, принимающий один поток

Заполняет 1 базу данных — database; базы данных defaults, switchers и vars остаются пустыми
Используется для считывания профиля, следа, списка задач

Parameters
[in,out]infoStreamбазовый поток для вывода логов
[in]labelконстантная ссылка на метку парсера для вывода логов
[in]mainStreamссылка на основной поток параметров
[in]openBracketтип открывающейся скобки (по умолчанию — "{" )
[in]closeBracketтип закрывающейся скобки (по умолчанию — "}" )

Definition at line 74 of file StreamParser.cpp.

75{
76 info.inheritStream(infoStream, label);
77
78 ParseStream(mainStream, database, {}, false, openBracket, closeBracket);
79
80 defaults.clear();
81 switchers.clear();
82 vars.clear();
83}//StreamParser(...)
Here is the call graph for this function:

◆ ~StreamParser()

VMlib::StreamParser::~StreamParser ( )
inline

Деструктор

Definition at line 259 of file StreamParser.h.

259{ };

Member Function Documentation

◆ get() [1/13]

bool VMlib::StreamParser::get ( const std::string &  name,
bool &  res,
const bool *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание логической переменной из базы данных

Переопределение метода get() для ситывания логической переменной (bool) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на логическую переменную, считываемую из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 923 of file StreamParser.h.

924 {
925 bool boolRes = false;
926
927 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
928
929 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
930 if (is_match(search_ita->first, UpperCase(name)))
931 break;
932
933 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
934 if (is_match(search_itb->first, UpperCase(name)))
935 break;
936
937 //поиск ключа в базе и, если нет, то в базе умолчаний
938 //if ((((search_it = database.find(UpperCase(name))) != database.end()) && ((search_it->second).size() > 0)) ||
939 // (((search_it = defaults.find(UpperCase(name))) != defaults.end()) && ((search_it->second).size() > 0)))
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)))
942 {
943 if ((search_it->second).size() == 1)
944 {
945 std::string s = (search_it->second)[0];
946
947 //проверка на значение-переключатель
948 if (((search_it = switchers.find(UpperCase(s))) != switchers.end()) && ((search_it->second).size() > 0))
949 s = search_it->second[0];
950
951 if ((UpperCase(s) == "FALSE") || (UpperCase(s) == "NO") || (s.c_str()[0] == '0'))
952 res = false;
953 else
954 res = true;
955
956 boolRes = true;
957 }
958 else
959 {
960 info('e') << "parameter " << name << " is list (only scalar is available)" << std::endl;
961 exit(-1);
962 }
963 }
964 else
965 SetDefault(name, res, defValue, echoDefault);
966
967 return boolRes;
968 };//get(...)
void SetDefault(const std::string &name, T &res, const T *defValue, bool echoDefault) const
Установка значения параметра по умолчанию
static std::string UpperCase(const std::string &line)
Перевод строки в верхний регистр
int is_match(const std::string &line_, const std::string &pattern_)
Функция сверки строки с шаблоном, который может содержать знаки * и ?
Here is the call graph for this function:

◆ get() [2/13]

bool VMlib::StreamParser::get ( const std::string &  name,
Point2D res,
const Point2D defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание точки из базы данных

Переопределение метода get() для считывания точки (Point2D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на точку, считываемую из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 813 of file StreamParser.h.

814 {
815 bool boolRes = false;
816
817 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
818
819 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
820 if (is_match(search_ita->first, UpperCase(name)))
821 break;
822
823 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
824 if (is_match(search_itb->first, UpperCase(name)))
825 break;
826
827 //поиск ключа в базе и, если нет, то в базе умолчаний
828 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
829 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
830 if (((search_it = search_ita) != database.end()) ||
831 ((search_it = search_itb) != defaults.end()))
832 {
833 if ((search_it->second).size() == res.size())
834 {
835 for (size_t i = 0; i < (search_it->second).size(); ++i)
836 {
837 std::string s = (search_it->second)[i];
838
839 std::stringstream ss(s);
840 double elem;
841 ss >> elem;
842 res[i] = elem;
843 }
844 boolRes = true;
845 }
846 else
847 {
848 info('e') << "parameter " << name << " length differs from 2 (only Point2D is available)" << std::endl;
849 exit(-1);
850 }
851
852 }
853 else
854 SetDefault(name, res, defValue, echoDefault);
855
856 return boolRes;
857 }
size_t size() const
Definition numvector.h:114
Here is the call graph for this function:

◆ get() [3/13]

bool VMlib::StreamParser::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
inline

Считывание пары: ((строка, целое число), строка) вида ((str1, int), string) из базы данных

Метод get() для считывания пары: ((строка, целое число), строка) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка данные, считываемые из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 980 of file StreamParser.h.

981 {
982 bool boolRes = false;
983
984 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
985
986 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
987 if (is_match(search_ita->first, UpperCase(name)))
988 break;
989
990 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
991 if (is_match(search_itb->first, UpperCase(name)))
992 break;
993
994 //поиск ключа в базе и, если нет, то в базе умолчаний
995 //if ((((search_it = database.find(UpperCase(name))) != database.end()) && ((search_it->second).size() > 0)) ||
996 // (((search_it = defaults.find(UpperCase(name))) != defaults.end()) && ((search_it->second).size() > 0)))
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)))
999 {
1000 if ((search_it->second).size() == 1)
1001 {
1002 std::string s = (search_it->second)[0];
1003
1004 size_t posBegin = s.find('(');
1005 size_t posEnd = s.find(')');
1006
1007 if ((posBegin != -1) && (posEnd == -1))
1008 {
1009 info('e') << "parameter " << name << " is given incorrectly" << std::endl;
1010 exit(-1);
1011 }
1012 else
1013 {
1014 std::string str1a, str1b, str2;
1015 str1a = s.substr(0, posBegin);
1016
1017 if (((search_it = switchers.find(UpperCase(str1a))) != switchers.end()) && ((search_it->second).size() > 0))
1018 str1b = search_it->second[0];
1019 else
1020 str1b = "-1";
1021
1022 std::stringstream ssStr1b;
1023 ssStr1b << str1b;
1024 int res1b;
1025 ssStr1b >> res1b;
1026
1027 str2 = s.substr(posBegin + 1, posEnd - posBegin - 1);
1028
1029 if ((posBegin == -1) && (posEnd == -1))
1030 res = { {str1a, res1b}, "" };
1031 else
1032 res = { {str1a, res1b}, str2 };
1033
1034 boolRes = true;
1035 }
1036 }
1037 else
1038 {
1039 info('e') << "parameter " << name << " is list (only scalar is available)" << std::endl;
1040 exit(-1);
1041 }
1042 }
1043 else
1044 SetDefault(name, res, defValue, echoDefault);
1045
1046 return boolRes;
1047 };
Here is the call graph for this function:

◆ get() [4/13]

template<typename T >
bool VMlib::StreamParser::get ( const std::string &  name,
std::pair< std::string, T > &  res,
const std::pair< std::string, T > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание пары (строка, скаляр) из базы данных

Шаблонный метод get() для считывания пары (строка, скаляр) из базы данных

Template Parameters
Tтип считываемых данных
Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка данные, считываемые из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 687 of file StreamParser.h.

688 {
689 bool boolRes = false;
690
691 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
692
693 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
694 if (is_match(search_ita->first, UpperCase(name)))
695 break;
696
697 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
698 if (is_match(search_itb->first, UpperCase(name)))
699 break;
700
701 //поиск ключа в базе и, если нет, то в базе умолчаний
702 //if ((((search_it = database.find(UpperCase(name))) != database.end()) && ((search_it->second).size() > 0)) ||
703 // (((search_it = defaults.find(UpperCase(name))) != defaults.end()) && ((search_it->second).size() > 0)))
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)))
706 {
707 if ((search_it->second).size() == 1)
708 {
709 std::string s = (search_it->second)[0];
710 res.first = s;
711
712 //проверка на значение-переключатель
713 if (((search_it = switchers.find(UpperCase(s))) != switchers.end()) && ((search_it->second).size() > 0))
714 s = search_it->second[0];
715
716 std::stringstream ss(s);
717 T elem;
718 ss >> elem;
719 if (typeid(elem).name() == typeid(std::string("TestString")).name())
720 {
721 std::string* str = reinterpret_cast<std::string*>(&elem);
722 str->erase(remove(str->begin(), str->end(), '\"'), str->end());
723 }
724 res.second = elem;
725 boolRes = true;
726 }
727 else
728 {
729 info('e') << "parameter " << name << " is list (only scalar is available)" << std::endl;
730 exit(-1);
731 }
732 }
733 else
734 SetDefault(name, res, defValue, echoDefault);
735
736 return boolRes;
737 };
Here is the call graph for this function:

◆ get() [5/13]

bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< GeomPoint > &  res,
const std::vector< GeomPoint > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из точек, задающих профиль, из базы данных

Переопределение метода get() для считывания вектора из вихрей (Vortex2D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на вектор из вихрей, считываемый из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 573 of file StreamParser.h.

574 {
575 bool boolRes = false;
576
577 res.resize(0);
578 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
579
580 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
581 if (is_match(search_ita->first, UpperCase(name)))
582 break;
583
584 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
585 if (is_match(search_itb->first, UpperCase(name)))
586 break;
587
588 //поиск ключа в базе и, если нет, то в базе умолчаний
589 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
590 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
591 if (((search_it = search_ita) != database.end()) ||
592 ((search_it = search_itb) != defaults.end()))
593 {
594 for (size_t i = 0; i < (search_it->second).size(); ++i)
595 {
596 std::string s = (search_it->second)[i];
597
598 Point2D r;
599 std::string type;
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;
605
606 GeomPoint elem(r, type);
607
608
609 res.push_back(elem);
610 }
611 boolRes = true;
612 }
613 //else
614 // SetDefault(name, res, defValue, echoDefault);
615
616
617 return boolRes;
618 };
Класс, опеделяющий двумерный вектор
Definition Point2D.h:241
Here is the call graph for this function:

◆ get() [6/13]

template<typename T >
bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< numvector< T, 2 > > &  res,
const std::vector< numvector< T, 2 > > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из пар чисел из базы данных

Переопределение метода get() для считывания вектора из пар чисел (numvector<T,2>) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на значение, считываемое из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 471 of file StreamParser.h.

472 {
473 bool boolRes = false;
474
475 res.resize(0);
476 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
477
478 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
479 if (is_match(search_ita->first, UpperCase(name)))
480 break;
481
482 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
483 if (is_match(search_itb->first, UpperCase(name)))
484 break;
485
486 //поиск ключа в базе и, если нет, то в базе умолчаний
487 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
488 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
489 if (((search_it = search_ita) != database.end()) ||
490 ((search_it = search_itb) != defaults.end()))
491 {
492 for (size_t i = 0; i < (search_it->second).size(); ++i)
493 {
494 std::string s = (search_it->second)[i];
495
496 numvector<T, 2> elem;
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];
500 res.push_back(elem);
501 }
502 boolRes = true;
503 }
504 //else
505 // SetDefault(name, res, defValue, echoDefault);
506
507 return boolRes;
508 };
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
Definition numvector.h:99
Here is the call graph for this function:

◆ get() [7/13]

bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< Point2D > &  res,
const std::vector< Point2D > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из двумерных точек из базы данных

Переопределение метода get() для считывания вектора из точек (Point2D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на значение, считываемое из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 324 of file StreamParser.h.

325 {
326 bool boolRes = false;
327
328 res.resize(0);
329
330 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
331
332 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
333 if (is_match(search_ita->first, UpperCase(name)))
334 break;
335
336 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
337 if (is_match(search_itb->first, UpperCase(name)))
338 break;
339
340 //поиск ключа в базе и, если нет, то в базе умолчаний
341 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
342 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
343 if (((search_it = search_ita) != database.end()) ||
344 ((search_it = search_itb) != defaults.end()))
345 {
346 for (size_t i = 0; i < (search_it->second).size(); ++i)
347 {
348 std::string s = (search_it->second)[i];
349
350 Point2D elem;
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];
354 res.push_back(elem);
355 }
356 boolRes = true;
357 }
358 //else
359 // SetDefault(name, res, defValue, echoDefault);
360 return boolRes;
361 };
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get() [8/13]

template<typename T , typename P >
bool VMlib::StreamParser::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
inline

Считывание вектора из пар чисел из базы данных

Переопределение метода get() для считывания вектора из пар чисел (std::pair) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на значение, считываемое из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 422 of file StreamParser.h.

423 {
424 bool boolRes = false;
425
426 res.resize(0);
427 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
428
429 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
430 if (is_match(search_ita->first, UpperCase(name)))
431 break;
432
433 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
434 if (is_match(search_itb->first, UpperCase(name)))
435 break;
436
437 //поиск ключа в базе и, если нет, то в базе умолчаний
438 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
439 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
440 if (((search_it = search_ita) != database.end()) ||
441 ((search_it = search_itb) != defaults.end()))
442 {
443 for (size_t i = 0; i < (search_it->second).size(); ++i)
444 {
445 std::string s = (search_it->second)[i];
446
447 std::pair<T,P> elem;
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;
451 res.push_back(elem);
452 }
453 boolRes = true;
454 }
455 //else
456 // SetDefault(name, res, defValue, echoDefault);
457
458 return boolRes;
459 };
Here is the call graph for this function:

◆ get() [9/13]

template<typename T >
bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< T > &  res,
const std::vector< T > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из простых типов из базы данных

Шаблонный метод get() для считывания вектора из простых типов из базы данных

Template Parameters
Tтип считываемых данных
Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на вектор из данных, считываемый из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 633 of file StreamParser.h.

634 {
635 bool boolRes = false;
636
637 res.resize(0);
638 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
639
640 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
641 if (is_match(search_ita->first, UpperCase(name)))
642 break;
643
644 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
645 if (is_match(search_itb->first, UpperCase(name)))
646 break;;
647
648 //поиск ключа в базе и, если нет, то в базе умолчаний
649 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
650 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
651 if (((search_it = search_ita) != database.end()) ||
652 ((search_it = search_itb) != defaults.end()))
653 {
654 for (size_t i = 0; i < (search_it->second).size(); ++i)
655 {
656 std::string s = (search_it->second)[i];
657
658 std::stringstream ss(s);
659 T elem;
660 ss >> elem;
661 if (typeid(elem).name() == typeid(std::string("TestString")).name())
662 {
663 std::string* str = reinterpret_cast<std::string*>(&elem);
664 str->erase(remove(str->begin(), str->end(), '\"'), str->end());
665 }
666 res.push_back(elem);
667 }
668 boolRes = true;
669 }
670 else
671 SetDefault(name, res, defValue, echoDefault);
672
673 return boolRes;
674 };
Here is the call graph for this function:

◆ get() [10/13]

bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< v3D > &  res,
const std::vector< v3D > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из трехмерных точек из базы данных

Переопределение метода get() для считывания вектора из точек (v3D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на значение, считываемое из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 372 of file StreamParser.h.

373 {
374 bool boolRes = false;
375
376 res.resize(0);
377 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
378
379 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
380 if (is_match(search_ita->first, UpperCase(name)))
381 break;
382
383 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
384 if (is_match(search_itb->first, UpperCase(name)))
385 break;
386
387 //поиск ключа в базе и, если нет, то в базе умолчаний
388 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
389 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
390 if (((search_it = search_ita) != database.end()) ||
391 ((search_it = search_itb) != defaults.end()))
392 {
393 for (size_t i = 0; i < (search_it->second).size(); ++i)
394 {
395 std::string s = (search_it->second)[i];
396
397 v3D elem;
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];
403 res.push_back(elem);
404 }
405 boolRes = true;
406 }
407 //else
408 // SetDefault(name, res, defValue, echoDefault);
409
410 return boolRes;
411 };
Класс, опеделяющий двумерный вектор
Definition v3D.h:60
Here is the call graph for this function:

◆ get() [11/13]

bool VMlib::StreamParser::get ( const std::string &  name,
std::vector< Vortex2D > &  res,
const std::vector< Vortex2D > *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание вектора из вихрей из базы данных

Переопределение метода get() для считывания вектора из вихрей (Vortex2D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на вектор из вихрей, считываемый из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 519 of file StreamParser.h.

520 {
521 bool boolRes = false;
522
523 res.resize(0);
524 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
525
526 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
527 if (is_match(search_ita->first, UpperCase(name)))
528 break;
529
530 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
531 if (is_match(search_itb->first, UpperCase(name)))
532 break;
533
534 //поиск ключа в базе и, если нет, то в базе умолчаний
535 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
536 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
537 if (((search_it = search_ita) != database.end()) ||
538 ((search_it = search_itb) != defaults.end()))
539 {
540 for (size_t i = 0; i < (search_it->second).size(); ++i)
541 {
542 std::string s = (search_it->second)[i];
543
544 Point2D r;
545 double g;
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;
551
552 Vortex2D elem(r, g);
553
554 res.push_back(elem);
555 }
556 boolRes = true;
557 }
558 //else
559 // SetDefault(name, res, defValue, echoDefault);
560
561 return boolRes;
562 };
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
Here is the call graph for this function:

◆ get() [12/13]

template<typename T >
bool VMlib::StreamParser::get ( const std::string &  name,
T &  res,
const T *  defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание скаляра из базы данных

Шаблонный метод get() для считывания скаляра из базы данных

Template Parameters
Tтип считываемых данных
Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка данные, считываемые из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 752 of file StreamParser.h.

753 {
754 bool boolRes = false;
755
756 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
757
758 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
759 if (is_match(search_ita->first, UpperCase(name)))
760 break;
761
762 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
763 if (is_match(search_itb->first, UpperCase(name)))
764 break;
765
766 //поиск ключа в базе и, если нет, то в базе умолчаний
767 //if ((((search_it = database.find(UpperCase(name))) != database.end()) && ((search_it->second).size() > 0)) ||
768 // (((search_it = defaults.find(UpperCase(name))) != defaults.end()) && ((search_it->second).size() > 0)))
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)))
771 {
772 if ((search_it->second).size() == 1)
773 {
774 std::string s = (search_it->second)[0];
775
776 //проверка на значение-переключатель
777 if (((search_it = switchers.find(UpperCase(s))) != switchers.end()) && ((search_it->second).size() > 0))
778 s = search_it->second[0];
779
780 std::stringstream ss(s);
781 T elem;
782 ss >> elem;
783 if (typeid(elem).name() == typeid(std::string("TestString")).name())
784 {
785 std::string* str = reinterpret_cast<std::string*>(&elem);
786 str->erase(remove(str->begin(), str->end(), '\"'), str->end());
787 }
788 res = elem;
789 boolRes = true;
790 }
791 else
792 {
793 info('e') << "parameter " << name << " is list (only scalar is available)" << std::endl;
794 exit(-1);
795 }
796 }
797 else
798 SetDefault(name, res, defValue, echoDefault);
799
800 return boolRes;
801 };
Here is the call graph for this function:

◆ get() [13/13]

bool VMlib::StreamParser::get ( const std::string &  name,
v3D res,
const v3D defValue = nullptr,
bool  echoDefault = true 
) const
inline

Считывание точки из базы данных

Переопределение метода get() для считывания точки (v3D) из базы данных

Parameters
[in]nameконстантная ссылка на строку — имя считываемого параметра
[out]resссылка на точку, считываемую из базы данных
[in]defValueуказатель на константу — значение по умолчанию (по умолчанию nullptr)
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию (по умолчанию true)
Returns
признак считывания переменной из базы данных (false - если считано значение по умолчанию)

Definition at line 868 of file StreamParser.h.

869 {
870 bool boolRes = false;
871
872 std::unordered_map<std::string, std::vector<std::string>>::const_iterator search_it, search_ita, search_itb;
873
874 for (search_ita = database.begin(); search_ita != database.end(); ++search_ita)
875 if (is_match(search_ita->first, UpperCase(name)))
876 break;
877
878 for (search_itb = defaults.begin(); search_itb != defaults.end(); ++search_itb)
879 if (is_match(search_itb->first, UpperCase(name)))
880 break;
881
882 //поиск ключа в базе и, если нет, то в базе умолчаний
883 //if (((search_it = database.find(UpperCase(name))) != database.end()) ||
884 // ((search_it = defaults.find(UpperCase(name))) != defaults.end()))
885 if (((search_it = search_ita) != database.end()) ||
886 ((search_it = search_itb) != defaults.end()))
887 {
888 if ((search_it->second).size() == res.size())
889 {
890 for (size_t i = 0; i < (search_it->second).size(); ++i)
891 {
892 std::string s = (search_it->second)[i];
893
894 std::stringstream ss(s);
895 double elem;
896 ss >> elem;
897 res[i] = elem;
898 }
899 boolRes = true;
900 }
901 else
902 {
903 info('e') << "parameter " << name << " length differs from 3 (only v3D is available)" << std::endl;
904 exit(-1);
905 }
906
907 }
908 else
909 SetDefault(name, res, defValue, echoDefault);
910
911 return boolRes;
912 }
Here is the call graph for this function:

◆ MergeDbsWithoutRepeats()

void StreamParser::MergeDbsWithoutRepeats ( std::unordered_map< std::string, std::vector< std::string > > &  database,
const std::unordered_map< std::string, std::vector< std::string > > &  add 
)
private

Слияние двух баз данных

Дополняет первую базу данных записями из второй, если такого ключа там раньше не было
Возвращает измененную первую базу данных

Parameters
[in,out]databaseссылка на дополняемую базу данных (unordered_map)
[in]addконстантная ссылка на добавляемую базу данных

Definition at line 257 of file StreamParser.cpp.

258{
259 for (const auto& rec : add)
260 {
261 auto positionKey = database.find(rec.first);
262 if (positionKey == database.end())
263 database.insert(rec);
264 }
265}
Here is the caller graph for this function:

◆ ParseStream()

void StreamParser::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 = ')' 
)
private

Парсинг заданного потока

Разбирает поток вида key = value или key = { value1, value2, ..., valueN }
Возвращает базу данных, указывается тип скобок, по умолчанию — круглые

Parameters
[in]streamссылка на поток, который требуется распарсить
[out]databaseссылка на заполняемую базу данных (unordered_map)
[in]specificKeyпоиск только ключей из данного списка (по умолчанию — пустой список, что означает разбор всех ключей)
[in]replaceVarsпризнак замены переменных из базы vars (по умолчанию false)
[in]openBracketтип открывающейся скобки (по умолчанию — "(" )
[in]closeBracketтип закрывающейся скобки (по умолчанию — ")" )

Definition at line 184 of file StreamParser.cpp.

185{
186 std::string line, readline;
187 size_t defVarNum = 0;
188
189 while (stream.good())
190 {
191 line = "";
192
193 do
194 {
195 getline(stream, readline);
196
197 size_t posComment = std::min(readline.find('#'), readline.find("//"));
198 //min, так как если не найдено -- то find возвращает string::npos, которое равно (-1), но приводится к большому положительному size_t
199 if (posComment != std::string::npos)
200 readline = readline.substr(0, posComment);
201
202 line += readline;
203
204 readline.erase(remove(readline.begin(), readline.end(), ' '), readline.end());
205 readline.erase(remove(readline.begin(), readline.end(), '\t'), readline.end());
206
207 } while ( (readline.size()>0) && (readline[readline.size() - 1] == '\\') && (stream.good()));
208
209 line.erase(remove(line.begin(), line.end(), '\\'), line.end());
210 line.erase(remove(line.begin(), line.end(), ' '), line.end());
211 line.erase(remove(line.begin(), line.end(), '\t'), line.end());
212
213 size_t posEqual = line.find('=');
214 if (posEqual != -1)
215 {
216 std::string key = line.substr(0, posEqual);
217 auto search_it = database.find(UpperCase(key));
218
219 if (search_it == database.end())
220 {
221 if ((specificKey.size() == 0) || (std::find(specificKey.begin(),specificKey.end(),key) != specificKey.end()) )
222 {
223 std::string value = line.substr(posEqual + 1, line.length());
224 if (replaceVars)
225 ReplaceVarsInString(value);
226 database.insert(make_pair(UpperCase(key), StringToVector(value, openBracket, closeBracket)));
227 }
228 }
229 else
230 {
231 info('e') << "key <" << key << "> is found twice" << std::endl;
232 exit(-1);
233 }
234 }//if (posEqual != -1)
235 else if (line.size() > 0)
236 {
237 std::string value = line;
238 if (replaceVars)
239 ReplaceVarsInString(value);
240
241 std::stringstream ssDef;
242 ssDef << "_defVar_" << defVarNum;
243
244 database.insert(make_pair(UpperCase(ssDef.str()), StringToVector(value, openBracket, closeBracket)));
245
246 ++defVarNum;
247 }
248 }//while (streamName.good())
249
250 //Указатель возвращаем в начало потока
251 stream.clear();
252 stream.seekg(0, std::ios::beg);
253}//ParseStream(...)
static std::vector< std::string > StringToVector(std::string line, char openBracket='(', char closeBracket=')')
Pазбор строки, содержащей запятые, на отдельные строки
void ReplaceVarsInString(std::string &st)
Замена переменных в строке их значениями
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReplaceVarsInString()

void StreamParser::ReplaceVarsInString ( std::string &  st)
private

Замена переменных в строке их значениями

Находит в строке все переменные, имена которых начинаются с символа $, и заменяет их на значения, извлекаемые из базы данных vars

Parameters
[in]stстрока, которая подлежит обработке

Definition at line 269 of file StreamParser.cpp.

270{
271 while (st.find("$") != -1)
272 {
273 size_t startVar = st.find('$');
274
275 size_t endVar = -1 + std::min({
276 st.find(" ", startVar + 1),
277 st.find(",", startVar + 1),
278 st.find(";", startVar + 1),
279 st.find("$", startVar + 1),
280 st.find("(", startVar + 1),
281 st.find(")", startVar + 1),
282 st.find("{", startVar + 1),
283 st.find("}", startVar + 1),
284 st.find("\n", startVar + 1),
285 st.length()
286 });
287
288 std::string var = st.substr(startVar + 1, endVar - startVar);
289
290 auto search_var = vars.find(UpperCase(var));
291 if ((search_var != vars.end()) && ((search_var->second).size() > 0))
292 {
293 std::vector<std::string> findString = search_var->second;
294
295 std::stringstream ss;
296
297 ss << st.substr(0, startVar);
298
299 if (findString.size() == 1)
300 {
301 ss << findString[0];
302 }
303 else
304 {
305 ss << "{" << findString[0];
306 if (findString.size() > 0)
307 {
308 for (size_t sz = 1; sz < findString.size(); ++sz)
309 ss << "," << findString[sz];
310 }
311 ss << "}";
312 }
313
314
315 size_t startP = endVar+1;
316 size_t endP = st.length() - 1;
317
318 if (startP <= endP)
319 ss << st.substr(startP, endP);
320
321 st = ss.str();
322 }
323 else
324 {
325 info('e') << "substitution $" << var << " is undefined" << std::endl;
326 exit(1);
327 }
328 }
329}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetDefault()

template<typename T >
void VMlib::StreamParser::SetDefault ( const std::string &  name,
T &  res,
const T *  defValue,
bool  echoDefault 
) const
inline

Установка значения параметра по умолчанию

Устанавливает параметру значение по умолчанию, если оно задано в виде константной ссылки

Template Parameters
Tтип параметра, значение которого устанавливается
Parameters
[in]nameконстантная ссылка на строку — имя устанавливаемого параметра (необходимо только для отображения в лог)
[in]resссылка на задаваемый параметр
[in]defValueуказатель на константу — значение по умолчанию
[in]echoDefaultпризнак эхо-ответа при считывании значения по умолчанию

Definition at line 301 of file StreamParser.h.

302 {
303 if (defValue != nullptr)
304 {
305 res = *defValue;
306 if (echoDefault)
307 info('i') << "parameter <" << name << " = " << res << "> set as default" << std::endl;
308 }
309 else
310 {
311 info('e') << "parameter " << name << " is not found" << std::endl;
312 exit(-1);
313 }
314 }
Here is the caller graph for this function:

◆ SplitString()

std::pair< std::string, std::string > StreamParser::SplitString ( LogStream info,
std::string  line,
bool  upcase = true 
)
static

Разбор строки на пару ключ-значение

Разбирает строку вида xxx(yyy) на пару подстрок xxx и yyy

Parameters
[in,out]infoпоток для вывода логов и сообщений об ошибках
[in]lineразбираемая строка вида xxx(ууу)
[in]upcaseпризнак перевода ключа в верхний регистр
Returns
пара строк (xxx, yyy)

Definition at line 163 of file StreamParser.cpp.

164{
165 size_t posBegin = line.find('(', 0);
166 size_t posEnd = line.find(')', 0);
167 if ((posBegin != -1) && (posEnd == -1))
168 {
169 info('e') << "error while parsing line " << line << std::endl;
170 exit(-1);
171 }
172 else
173 {
174 std::string sub = line.substr(0, posBegin);
175 if ((posBegin == -1) && (posEnd == -1))
176 return std::pair<std::string, std::string>(upcase ? UpperCase(sub) : sub, "{}");
177 else
178 return std::pair<std::string, std::string>(upcase ? UpperCase(sub) : sub, "{" + line.substr(posBegin + 1, posEnd - posBegin - 1) + "}");
179 }
180}//SplitString(...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ StringToVector()

std::vector< std::string > StreamParser::StringToVector ( std::string  line,
char  openBracket = '(',
char  closeBracket = ')' 
)
static

Pазбор строки, содержащей запятые, на отдельные строки

Запятые внутри парных скобок игнорируются и не воспринимаются как разделители

Parameters
[in]lineразбираемая строка
[in]openBracketтип открывающейся скобки (по умолчанию — "(" )
[in]closeBracketтип закрывающейся скобки (по умолчанию — ")" )
Returns
список (вектор) из отдельных строк

Definition at line 105 of file StreamParser.cpp.

106{
107 //LogStream info;
108 //info.inheritStream(infoStream, label);
109
110 if (line[0] != '{')
111 {
112 if (line.length() > 0)
113 return { line };
114 else
115 {
116 //info('i') << "empty parameter" << std::endl;
117 return std::vector<std::string>({});
118 }
119 }
120 else
121 {
122 if (line[1] != '}')
123 {
124 std::vector<std::string> vecLine;
125 size_t pos;
126 while ( ((pos = line.find(',', 0)) < line.find(openBracket, 1)) ||
127 ( (pos = line.find(',', std::max(1, static_cast<int>(line.find(closeBracket, 1)) ))) != std::string::npos) ||
128 (pos = line.length()-1) )
129 {
130 std::string subline = line.substr(1, pos - 1);
131 if (subline != "")
132 vecLine.push_back(subline);
133
134 line.erase(1, subline.size() + 1);
135 }
136 return vecLine;
137 }
138 else
139 {
140 //info('i') << "empty parameter list" << std::endl;
141 return std::vector<std::string>({});
142 }//else if (line[1] != '}')
143 }//else if (st[0] != '{')
144}//StringToVector(...)
Here is the caller graph for this function:

◆ UpperCase()

std::string StreamParser::UpperCase ( const std::string &  line)
static

Перевод строки в верхний регистр

Parameters
[in]lineконстантная ссылка на обрабатываемую строку
Returns
строка в верхнем регистре

Definition at line 86 of file StreamParser.cpp.

87{
88 std::string str(line);
89 bool flag = true;
90
91 for (auto & c : str)
92 {
93 if (c == '"')
94 flag = !flag;
95 if (flag)
96 c = toupper(c);
97 }
98
99 //std::transform(str.begin(), str.end(), str.begin(), ::toupper);
100 return str;
101};//UpperCase(...)
Here is the caller graph for this function:

◆ VectorStringToString()

std::string StreamParser::VectorStringToString ( const std::vector< std::string > &  _vecString)
static

Объединение вектора (списка) из строк в одну строку

После каждой строки вставляется символ конца строки

Parameters
[in]_vecStringконстантная ссылка на вектор из строк
Returns
сплошную строку с символами конца строки между подстроками

Definition at line 149 of file StreamParser.cpp.

150{
151 std::string buf;
152 for (size_t q = 0; q < _vecString.size(); ++q)
153 {
154 buf.append(_vecString[q]);
155 buf.append("\n");
156 }
157
158 return buf;
159}//VectorStringToString(...)
Here is the caller graph for this function:

Member Data Documentation

◆ database

std::unordered_map<std::string, std::vector<std::string> > VMlib::StreamParser::database

Данные считываемые из основного файла-паспорта расчета

Неупорядоченный ассоциативный контейнер, хранящий данные из паспорта расчета
По умолчанию данные берутся из файла passport, но это имя может быть изменено ключом pspFile в строке параметров задачи

Definition at line 165 of file StreamParser.h.

◆ defaults

std::unordered_map<std::string, std::vector<std::string> > VMlib::StreamParser::defaults
private

Данные считываемые из списка умолчаний

Неупорядоченный ассоциативный контейнер, хранящий данные из файла со списком значений по умолчанию
По умолчанию данные берутся из файла defaults

Definition at line 171 of file StreamParser.h.

◆ info

LogStream VMlib::StreamParser::info
mutableprivate

Поток для вывода логов и сообщений об ошибках

Definition at line 158 of file StreamParser.h.

◆ switchers

std::unordered_map<std::string, std::vector<std::string> > VMlib::StreamParser::switchers
private

Данные считываемые из перечня параметров-переключателей

Неупорядоченный ассоциативный контейнер, хранящий значения параметров-переключателей
По умолчанию данные берутся из файла switcher.

Definition at line 183 of file StreamParser.h.

◆ vars

std::unordered_map<std::string, std::vector<std::string> > VMlib::StreamParser::vars
private

Данные считываемые из параметров конкретной задачи

Неупорядоченный ассоциативный контейнер, хранящий данные из строки — перечня параметров конкретной задачи в файле problems.
Здесь же определяются переменные, которые затем могут использоваться методом разыменовывания в файлах-паспортах конкретных задач

Definition at line 177 of file StreamParser.h.


The documentation for this class was generated from the following files: