/*---------------------------------------------------------------------------*\
========= |
\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\ / O peration |
\ / A nd | www.openfoam.com
\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2024 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
\*---------------------------------------------------------------------------*/
#include "substitutionModel.H"
#include "stringOps.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(substitutionModel, 0);
defineRunTimeSelectionTable(substitutionModel, dictionary);
}
const Foam::word Foam::substitutionModel::KEY_BEGIN = "{{";
const Foam::word Foam::substitutionModel::KEY_END = "}}";
Foam::HashTable Foam::substitutionModel::builtin_;
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::string Foam::substitutionModel::keyify(const word& w)
{
return KEY_BEGIN + w + KEY_END;
}
Foam::word Foam::substitutionModel::cleanKey(const string& str)
{
return stringOps::upper(stringOps::trim(str));
};
Foam::wordList Foam::substitutionModel::getKeys(string& buffer)
{
const label lBegin = KEY_BEGIN.length();
const label lEnd = KEY_END.length();
wordHashSet keys;
size_t pos0 = 0;
size_t pos = 0;
string cleanedBuffer = "";
while (((pos = buffer.find(KEY_BEGIN, pos)) != string::npos))
{
cleanedBuffer += buffer.substr(pos0, pos-pos0);
size_t posEnd = buffer.find(KEY_END, pos);
if (posEnd != string::npos)
{
const word k(cleanKey(buffer.substr(pos+lBegin, posEnd-pos-lEnd)));
keys.insert(k);
cleanedBuffer += keyify(k);
}
pos = posEnd + lEnd;
pos0 = pos;
}
cleanedBuffer += buffer.substr(pos0, buffer.length() - pos0);
buffer = cleanedBuffer;
return keys.toc();
}
void Foam::substitutionModel::addBuiltinStr
(
const word& key,
const string& value
)
{
builtin_.insert(cleanKey(key), value.c_str());
}
bool Foam::substitutionModel::containsBuiltin(const word& key)
{
return builtin_.contains(key);
}
void Foam::substitutionModel::setBuiltinStr
(
const word& key,
const string& value
)
{
builtin_.set(cleanKey(key), value.c_str());
}
bool Foam::substitutionModel::replaceBuiltin(const word& key, string& str)
{
if (builtin_.found(key))
{
str.replaceAll(keyify(key), builtin_[key].c_str());
return true;
}
return false;
}
bool Foam::substitutionModel::replaceBuiltin(string& str)
{
const string str0 = str;
// Quick exit if there are no keys in the string
if (str.find(KEY_BEGIN) == string::npos) return false;
forAllConstIters(builtin_, iter)
{
str.replaceAll(keyify(iter.key()), iter.val().c_str());
}
return str != str0;
}
void Foam::substitutionModel::writeBuiltins(Ostream& os)
{
for (const auto& iter : builtin_.csorted())
{
os << keyify(iter.key()).c_str() << " : " << iter.val() << nl;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::substitutionModel::substitutionModel
(
const dictionary& dict,
const Time& time
)
:
dict_(dict),
time_(time)
{}
// ************************************************************************* //