VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
StreamParser.h
Go to the documentation of this file.
1/*--------------------------------*- VM2D -*-----------------*---------------*\
2| ## ## ## ## #### ##### | | Version 1.14 |
3| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2026/03/06 |
4| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5| #### ## ## ## ## ## | Open Source Code |
6| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7| |
8| Copyright (C) 2017-2026 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9*-----------------------------------------------------------------------------*
10| File name: StreamParser.h |
11| Info: Source code of VM2D |
12| |
13| This file is part of VM2D. |
14| VM2D is free software: you can redistribute it and/or modify it |
15| under the terms of the GNU General Public License as published by |
16| the Free Software Foundation, either version 3 of the License, or |
17| (at your option) any later version. |
18| |
19| VM2D is distributed in the hope that it will be useful, but WITHOUT |
20| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22| for more details. |
23| |
24| You should have received a copy of the GNU General Public License |
25| along with VM2D. If not, see <http://www.gnu.org/licenses/>. |
26\*---------------------------------------------------------------------------*/
27
28
40#ifndef STREAMPARSER_H
41#define STREAMPARSER_H
42
43//#define VARNAME(var) #var
44
45#include <algorithm>
46#include <sstream>
47#include <unordered_map>
48
49#include "defs.h"
50#include "Gpu2D.h"
51
52namespace VMlib
53{
59 inline int is_match(const std::string& line_, const std::string& pattern_)
60 {
61
62 const auto lineCStr = line_.c_str();
63 const auto patternCStr = pattern_.c_str();
64
65 const char* line = &(lineCStr[0]);
66 const char* pattern = &(patternCStr[0]);
67
68 // returns 1 (true) if there is a match
69 // returns 0 if the pattern is not whitin the line
70 int wildcard = 0;
71
72 const char* last_pattern_start = 0;
73 const char* last_line_start = 0;
74 do
75 {
76 if (*pattern == *line)
77 {
78 if (wildcard == 1)
79 last_line_start = line + 1;
80
81 line++;
82 pattern++;
83 wildcard = 0;
84 }
85 else if (*pattern == '?')
86 {
87 if (*(line) == '\0') // the line is ended but char was expected
88 return 0;
89 if (wildcard == 1)
90 last_line_start = line + 1;
91 line++;
92 pattern++;
93 wildcard = 0;
94 }
95 else if (*pattern == '*')
96 {
97 if (*(pattern + 1) == '\0')
98 return 1;
99
100 last_pattern_start = pattern;
101 //last_line_start = line + 1;
102 wildcard = 1;
103
104 pattern++;
105 }
106 else if (wildcard)
107 {
108 //if (*line == *pattern) //is always false
109 //{
110 // wildcard = 0;
111 // line++;
112 // pattern++;
113 // last_line_start = line + 1;
114 //}
115 //else
116 line++;
117 }
118 else
119 {
120 if ((*pattern) == '\0' && (*line) == '\0') // end of mask
121 return 1; // if the line also ends here then the pattern match
122 else
123 {
124 if (last_pattern_start != 0) // try to restart the mask on the rest
125 {
126 pattern = last_pattern_start;
127 line = last_line_start;
128 last_line_start = 0;
129 }
130 else
131 return 0;
132 }
133 }
134
135 } while (*line);
136
137 if (*pattern == '\0')
138 return 1;
139 else
140 return 0;
141 };
142
143
144
145
146
154 {
155 private:
156
159
164 public:
165 std::unordered_map<std::string, std::vector<std::string>> database;
166 private:
171 std::unordered_map<std::string, std::vector<std::string>> defaults;
172
177 std::unordered_map<std::string, std::vector<std::string>> vars;
178
183 std::unordered_map<std::string, std::vector<std::string>> switchers;
184
195 void ParseStream(
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 = ')'
201 );
202
209 void MergeDbsWithoutRepeats(std::unordered_map<std::string, std::vector<std::string>>& database, const std::unordered_map<std::string, std::vector<std::string>>&);
210
216 void ReplaceVarsInString(std::string& st);
217
218
219 public:
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 = {});
233
244 StreamParser(LogStream& infoStream, const std::string& label, std::istream& mainStream, std::istream& defaultsStream, std::vector<std::string> specificKey = {});
245
256 StreamParser(LogStream& infoStream, const std::string& label, std::istream& mainStream, char openBracket = '{', char closeBracket = '}');
257
260
265 static std::string UpperCase(const std::string& line);
266
274 static std::vector<std::string> StringToVector(std::string line, char openBracket = '(', char closeBracket = ')');
275
281 static std::string VectorStringToString(const std::vector<std::string>& _vecString);
282
290 static std::pair<std::string, std::string> SplitString(LogStream& info, std::string line, bool upcase = true);
291
300 template <typename T>
301 void SetDefault(const std::string& name, T& res, const T* defValue, bool echoDefault) const
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 }
315
324 bool get(const std::string& name, std::vector<Point2D>& res, const std::vector<Point2D>* defValue = nullptr, bool echoDefault = true) const
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 };
362
363
372 bool get(const std::string& name, std::vector<v3D>& res, const std::vector<v3D>* defValue = nullptr, bool echoDefault = true) const
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 };
412
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
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 };
460
461
470 template<typename T>
471 bool get(const std::string& name, std::vector<numvector<T,2>>& res, const std::vector<numvector<T, 2>>* defValue = nullptr, bool echoDefault = true) const
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 };
509
510
519 bool get(const std::string& name, std::vector<Vortex2D/*, VM2D::MyAlloc<VMlib::Vortex2D>*/>& res, const std::vector<Vortex2D>* defValue = nullptr, bool echoDefault = true) const
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 };
563
564
573 bool get(const std::string& name, std::vector<GeomPoint>& res, const std::vector<GeomPoint>* defValue = nullptr, bool echoDefault = true) const
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 };
619
620
621
622
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
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 };
675
676
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
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 };
738
739
740
741
751 template <typename T>
752 bool get(const std::string& name, T& res, const T* defValue = nullptr, bool echoDefault = true) const
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 };
802
803
804
813 bool get(const std::string& name, Point2D& res, const Point2D* defValue = nullptr, bool echoDefault = true) const
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 }
858
859
868 bool get(const std::string& name, v3D& res, const v3D* defValue = nullptr, bool echoDefault = true) const
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 }
913
914
923 bool get(const std::string& name, bool& res, const bool* defValue = nullptr, bool echoDefault = true) const
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(...)
969
970
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
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 };
1048 };
1049
1050}//namespace VMlib
1051
1052#endif
Заголовочный файл с описанием класса Gpu.
Класс, определяющий работу с потоком логов
Definition LogStream.h:57
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
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)
Замена переменных в строке их значениями
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
Definition numvector.h:99
size_t size() const
Definition numvector.h:114
Класс, опеделяющий двумерный вектор
Definition v3D.h:60
Описание базовых вспомогательных функций
int is_match(const std::string &line_, const std::string &pattern_)
Функция сверки строки с шаблоном, который может содержать знаки * и ?
Глобальные параметры по умолчанию
Definition defs.h:100
Класс, опеделяющий двумерный вектор
Definition Point2D.h:241