50 int size1 = word1.size();
51 int size2 = word2.size();
54 std::vector<std::vector<int>> verif(size1+1);
55 for(
int i=0; i<=size1; i++){ verif[i].resize(size2+1); }
65 for (
int i = 0; i <= size1; i++)
67 for (
int j = 0; j <= size2; j++)
71 for (
int i = 1; i <= size1; i++) {
72 for (
int j = 1; j <= size2; j++) {
75 int cost = (word2[j - 1] == word1[i - 1]) ? 0 : 1;
81 verif[i][j] = std::min(
82 std::min(verif[i - 1][j] + 1, verif[i][j - 1] + 1),
83 verif[i - 1][j - 1] + cost
88 return verif[size1][size2];
93 std::ostringstream oss, oss2;
94 std::string minName;
int minDist=1000;
95 for(
const auto& [num,names]: v2nn){
96 oss2<<
" "<<std::setfill(
' ')<<std::setw(3)<<num<<
":";
97 for(
const auto& name: names){
105 if(minDist<=4) oss<<
" (did you mean '"<<minName<<
"'?)";
106 oss<<
".\nPossible values:\n"<<oss2.str();
111#ifdef _USE_TRACE_FIELDS
112 bool InputRecord::TraceFields::active=
false;
113 std::ofstream InputRecord::TraceFields::out;
114 void InputRecord::TraceFields::write(
const std::string& s){
115 if(!InputRecord::TraceFields::active)
return;
116 size_t hash=std::hash<std::string>{}(s);
117 static std::set<size_t> written;
118 if(written.count(hash)>0)
return;
119 written.insert(hash);
120 InputRecord::TraceFields::out<<s<<std::endl;
123 void InputRecord::traceEnum(
const std::string& name,
const std::map<
int,std::vector<std::string>>& val2names){
124 if(!InputRecord::TraceFields::active)
return;
125 std::ostringstream rec;
127 rec<<
"~Enum~;"<<name<<
";";
129 for(
const auto& kvv: val2names){
130 rec<<(i++==0?
'{':
',')<<
'"'<<kvv.first<<
"\":";
132 for(
const auto& v: kvv.second) rec<<(j++==0?
'[':
',')<<
'"'<<v<<
'"';
136 InputRecord::TraceFields::write(rec.str());
145InputRecord :: giveReader()
const {
149std::shared_ptr<InputRecord>
153 auto weak=this->weak_from_this();
154 std::shared_ptr<InputRecord> ret=weak.lock();
155 if(!ret)
OOFEM_ERROR(
"shared_ptr<InputRecord>::ptr(): object lifetime expired (programming error)");
160#ifdef _INPUTRECORD_OPTIONAL_OLD
164 if ( this->hasField(
id) ) {
166 this->giveField(answer,
id);
167 }
catch ( MissingKeywordInputException & ) { }
172InputRecord :: giveOptionalField(
double &answer,
InputFieldType id)
174 if ( this->hasField(
id) ) {
176 this->giveField(answer,
id);
184 if ( this->hasField(
id) ) {
186 this->giveField(answer,
id);
192InputRecord :: giveOptionalField(std :: string &answer,
InputFieldType id)
194 if ( this->hasField(
id) ) {
196 this->giveField(answer,
id);
204 if ( this->hasField(
id) ) {
206 this->giveField(answer,
id);
214 if ( this->hasField(
id) ) {
216 this->giveField(answer,
id);
224 if ( this->hasField(
id) ) {
226 this->giveField(answer,
id);
232InputRecord :: giveOptionalField(std :: vector< std :: string > &answer,
InputFieldType id)
234 if ( this->hasField(
id) ) {
236 this->giveField(answer,
id);
244 if ( this->hasField(
id) ) {
246 this->giveField(answer,
id);
252InputRecord :: giveOptionalField(std :: list< Range > &answer,
InputFieldType id)
254 if ( this->hasField(
id) ) {
256 this->giveField(answer,
id);
264 if ( this->hasField(
id) ) {
266 this->giveField(answer,
id);
298 "\nReason: \"" + reason +
"\"\n" + \
324 cname =
"DofManager";
328 msg =
"Value input error for keyword \"" + keyword +
"\"" + \
329 "\nReason: \"" + reason +
"\"\n" + \
330 cname +
"[" + std::to_string(number) +
"]" +
"\"";
338 cname =
"DofManager";
342 msg =
"Value input error, reason: \"" + reason +
"\"\n" + \
343 cname +
"[" + std::to_string(number) +
"]" +
"\"";
static constexpr int maxMsgLen
const char * InputFieldType
Identifier of fields in input records.