OGS
BaseLib::ConfigTree Class Referencefinal

Detailed Description

Wrapper around a Boost Property Tree with some basic error reporting features.

Features. This class:

  • makes sure that every configuration setting in a Property Tree is read exactly once. If some settings is not read (e.g. due to a typo), a warning message is generated. The message contains a hint where it occurred.
  • enforces a naming scheme of settings: letters a-z, numbers 0-9, underscore
  • provides some functionality to read lists of values using range-based for loops.
  • has rather long method names that are easily greppable from the source code. So a list of supported configuration options can be easily obtained from the source code.

The purpose of this class is to reduce or completely avoid the amount of error-handling code in routines that take configuration parameters.

Most methods of this class check that they have not been called before for the same ConfigTree and the same parameter. This behaviour helps to enforce that every parameter is read exactly once during parsing of the configuration settings.

The most notable restriction of this class when compared to plain tree traversal is, that one must know all the XML tags (i.e. configuration parameters) at compile time. It is not possible to read from this class, which configuration parameters are present in the tree. This restriction, however, is intended, because it provides the possibility to get all existing configuration parameters from the source code.

This class maintains a read counter for each parameter accessed through any of its methods. Read counters are increased with every read (the only exception being the peekConfigParameter() method). The destructor finally decreases the read counter for every tag/attribute it find on the current level of the XML tree. If the increases/decreases don't cancel each other, warning messages are generated. This check can also be enforced before destruction by using the BaseLib::checkAndInvalidate() functions.

The design of this class entails some limitations compared to traversing a plain tree, e.g., it is not possible to obtain a list of tags or attributes from the tree, but one has to explicitly query the specific tags/attributes one is interested in. That way it is possible to get all used configuration parameters directly from the source code where this class is used, and to maintain the quality of the configuration parameter documentation.

Instances of this class only keep a reference to the underlying boost::property_tree. Therefore it is necessary that the underlying property tree stays intact as long as any instance—i.e. the top level ConfigTree and any of its children—reference it. In order to simplify the handling of this dependence, the class ConfigTreeTopLevel can be used.

The construction of a ConfigTree from the content of an XML file can be done with the function BaseLib::makeConfigTree(), which performs many error checks. For limitations of the used XML parser, please have a look at that function's documentation.

Definition at line 106 of file ConfigTree.h.

#include <ConfigTree.h>

Classes

struct  CountType
 
class  ParameterIterator
 
class  SubtreeIterator
 
class  ValueIterator
 

Public Types

using PTree = boost::property_tree::ptree
 The tree being wrapped by this class.
 
using Callback
 

Public Member Functions

 ConfigTree (PTree &&top_level_tree, std::string filename, Callback error_cb, Callback warning_cb)
 
 ConfigTree (ConfigTree const &)=delete
 copying is not compatible with the semantics of this class
 
 ConfigTree (ConfigTree &&other)
 
ConfigTreeoperator= (ConfigTree const &)=delete
 copying is not compatible with the semantics of this class
 
ConfigTreeoperator= (ConfigTree &&other)
 
std::string const & getProjectFileName () const
 Used to get the project file name.
 
 ~ConfigTree ()
 
Methods for directly accessing parameter values
template<typename T >
getConfigParameter (std::string const &param) const
 
template<typename T >
getConfigParameter (std::string const &param, T const &default_value) const
 
template<typename T >
std::optional< T > getConfigParameterOptional (std::string const &param) const
 
template<typename T >
Range< ValueIterator< T > > getConfigParameterList (std::string const &param) const
 
Methods for accessing parameters that have attributes

The getConfigParameter...() methods in this group—note: they do not have template parameters—check that the queried parameters do not have any children (apart from XML attributes); if they do, error() is called.

The support for parameters with attributes is limited in the sense that it is not possible to peek/check them. However, such functionality can easily be added on demand.

ConfigTree getConfigParameter (std::string const &root) const
 
std::optional< ConfigTreegetConfigParameterOptional (std::string const &param) const
 
Range< ParameterIteratorgetConfigParameterList (std::string const &param) const
 
template<typename T >
getValue () const
 
template<typename T >
getConfigAttribute (std::string const &attr) const
 
template<typename T >
getConfigAttribute (std::string const &attr, T const &default_value) const
 
template<typename T >
std::optional< T > getConfigAttributeOptional (std::string const &attr) const
 
Methods for peeking and checking parameters

To be used in builder/factory functions: E.g., one can peek a parameter denoting the type of an object to generate in the builder, and check the type parameter in the constructor of the generated object.

template<typename T >
peekConfigParameter (std::string const &param) const
 
void checkConfigParameter (std::string const &param, std::string_view const value) const
 
Methods for accessing subtrees
ConfigTree getConfigSubtree (std::string const &root) const
 
std::optional< ConfigTreegetConfigSubtreeOptional (std::string const &root) const
 
Range< SubtreeIteratorgetConfigSubtreeList (std::string const &root) const
 
Methods for ignoring parameters
void ignoreConfigParameter (std::string const &param) const
 
void ignoreConfigParameterAll (std::string const &param) const
 
void ignoreConfigAttribute (std::string const &attr) const
 

Static Public Member Functions

static void onerror (std::string const &filename, std::string const &path, std::string const &message)
 
static void onwarning (std::string const &filename, std::string const &path, std::string const &message)
 
static void assertNoSwallowedErrors ()
 Asserts that there have not been any errors reported in the destructor.
 

Private Types

enum class  Attr : bool { TAG = false , ATTR = true }
 Used to indicate if dealing with XML tags or XML attributes. More...
 
using KeyType = std::pair<Attr, std::string>
 A pair (is attribute, tag/attribute name).
 

Private Member Functions

template<typename T >
std::optional< T > getConfigParameterOptionalImpl (std::string const &param, T *) const
 Default implementation of reading a value of type T.
 
template<typename T >
std::optional< std::vector< T > > getConfigParameterOptionalImpl (std::string const &param, std::vector< T > *) const
 Implementation of reading a vector of values of type T.
 
 ConfigTree (PTree const &tree, ConfigTree const &parent, std::string const &root)
 Used for wrapping a subtree.
 
void error (std::string const &message) const
 
void warning (std::string const &message) const
 
void checkKeyname (std::string const &key) const
 Checks if key complies with the rules [a-z0-9_].
 
std::string joinPaths (std::string const &p1, std::string const &p2) const
 Used to generate the path of a subtree.
 
void checkUnique (std::string const &key) const
 Asserts that the key has not been read yet.
 
void checkUniqueAttr (std::string const &attr) const
 Asserts that the attribute attr has not been read yet.
 
template<typename T >
CountTypemarkVisited (std::string const &key, Attr const is_attr, bool peek_only) const
 
CountTypemarkVisited (std::string const &key, Attr const is_attr, bool const peek_only) const
 
void markVisitedDecrement (Attr const is_attr, std::string const &key) const
 
bool hasChildren () const
 Checks if this tree has any children.
 
void checkAndInvalidate ()
 

Static Private Member Functions

static std::string shortString (std::string const &s)
 returns a short string at suitable for error/warning messages
 

Private Attributes

std::shared_ptr< PTree const > top_level_tree_
 
PTree const * tree_
 The wrapped tree.
 
std::string path_
 A path printed in error/warning messages.
 
std::string filename_
 The path of the file from which this tree has been read.
 
std::map< KeyType, CountTypevisited_params_
 
bool have_read_data_ = false
 
Callback onerror_
 Custom error callback.
 
Callback onwarning_
 Custom warning callback.
 

Static Private Attributes

static const char pathseparator = '/'
 Character separating two path components.
 
static const std::string key_chars_start = "abcdefghijklmnopqrstuvwxyz"
 Set of allowed characters as the first letter of a key name.
 
static const std::string key_chars = key_chars_start + "_0123456789"
 Set of allowed characters in a key name.
 

Friends

void checkAndInvalidate (ConfigTree *const conf)
 
void checkAndInvalidate (ConfigTree &conf)
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 
void checkAndInvalidate (std::unique_ptr< ConfigTree > const &conf)
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 

Member Typedef Documentation

◆ Callback

Initial value:
std::function<void(const std::string& filename,
const std::string& path,
const std::string& message)>

Type of the function objects used as callbacks.

Arguments of the callback:

  • filename the file being from which this ConfigTree has been read.
  • path the path in the tree where the message was generated.
  • message the message to be printed.

Definition at line 264 of file ConfigTree.h.

◆ KeyType

using BaseLib::ConfigTree::KeyType = std::pair<Attr, std::string>
private

A pair (is attribute, tag/attribute name).

Definition at line 657 of file ConfigTree.h.

◆ PTree

using BaseLib::ConfigTree::PTree = boost::property_tree::ptree

The tree being wrapped by this class.

Definition at line 255 of file ConfigTree.h.

Member Enumeration Documentation

◆ Attr

enum class BaseLib::ConfigTree::Attr : bool
strongprivate

Used to indicate if dealing with XML tags or XML attributes.

Enumerator
TAG 
ATTR 

Definition at line 571 of file ConfigTree.h.

572 {
573 TAG = false,
574 ATTR = true
575 };

Constructor & Destructor Documentation

◆ ConfigTree() [1/4]

BaseLib::ConfigTree::ConfigTree ( ConfigTree::PTree && top_level_tree,
std::string filename,
Callback error_cb,
Callback warning_cb )
explicit

Creates a new instance wrapping the given Boost Property Tree.

Parameters
top_level_treethe top level Boost Property Tree
filenamethe file from which the tree has been read
error_cbcallback function to be called on error.
warning_cbcallback function to be called on warning.

The callback functions must be valid callable functions, i.e. not nullptr's. They are configurable in order to make unit tests of this class easier. They should not be provided in production code!

Defaults are strict: By default, both callbacks are set to the same function, i.e., warnings will also result in program abortion!

Definition at line 35 of file ConfigTree.cpp.

39 : top_level_tree_(std::make_shared<PTree>(std::move(top_level_tree))),
41 filename_(std::move(filename)),
42 onerror_(std::move(error_cb)),
43 onwarning_(std::move(warning_cb))
44{
45 if (!onerror_)
46 {
47 OGS_FATAL("ConfigTree: No valid error handler provided.");
48 }
49 if (!onwarning_)
50 {
51 OGS_FATAL("ConfigTree: No valid warning handler provided.");
52 }
53}
#define OGS_FATAL(...)
Definition Error.h:26
Callback onwarning_
Custom warning callback.
Definition ConfigTree.h:673
std::shared_ptr< PTree const > top_level_tree_
Definition ConfigTree.h:645
Callback onerror_
Custom error callback.
Definition ConfigTree.h:672
PTree const * tree_
The wrapped tree.
Definition ConfigTree.h:648
std::string filename_
The path of the file from which this tree has been read.
Definition ConfigTree.h:654

References OGS_FATAL, onerror_, and onwarning_.

Referenced by getConfigSubtreeOptional(), BaseLib::ConfigTree::SubtreeIterator::operator*(), and BaseLib::ConfigTree::ValueIterator< ValueType >::operator*().

◆ ConfigTree() [2/4]

BaseLib::ConfigTree::ConfigTree ( ConfigTree const & )
delete

copying is not compatible with the semantics of this class

◆ ConfigTree() [3/4]

BaseLib::ConfigTree::ConfigTree ( ConfigTree && other)

After being moved from, other is in an undefined state and must not be used anymore!

Definition at line 67 of file ConfigTree.cpp.

68 : top_level_tree_(std::move(other.top_level_tree_)),
69 tree_(other.tree_),
70 path_(std::move(other.path_)),
71 filename_(std::move(other.filename_)),
72 visited_params_(std::move(other.visited_params_)),
73 have_read_data_(other.have_read_data_),
74 onerror_(std::move(other.onerror_)),
75 onwarning_(std::move(other.onwarning_))
76{
77 other.tree_ = nullptr;
78}
std::map< KeyType, CountType > visited_params_
Definition ConfigTree.h:666
std::string path_
A path printed in error/warning messages.
Definition ConfigTree.h:651

◆ ~ConfigTree()

BaseLib::ConfigTree::~ConfigTree ( )

The destructor performs the check if all nodes at the current level of the tree have been read. Errors raised by the check are swallowed. Use assertNoSwallowedErrors() manually to check for those.

Definition at line 80 of file ConfigTree.cpp.

81{
82 if (std::uncaught_exceptions() > 0)
83 {
84 /* If the stack unwinds the check below shall be suppressed in order to
85 * not accumulate false-positive configuration errors.
86 */
87 return;
88 }
89
90 try
91 {
93 }
94 catch (std::exception& e)
95 {
96 ERR("{:s}", e.what());
97 configtree_destructor_error_messages.push_front(e.what());
98 }
99}
static std::forward_list< std::string > configtree_destructor_error_messages
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:45

References checkAndInvalidate(), configtree_destructor_error_messages, and ERR().

◆ ConfigTree() [4/4]

BaseLib::ConfigTree::ConfigTree ( PTree const & tree,
ConfigTree const & parent,
std::string const & root )
explicitprivate

Used for wrapping a subtree.

Definition at line 55 of file ConfigTree.cpp.

57 : top_level_tree_(parent.top_level_tree_),
58 tree_(&tree),
59 path_(joinPaths(parent.path_, root)),
60 filename_(parent.filename_),
61 onerror_(parent.onerror_),
62 onwarning_(parent.onwarning_)
63{
64 checkKeyname(root);
65}
std::string joinPaths(std::string const &p1, std::string const &p2) const
Used to generate the path of a subtree.
void checkKeyname(std::string const &key) const
Checks if key complies with the rules [a-z0-9_].

References checkKeyname().

Member Function Documentation

◆ assertNoSwallowedErrors()

void BaseLib::ConfigTree::assertNoSwallowedErrors ( )
static

Asserts that there have not been any errors reported in the destructor.

Definition at line 255 of file ConfigTree.cpp.

256{
258 {
259 return;
260 }
261
262 ERR("ConfigTree: There have been errors when parsing the configuration "
263 "file(s):");
264
265 for (auto const& msg : configtree_destructor_error_messages)
266 {
267 ERR("{:s}", msg);
268 }
269
270 OGS_FATAL("There have been errors when parsing the configuration file(s).");
271}

References configtree_destructor_error_messages, ERR(), and OGS_FATAL.

Referenced by Simulation::initializeDataStructures().

◆ checkAndInvalidate()

void BaseLib::ConfigTree::checkAndInvalidate ( )
private

Checks if the top level of this tree has been read entirely (and not too often).

Postcondition
This method also invalidates the instance, i.e., afterwards it must not be used anymore!

Definition at line 406 of file ConfigTree.cpp.

407{
408 if (!tree_)
409 {
410 return;
411 }
412
413 // Note: due to a limitation in boost::property_tree it is not possible
414 // to discriminate between <tag></tag> and <tag/> in the input file.
415 // In both cases data() will be empty.
416 if ((!have_read_data_) && !tree_->data().empty())
417 {
418 warning("The immediate data `" + shortString(tree_->data()) +
419 "' of this tag has not been read.");
420 }
421
422 // iterate over children
423 for (auto const& p : *tree_)
424 {
425 if (p.first != "<xmlattr>")
426 { // attributes are handled below
428 }
429 }
430
431 // iterate over attributes
432 if (auto attrs = tree_->get_child_optional("<xmlattr>"))
433 {
434 for (auto const& p : *attrs)
435 {
437 }
438 }
439
440 for (auto const& p : visited_params_)
441 {
442 auto const& tag = p.first.second;
443 auto const& count = p.second.count;
444
445 switch (p.first.first)
446 {
447 case Attr::ATTR:
448 if (count > 0)
449 {
450 warning("XML attribute '" + tag + "' has been read " +
451 std::to_string(count) +
452 " time(s) more than it was present in the "
453 "configuration tree.");
454 }
455 else if (count < 0)
456 {
457 warning("XML attribute '" + tag + "' has been read " +
458 std::to_string(-count) +
459 " time(s) less than it was present in the "
460 "configuration tree.");
461 }
462 break;
463 case Attr::TAG:
464 if (count > 0)
465 {
466 warning("Key <" + tag + "> has been read " +
467 std::to_string(count) +
468 " time(s) more than it was present in the "
469 "configuration tree.");
470 }
471 else if (count < 0)
472 {
473 warning("Key <" + tag + "> has been read " +
474 std::to_string(-count) +
475 " time(s) less than it was present in the "
476 "configuration tree.");
477 }
478 }
479 }
480
481 // The following invalidates this instance, s.t. it can not be read from it
482 // anymore, but it also prevents double-checking.
483 tree_ = nullptr;
484}
void markVisitedDecrement(Attr const is_attr, std::string const &key) const
static std::string shortString(std::string const &s)
returns a short string at suitable for error/warning messages
void warning(std::string const &message) const

References ATTR, have_read_data_, markVisitedDecrement(), shortString(), TAG, tree_, visited_params_, and warning().

Referenced by ~ConfigTree(), and operator=().

◆ checkConfigParameter()

void BaseLib::ConfigTree::checkConfigParameter ( std::string const & param,
std::string_view const value ) const

Assert that param has the given value.

Convenience method combining getConfigParameter(std::string const&) with a check.

Definition at line 151 of file ConfigTree.cpp.

153{
154 auto const parameter_value = getConfigParameter<std::string>(param);
155 if (parameter_value != value)
156 {
157 error("For the tag <" + param + "> expected to read value '" +
158 value.data() + "', but got '" + parameter_value + "'.");
159 }
160}
void error(std::string const &message) const

References error().

Referenced by MaterialPropertyLib::createAverageMolarMass(), MaterialPropertyLib::createBishopsPowerLaw(), MaterialPropertyLib::createBishopsSaturationCutoff(), MaterialLib::PorousMedium::createBrooksCorey(), MaterialLib::PorousMedium::createCapillaryPressureModel(), MaterialPropertyLib::createCapillaryPressureRegularizedVanGenuchten(), MaterialPropertyLib::createCapillaryPressureVanGenuchten(), ProcessLib::createCentralDifferencesJacobianAssembler(), MaterialPropertyLib::createClausiusClapeyron(), MaterialLib::Fracture::CohesiveZoneModeI::createCohesiveZoneModeI(), ProcessLib::createCompareJacobiansJacobianAssembler(), ProcessLib::ComponentTransport::createComponentTransportProcess(), MaterialPropertyLib::createConstant(), ParameterLib::createConstantParameter(), MaterialLib::Fracture::Permeability::createConstantPermeability(), ProcessLib::createConstraintDirichletBoundaryCondition(), NumLib::createConvergenceCriterionDeltaX(), NumLib::createConvergenceCriterionPerComponentDeltaX(), NumLib::createConvergenceCriterionPerComponentResidual(), NumLib::createConvergenceCriterionResidual(), MaterialLib::Fracture::createCoulomb(), MaterialLib::Solids::Creep::createCreepBGRa(), MaterialLib::Fracture::Permeability::createCubicLaw(), MaterialPropertyLib::createCubicLawPermeability(), MaterialPropertyLib::createCurve(), ParameterLib::createCurveScaledParameter(), ProcessLib::createDirichletBoundaryCondition(), ProcessLib::createDirichletBoundaryConditionWithinTimeInterval(), MaterialPropertyLib::createDupuitPermeability(), MaterialPropertyLib::createEffectiveThermalConductivityPorosityMixing(), MaterialLib::Solids::Ehlers::createEhlers(), MaterialPropertyLib::createEmbeddedFracturePermeability(), NumLib::createEvolutionaryPIDcontroller(), MaterialPropertyLib::createExponential(), NumLib::createFixedTimeStepping(), MaterialLib::Fluid::createFluidDensityModel(), ProcessLib::createForwardDifferencesJacobianAssembler(), MaterialPropertyLib::createFunction(), ParameterLib::createFunctionParameter(), MaterialPropertyLib::createGasPressureDependentPermeability(), ParameterLib::createGroupBasedParameter(), ProcessLib::createHCNonAdvectiveFreeComponentFlowBoundaryCondition(), ProcessLib::HeatConduction::createHeatConductionProcess(), ProcessLib::HeatTransportBHE::createHeatTransportBHEProcess(), ProcessLib::HT::createHTProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::HydroMechanics::createHydroMechanicsProcess(), MaterialPropertyLib::createIdealGasLaw(), MaterialPropertyLib::createIdealGasLawBinaryMixture(), NumLib::createIterationNumberBasedTimeStepping(), MaterialPropertyLib::createKozenyCarmanModel(), ProcessLib::LargeDeformation::createLargeDeformationProcess(), MaterialPropertyLib::createLinear(), MaterialLib::Fluid::createLinearConcentrationAndPressureDependentDensity(), MaterialLib::Fluid::createLinearConcentrationDependentDensity(), MaterialLib::Fracture::createLinearElasticIsotropic(), MaterialLib::Solids::createLinearElasticIsotropic(), MaterialLib::Solids::createLinearElasticOrthotropic(), MaterialLib::Solids::createLinearElasticTransverseIsotropic(), MaterialLib::Fluid::createLinearPressureDependentViscosity(), MaterialPropertyLib::createLinearSaturationSwellingStress(), MaterialLib::Fluid::createLinearTemperatureDependentDensity(), MaterialPropertyLib::createLinearWaterVapourLatentHeat(), MaterialLib::Fluid::createLiquidDensity(), ProcessLib::LiquidFlow::createLiquidFlowProcess(), MaterialPropertyLib::createLiquidViscosityVogels(), MaterialLib::Solids::Lubby2::createLubby2(), ParameterLib::createMeshElementParameter(), ParameterLib::createMeshNodeParameter(), MaterialLib::Solids::MFront::createMFrontConfig(), ProcessLib::createNeumannBoundaryCondition(), ProcessLib::createNodalSourceTerm(), MaterialLib::PorousMedium::createNonWettingPhaseBrooksCoreyOilGas(), MaterialLib::PorousMedium::createNonWettingPhaseVanGenuchten(), ProcessLib::NormalTractionBoundaryCondition::createNormalTractionBoundaryCondition(), MaterialPropertyLib::createOrthotropicEmbeddedFracturePermeability(), MaterialPropertyLib::createParameterProperty(), MaterialPropertyLib::createPermeabilityMohrCoulombFailureIndexModel(), MaterialPropertyLib::createPermeabilityOrthotropicPowerLaw(), ProcessLib::createPhaseFieldIrreversibleDamageOracleBoundaryCondition(), ProcessLib::PhaseField::createPhaseFieldProcess(), MaterialPropertyLib::createPorosityFromMassBalance(), ProcessLib::createPrimaryVariableConstraintDirichletBoundaryCondition(), ProcessLib::createPythonBoundaryCondition(), ProcessLib::createPythonSourceTerm(), ParameterLib::createRandomFieldMeshElementParameter(), ParameterLib::createRasterParameter(), MaterialLib::PorousMedium::createRelativePermeabilityModel(), MaterialPropertyLib::createRelPermBrooksCorey(), MaterialPropertyLib::createRelPermBrooksCoreyNonwettingPhase(), MaterialPropertyLib::createRelPermGeneralizedPower(), MaterialPropertyLib::createRelPermGeneralizedPowerNonwettingPhase(), MaterialPropertyLib::createRelPermLiakopoulos(), MaterialPropertyLib::createRelPermNonWettingPhaseVanGenuchtenMualem(), MaterialPropertyLib::createRelPermUdell(), MaterialPropertyLib::createRelPermUdellNonwettingPhase(), MaterialPropertyLib::createRelPermVanGenuchten(), ProcessLib::RichardsComponentTransport::createRichardsComponentTransportProcess(), ProcessLib::RichardsFlow::createRichardsFlowProcess(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), ProcessLib::createRobinBoundaryCondition(), MaterialPropertyLib::createSaturationBrooksCorey(), MaterialPropertyLib::createSaturationDependentSwelling(), MaterialPropertyLib::createSaturationDependentThermalConductivity(), MaterialPropertyLib::createSaturationExponential(), MaterialPropertyLib::createSaturationLiakopoulos(), MaterialPropertyLib::createSaturationVanGenuchten(), MaterialPropertyLib::createSaturationVanGenuchtenWithVolumetricStrain(), MaterialPropertyLib::createSaturationWeightedThermalConductivity(), ProcessLib::SmallDeformationNonlocal::createSmallDeformationNonlocalProcess(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::SmallDeformation::createSmallDeformationProcess(), MaterialPropertyLib::createSoilThermalConductivitySomerton(), ProcessLib::createSolutionDependentDirichletBoundaryCondition(), MaterialPropertyLib::createSpecificHeatCapacityWithLatentHeat(), ProcessLib::SteadyStateDiffusion::createSteadyStateDiffusion(), ProcessLib::StokesFlow::createStokesFlowProcess(), MaterialPropertyLib::createStrainDependentPermeability(), MaterialPropertyLib::createTemperatureDependentDiffusion(), MaterialPropertyLib::createTemperatureDependentFraction(), MaterialLib::Fluid::createTemperatureDependentViscosity(), ProcessLib::TES::createTESProcess(), ProcessLib::TH2M::createTH2MProcess(), ProcessLib::ThermalTwoPhaseFlowWithPP::createThermalTwoPhaseFlowWithPPProcess(), ProcessLib::ThermoHydroMechanics::createThermoHydroMechanicsProcess(), ProcessLib::ThermoMechanicalPhaseField::createThermoMechanicalPhaseFieldProcess(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), ProcessLib::ThermoRichardsFlow::createThermoRichardsFlowProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcess(), ParameterLib::createTimeDependentHeterogeneousParameter(), MaterialPropertyLib::createTransportPorosityFromMassBalance(), ProcessLib::TwoPhaseFlowWithPP::createTwoPhaseFlowWithPPProcess(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowWithPrhoProcess(), MaterialLib::PorousMedium::createVanGenuchten(), MaterialPropertyLib::createVapourDiffusionDeVries(), MaterialPropertyLib::createVapourDiffusionFEBEX(), MaterialPropertyLib::createVapourDiffusionPMQ(), ProcessLib::createVariableDependentNeumannBoundaryCondition(), MaterialPropertyLib::createVermaPruessModel(), MaterialLib::Fluid::createViscosityModel(), MaterialPropertyLib::createVolumeFractionAverage(), ProcessLib::createVolumetricSourceTerm(), MaterialPropertyLib::createWaterDensityIAPWSIF97Region1(), MaterialPropertyLib::createWaterEnthalpyIAPWSIF97Region1(), MaterialPropertyLib::createWaterLiquidDensityIAPWSIF97Region4(), MaterialPropertyLib::createWaterLiquidEnthalpyIAPWSIF97Region4(), MaterialPropertyLib::createWaterSaturationTemperatureIAPWSIF97Region4(), MaterialPropertyLib::createWaterTemperatureIAPWSIF97Region1(), MaterialPropertyLib::createWaterThermalConductivityIAPWS(), MaterialPropertyLib::createWaterVapourDensity(), MaterialPropertyLib::createWaterVapourDensityIAPWSIF97Region4(), MaterialPropertyLib::createWaterVapourEnthalpyIAPWSIF97Region4(), MaterialPropertyLib::createWaterVapourLatentHeatWithCriticalTemperature(), MaterialPropertyLib::createWaterViscosityIAPWS(), ProcessLib::createWellboreCompensateNeumannBoundaryCondition(), ProcessLib::WellboreSimulator::createWellboreSimulatorProcess(), MaterialLib::PorousMedium::createWettingPhaseBrooksCoreyOilGas(), and MaterialLib::PorousMedium::createWettingPhaseVanGenuchten().

◆ checkKeyname()

void BaseLib::ConfigTree::checkKeyname ( std::string const & key) const
private

Checks if key complies with the rules [a-z0-9_].

Definition at line 285 of file ConfigTree.cpp.

286{
287 if (key.empty())
288 {
289 error("Search for empty key.");
290 }
291 else if (key_chars_start.find(key.front()) == std::string::npos)
292 {
293 error("Key <" + key + "> starts with an illegal character.");
294 }
295 else if (key.find_first_not_of(key_chars, 1) != std::string::npos)
296 {
297 error("Key <" + key + "> contains illegal characters.");
298 }
299 else if (key.find("__") != std::string::npos)
300 {
301 // This is illegal because we use parameter names to generate doxygen
302 // page names. Thereby "__" acts as a separator character. Choosing
303 // other separators is not possible because of observed limitations
304 // for valid doxygen page names.
305 error("Key <" + key + "> contains double underscore.");
306 }
307}
static const std::string key_chars_start
Set of allowed characters as the first letter of a key name.
Definition ConfigTree.h:679
static const std::string key_chars
Set of allowed characters in a key name.
Definition ConfigTree.h:682

References error(), key_chars, and key_chars_start.

Referenced by ConfigTree(), checkUnique(), checkUniqueAttr(), and peekConfigParameter().

◆ checkUnique()

void BaseLib::ConfigTree::checkUnique ( std::string const & key) const
private

Asserts that the key has not been read yet.

Definition at line 325 of file ConfigTree.cpp.

326{
327 checkKeyname(key);
328
329 if (visited_params_.find({Attr::TAG, key}) != visited_params_.end())
330 {
331 error("Key <" + key + "> has already been processed.");
332 }
333}

References checkKeyname(), error(), and visited_params_.

Referenced by getConfigParameterList(), getConfigParameterOptional(), getConfigSubtreeList(), getConfigSubtreeOptional(), ignoreConfigParameter(), and ignoreConfigParameterAll().

◆ checkUniqueAttr()

void BaseLib::ConfigTree::checkUniqueAttr ( std::string const & attr) const
private

Asserts that the attribute attr has not been read yet.

Definition at line 335 of file ConfigTree.cpp.

336{
337 // Workaround for handling attributes with xml namespaces and uppercase
338 // letters.
339 if (attr.find(':') != std::string::npos)
340 {
341 auto pos = decltype(std::string::npos){0};
342
343 // Replace colon and uppercase letters with an allowed character 'a'.
344 // That means, attributes containing a colon are also allowed to contain
345 // uppercase letters.
346 auto attr2 = attr;
347 do
348 {
349 pos = attr2.find_first_of(":ABCDEFGHIJKLMNOPQRSTUVWXYZ", pos);
350 if (pos != std::string::npos)
351 {
352 attr2[pos] = 'a';
353 }
354 } while (pos != std::string::npos);
355
356 checkKeyname(attr2);
357 }
358 else
359 {
360 checkKeyname(attr);
361 }
362
363 if (visited_params_.find({Attr::ATTR, attr}) != visited_params_.end())
364 {
365 error("Attribute '" + attr + "' has already been processed.");
366 }
367}

References checkKeyname(), error(), and visited_params_.

Referenced by getConfigAttributeOptional(), and ignoreConfigAttribute().

◆ error()

void BaseLib::ConfigTree::error ( std::string const & message) const
private

Called if an error occurs. Will call the error callback.

This method only acts as a helper method and throws std::runtime_error.

Definition at line 228 of file ConfigTree.cpp.

229{
230 onerror_(filename_, path_, message);
231 OGS_FATAL(
232 "ConfigTree: The error handler does not break out of the normal "
233 "control flow.");
234}

References filename_, OGS_FATAL, onerror_, and path_.

Referenced by checkConfigParameter(), checkKeyname(), checkUnique(), checkUniqueAttr(), getConfigAttribute(), getConfigAttributeOptional(), getConfigParameter(), getConfigParameter(), getConfigParameterOptional(), getConfigParameterOptionalImpl(), getConfigSubtree(), getValue(), joinPaths(), markVisited(), BaseLib::ConfigTree::ParameterIterator::operator*(), and peekConfigParameter().

◆ getConfigAttribute() [1/2]

template<typename T >
T BaseLib::ConfigTree::getConfigAttribute ( std::string const & attr) const

Get XML attribute attr of type T for the current parameter.

Returns
the requested attribute's value.
Precondition
attr must not have been read before from the current parameter.

Definition at line 167 of file ConfigTree-impl.h.

168{
169 if (auto a = getConfigAttributeOptional<T>(attr))
170 {
171 return *a;
172 }
173
174 error("Did not find XML attribute with name '" + attr + "'.");
175}

References error().

Referenced by ParameterLib::confirmThirdBaseExplicit(), ChemistryLib::PhreeqcIOData::createAqueousSolution(), ParameterLib::createCoordinateSystemWithImplicitBase(), and MaterialLib::PorousMedium::createPorousMediaProperties().

◆ getConfigAttribute() [2/2]

template<typename T >
T BaseLib::ConfigTree::getConfigAttribute ( std::string const & attr,
T const & default_value ) const

Get XML attribute attr of type T for the current parameter or the default_value.

This method has a similar behaviour as getConfigAttribute(std::string const&) except the default_value is returned if the attribute has not been found.

Returns
the requested attribute's value.
Precondition
attr must not have been read before from the current parameter.

Definition at line 178 of file ConfigTree-impl.h.

180{
181 if (auto a = getConfigAttributeOptional<T>(attr))
182 {
183 return *a;
184 }
185
186 return default_value;
187}

◆ getConfigAttributeOptional()

template<typename T >
std::optional< T > BaseLib::ConfigTree::getConfigAttributeOptional ( std::string const & attr) const

Get XML attribute attr of type T for the current parameter if present.

Returns
the requested attribute's value.
Precondition
attr must not have been read before from the current parameter.

Definition at line 190 of file ConfigTree-impl.h.

192{
193 checkUniqueAttr(attr);
194 auto& ct = markVisited<T>(attr, Attr::ATTR, true);
195
196 if (auto attrs = tree_->get_child_optional("<xmlattr>"))
197 {
198 if (auto a = attrs->get_child_optional(attr))
199 {
200 ++ct.count; // count only if attribute has been found
201 if (auto v = a->get_value_optional<T>())
202 {
203 return std::make_optional(*v);
204 }
205 error("Value for XML attribute '" + attr + "' `" +
206 shortString(a->data()) +
207 "' not convertible to the desired type.");
208 }
209 }
210
211 return std::nullopt;
212}
void checkUniqueAttr(std::string const &attr) const
Asserts that the attribute attr has not been read yet.

References ATTR, checkUniqueAttr(), error(), shortString(), and tree_.

Referenced by ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowPrhoMaterialProperties(), parseOutputMeshConfig(), and anonymous_namespace{ProjectData.cpp}::readSingleMesh().

◆ getConfigParameter() [1/3]

template<typename T >
T BaseLib::ConfigTree::getConfigParameter ( std::string const & param) const

Get parameter param of type T from the configuration tree.

Returns
the value looked for.
Precondition
param must not have been read before from this ConfigTree.

Definition at line 41 of file ConfigTree-impl.h.

42{
43 if (auto p = getConfigParameterOptional<T>(param))
44 {
45 return *p;
46 }
47
48 error("Key <" + param + "> has not been found");
49}

References error().

Referenced by ChemistryLib::PhreeqcIOData::createAqueousSolution(), ChemistryLib::PhreeqcKernelData::createAqueousSolution(), MaterialPropertyLib::createBishopsPowerLaw(), MaterialPropertyLib::createBishopsSaturationCutoff(), ProcessLib::HeatTransportBHE::BHE::createBoreholeGeometry(), MaterialLib::PorousMedium::createBrooksCorey(), MaterialPropertyLib::createCapillaryPressureRegularizedVanGenuchten(), MaterialPropertyLib::createCapillaryPressureVanGenuchten(), ChemistryLib::createChemicalSolverInterface< ChemicalSolver::Phreeqc >(), MaterialPropertyLib::createClausiusClapeyron(), MaterialLib::Fracture::CohesiveZoneModeI::createCohesiveZoneModeI(), ProcessLib::createCompareJacobiansJacobianAssembler(), anonymous_namespace{CreateComponent.cpp}::createComponent(), ProcessLib::ComponentTransport::createComponentTransportProcess(), MaterialPropertyLib::createConstant(), ParameterLib::createConstantParameter(), MaterialLib::Fracture::Permeability::createConstantPermeability(), ProcessLib::createConstraintDirichletBoundaryCondition(), NumLib::createConvergenceCriterionDeltaX(), NumLib::createConvergenceCriterionPerComponentDeltaX(), NumLib::createConvergenceCriterionPerComponentResidual(), NumLib::createConvergenceCriterionResidual(), MaterialLib::Fracture::createCoulomb(), MaterialPropertyLib::createCubicLawPermeability(), MaterialPropertyLib::createCurve(), ParameterLib::createCurveScaledParameter(), ProcessLib::createDeactivatedSubdomain(), ProcessLib::createDirichletBoundaryCondition(), ProcessLib::createDirichletBoundaryConditionWithinTimeInterval(), MaterialPropertyLib::createDupuitPermeability(), MaterialLib::Solids::Ehlers::createEhlers(), MaterialPropertyLib::createEmbeddedFracturePermeability(), NumLib::createEvolutionaryPIDcontroller(), MaterialPropertyLib::createExponential(), NumLib::createFixedTimeStepping(), ProcessLib::HeatTransportBHE::BHE::createFlowAndTemperatureControl(), MaterialLib::Fluid::createFluidDensityModel(), MaterialLib::Fluid::createFluidThermalConductivityModel(), MaterialPropertyLib::createGasPressureDependentPermeability(), ParameterLib::createGroupBasedParameter(), ProcessLib::HeatTransportBHE::BHE::createGroutParameters(), ProcessLib::createHCNonAdvectiveFreeComponentFlowBoundaryCondition(), ProcessLib::HeatConduction::createHeatConductionProcess(), ProcessLib::HeatTransportBHE::createHeatTransportBHEProcess(), ProcessLib::HT::createHTProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::HydroMechanics::createHydroMechanicsProcess(), NumLib::createIterationNumberBasedTimeStepping(), ChemistryLib::PhreeqcIOData::createKnobs(), MaterialPropertyLib::createKozenyCarmanModel(), ProcessLib::LargeDeformation::createLargeDeformationProcess(), MaterialPropertyLib::createLinear(), MaterialLib::Fluid::createLinearConcentrationAndPressureDependentDensity(), MaterialLib::Fluid::createLinearConcentrationDependentDensity(), MaterialLib::Fracture::createLinearElasticIsotropic(), MaterialLib::Fluid::createLinearPressureDependentViscosity(), MaterialPropertyLib::createLinearSaturationSwellingStress(), MaterialLib::Fluid::createLinearTemperatureDependentDensity(), MaterialLib::Fluid::createLiquidDensity(), ProcessLib::LiquidFlow::createLiquidFlowProcess(), ParameterLib::createMeshElementParameter(), ParameterLib::createMeshNodeParameter(), MaterialLib::Solids::MFront::createMFrontConfig(), ProcessLib::createNeumannBoundaryCondition(), NumLib::createNewtonRaphsonSolverParameters(), ProcessLib::createNodalSourceTerm(), NumLib::createNonlinearSolver(), MaterialLib::PorousMedium::createNonWettingPhaseBrooksCoreyOilGas(), MaterialLib::PorousMedium::createNonWettingPhaseVanGenuchten(), ProcessLib::NormalTractionBoundaryCondition::createNormalTractionBoundaryCondition(), MaterialPropertyLib::createOrthotropicEmbeddedFracturePermeability(), ProcessLib::createOutputConfig(), ParameterLib::createParameter(), MaterialPropertyLib::createParameterProperty(), MaterialLib::PorousMedium::createPermeabilityModel(), MaterialPropertyLib::createPermeabilityMohrCoulombFailureIndexModel(), MaterialPropertyLib::createPermeabilityOrthotropicPowerLaw(), anonymous_namespace{CreatePhase.cpp}::createPhase(), ProcessLib::PhaseField::createPhaseFieldProcess(), ProcessLib::HeatTransportBHE::BHE::createPipe(), MaterialPropertyLib::createPorosityFromMassBalance(), ProcessLib::createPrimaryVariableConstraintDirichletBoundaryCondition(), ProcessLib::createPythonBoundaryCondition(), ProcessLib::createPythonSourceTerm(), ParameterLib::createRandomFieldMeshElementParameter(), ProcessLib::HeatTransportBHE::BHE::createRefrigerantProperties(), MaterialPropertyLib::createRelPermBrooksCorey(), MaterialPropertyLib::createRelPermBrooksCoreyNonwettingPhase(), MaterialPropertyLib::createRelPermGeneralizedPower(), MaterialPropertyLib::createRelPermGeneralizedPowerNonwettingPhase(), MaterialPropertyLib::createRelPermNonWettingPhaseVanGenuchtenMualem(), MaterialPropertyLib::createRelPermUdell(), MaterialPropertyLib::createRelPermUdellNonwettingPhase(), MaterialPropertyLib::createRelPermVanGenuchten(), ProcessLib::WellboreSimulator::createReservoirProperties(), ProcessLib::RichardsComponentTransport::createRichardsComponentTransportProcess(), ProcessLib::RichardsFlow::createRichardsFlowProcess(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), ProcessLib::createRobinBoundaryCondition(), MaterialPropertyLib::createSaturationBrooksCorey(), MaterialPropertyLib::createSaturationDependentSwelling(), MaterialPropertyLib::createSaturationExponential(), MaterialPropertyLib::createSaturationVanGenuchten(), MaterialPropertyLib::createSaturationVanGenuchtenWithVolumetricStrain(), MaterialPropertyLib::createSaturationWeightedThermalConductivity(), ProcessLib::SmallDeformationNonlocal::createSmallDeformationNonlocalProcess(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::SmallDeformation::createSmallDeformationProcess(), ProcessLib::createSolutionDependentDirichletBoundaryCondition(), MaterialLib::Fluid::createSpecificFluidHeatCapacityModel(), MaterialPropertyLib::createSpecificHeatCapacityWithLatentHeat(), ProcessLib::StokesFlow::createStokesFlowProcess(), MaterialPropertyLib::createStrainDependentPermeability(), ProcessLib::SurfaceFluxData::createSurfaceFluxData(), MaterialPropertyLib::createTemperatureDependentDiffusion(), MaterialPropertyLib::createTemperatureDependentFraction(), MaterialLib::Fluid::createTemperatureDependentViscosity(), ProcessLib::TH2M::createTH2MProcess(), ProcessLib::ThermalTwoPhaseFlowWithPP::createThermalTwoPhaseFlowWithPPProcess(), ProcessLib::ThermoHydroMechanics::createThermoHydroMechanicsProcess(), ProcessLib::ThermoMechanicalPhaseField::createThermoMechanicalPhaseFieldProcess(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), ProcessLib::ThermoRichardsFlow::createThermoRichardsFlowProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcessStage2(), NumLib::createTimeDiscretization(), BaseLib::createTimeInterval(), MaterialPropertyLib::createTransportPorosityFromMassBalance(), ProcessLib::TwoPhaseFlowWithPP::createTwoPhaseFlowWithPPProcess(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowWithPrhoProcess(), MaterialLib::PorousMedium::createVanGenuchten(), MaterialPropertyLib::createVapourDiffusionDeVries(), MaterialPropertyLib::createVapourDiffusionFEBEX(), MaterialPropertyLib::createVapourDiffusionPMQ(), ProcessLib::createVariableDependentNeumannBoundaryCondition(), MaterialPropertyLib::createVermaPruessModel(), MaterialLib::Fluid::createViscosityModel(), ProcessLib::createVolumetricSourceTerm(), ProcessLib::createWellboreCompensateNeumannBoundaryCondition(), ProcessLib::WellboreSimulator::createWellboreGeometry(), ProcessLib::WellboreSimulator::createWellboreSimulatorProcess(), MaterialLib::PorousMedium::createWettingPhaseBrooksCoreyOilGas(), MaterialLib::PorousMedium::createWettingPhaseVanGenuchten(), anonymous_namespace{ProcessVariable.cpp}::findMeshInConfig(), ParameterLib::findParameter(), ProcessLib::findProcessVariable(), Adsorption::Reaction::newInstance(), ProcessLib::HeatTransportBHE::BHE::parseBHE1PTypeConfig(), ProcessLib::HeatTransportBHE::BHE::parseBHECoaxialConfig(), ProcessLib::HeatTransportBHE::BHE::parseBHEUTypeConfig(), ProcessLib::parseLineSegment(), MathLib::parsePiecewiseLinearCurveConfig(), anonymous_namespace{ProjectData.cpp}::readMeshes(), and GeoLib::IO::readRaster().

◆ getConfigParameter() [2/3]

template<typename T >
T BaseLib::ConfigTree::getConfigParameter ( std::string const & param,
T const & default_value ) const

Get parameter param of type T from the configuration tree or the default_value.

This method has a similar behaviour as getConfigParameter(std::string const&) except the default_value is returned if the attribute has not been found.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 52 of file ConfigTree-impl.h.

54{
55 if (auto p = getConfigParameterOptional<T>(param))
56 {
57 return *p;
58 }
59
60 return default_value;
61}

◆ getConfigParameter() [3/3]

ConfigTree BaseLib::ConfigTree::getConfigParameter ( std::string const & root) const

Get parameter param from the configuration tree.

Returns
the subtree representing the requested parameter
Precondition
param must not have been read before from this ConfigTree.

Definition at line 118 of file ConfigTree.cpp.

119{
120 auto ct = getConfigSubtree(param);
121 if (ct.hasChildren())
122 {
123 error("Requested parameter <" + param + "> actually is a subtree.");
124 }
125 return ct;
126}
ConfigTree getConfigSubtree(std::string const &root) const

References error(), and getConfigSubtree().

◆ getConfigParameterList() [1/2]

template<typename T >
Range< ConfigTree::ValueIterator< T > > BaseLib::ConfigTree::getConfigParameterList ( std::string const & param) const

Fetches all parameters with name param from the current level of the tree.

The return value is suitable to be used with range-base for-loops.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 114 of file ConfigTree-impl.h.

116{
117 checkUnique(param);
118 markVisited<T>(param, Attr::TAG, true);
119
120 auto p = tree_->equal_range(param);
121 return Range<ValueIterator<T>>(ValueIterator<T>(p.first, param, *this),
122 ValueIterator<T>(p.second, param, *this));
123}
void checkUnique(std::string const &key) const
Asserts that the key has not been read yet.

References checkUnique(), TAG, and tree_.

Referenced by ProcessLib::HeatTransportBHE::createHeatTransportBHEProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::findProcessVariables(), and GeoLib::IO::BoostXmlGmlInterface::readPoints().

◆ getConfigParameterList() [2/2]

Range< ConfigTree::ParameterIterator > BaseLib::ConfigTree::getConfigParameterList ( std::string const & param) const

Fetches all parameters with name param from the current level of the tree.

The return value is suitable to be used with range-base for-loops.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 139 of file ConfigTree.cpp.

141{
142 checkUnique(param);
143 markVisited(param, Attr::TAG, true);
144
145 auto p = tree_->equal_range(param);
146
147 return Range<ParameterIterator>(ParameterIterator(p.first, param, *this),
148 ParameterIterator(p.second, param, *this));
149}
CountType & markVisited(std::string const &key, Attr const is_attr, bool peek_only) const

References checkUnique(), markVisited(), TAG, and tree_.

◆ getConfigParameterOptional() [1/2]

template<typename T >
std::optional< T > BaseLib::ConfigTree::getConfigParameterOptional ( std::string const & param) const

Get parameter param of type T from the configuration tree if present

This method has a similar behaviour as getConfigParameter(std::string const&) except no errors are raised. Rather it can be told from the return value if the parameter could be read.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 64 of file ConfigTree-impl.h.

66{
67 checkUnique(param);
68
69 return getConfigParameterOptionalImpl(param, static_cast<T*>(nullptr));
70}
std::optional< T > getConfigParameterOptionalImpl(std::string const &param, T *) const
Default implementation of reading a value of type T.

References checkUnique(), and getConfigParameterOptionalImpl().

Referenced by MathLib::ODE::CVodeSolverImpl::CVodeSolverImpl(), ProjectData::ProjectData(), ProcessLib::TES::TESProcess::TESProcess(), MaterialLib::PorousMedium::createBrooksCorey(), ProcessLib::createCentralDifferencesJacobianAssembler(), ChemistryLib::createChargeBalance(), ProcessLib::ComponentTransport::createComponentTransportProcess(), ParameterLib::createConstantParameter(), NumLib::createConvergenceCriterionDeltaX(), NumLib::createConvergenceCriterionPerComponentDeltaX(), NumLib::createConvergenceCriterionPerComponentResidual(), NumLib::createConvergenceCriterionResidual(), ProcessLib::createDeactivatedSubdomain(), ProcessLib::ThermoRichardsFlow::createElasticityModel(), MaterialPropertyLib::createEmbeddedFracturePermeability(), ProcessLib::createForwardDifferencesJacobianAssembler(), ProcessLib::HT::createHTProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), NumLib::createNewtonRaphsonSolverParameters(), ProcessLib::PhaseField::createPhaseFieldProcess(), ProcessLib::RichardsComponentTransport::createRichardsComponentTransportProcess(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), MaterialPropertyLib::createSaturationVanGenuchten(), ProcessLib::SmallDeformation::createSmallDeformationProcess(), ProcessLib::TH2M::createTH2MProcess(), ProcessLib::ThermoHydroMechanics::createThermoHydroMechanicsProcess(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), ProcessLib::ThermoRichardsFlow::createThermoRichardsFlowProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcessStage2(), MaterialLib::PorousMedium::createVanGenuchten(), anonymous_namespace{ProcessVariable.cpp}::findMeshInConfig(), ParameterLib::findOptionalTagParameter(), MathLib::LinearSolverOptionsParser< EigenLisLinearSolver >::parseNameAndOptions(), and anonymous_namespace{ProjectData.cpp}::readMeshes().

◆ getConfigParameterOptional() [2/2]

std::optional< ConfigTree > BaseLib::ConfigTree::getConfigParameterOptional ( std::string const & param) const

Get parameter param from the configuration tree if present.

Returns
the subtree representing the requested parameter
Precondition
param must not have been read before from this ConfigTree.

Definition at line 128 of file ConfigTree.cpp.

130{
131 auto ct = getConfigSubtreeOptional(param);
132 if (ct && ct->hasChildren())
133 {
134 error("Requested parameter <" + param + "> actually is a subtree.");
135 }
136 return ct;
137}
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const

References error(), and getConfigSubtreeOptional().

◆ getConfigParameterOptionalImpl() [1/2]

template<typename T >
std::optional< std::vector< T > > BaseLib::ConfigTree::getConfigParameterOptionalImpl ( std::string const & param,
std::vector< T > *  ) const
private

Implementation of reading a vector of values of type T.

Definition at line 85 of file ConfigTree-impl.h.

87{
88 if (auto p = getConfigSubtreeOptional(param))
89 {
90 std::istringstream sstr{p->getValue<std::string>()};
91 std::vector<T> result;
92 T value;
93 while (sstr >> value)
94 {
95 result.push_back(value);
96 }
97 if (!sstr.eof()) // The stream is not read until the end, must be an
98 // error. result contains number of read values.
99 {
100 error("Value for key <" + param + "> `" + shortString(sstr.str()) +
101 "' not convertible to a vector of the desired type."
102 " Could not convert token no. " +
103 std::to_string(result.size() + 1) + ".");
104 return std::nullopt;
105 }
106
107 return std::make_optional(result);
108 }
109
110 return std::nullopt;
111}

References error(), getConfigSubtreeOptional(), and shortString().

◆ getConfigParameterOptionalImpl() [2/2]

template<typename T >
std::optional< T > BaseLib::ConfigTree::getConfigParameterOptionalImpl ( std::string const & param,
T *  ) const
private

Default implementation of reading a value of type T.

Definition at line 73 of file ConfigTree-impl.h.

75{
76 if (auto p = getConfigSubtreeOptional(param))
77 {
78 return p->getValue<T>();
79 }
80
81 return std::nullopt;
82}

References getConfigSubtreeOptional().

Referenced by getConfigParameterOptional().

◆ getConfigSubtree()

ConfigTree BaseLib::ConfigTree::getConfigSubtree ( std::string const & root) const

Get the subtree rooted at root

If root is not found error() is called.

Precondition
root must not have been read before from this ConfigTree.

Definition at line 162 of file ConfigTree.cpp.

163{
164 if (auto t = getConfigSubtreeOptional(root))
165 {
166 return std::move(*t);
167 }
168 error("Key <" + root + "> has not been found.");
169}

References error(), and getConfigSubtreeOptional().

Referenced by ProjectData::ProjectData(), ProcessLib::TES::TESProcess::TESProcess(), MaterialLib::PorousMedium::createCapillaryPressureModel(), ChemistryLib::PhreeqcIOData::createChemicalSystem(), ProcessLib::createCompareJacobiansJacobianAssembler(), ProcessLib::ComponentTransport::createComponentTransportProcess(), ParameterLib::createCoordinateSystemWithImplicitBase(), MaterialLib::Fracture::createCoulomb(), MaterialLib::Solids::Creep::createCreepBGRa(), MaterialLib::Solids::Ehlers::createEhlers(), MaterialPropertyLib::createExponential(), NumLib::createFixedTimeStepping(), MaterialLib::Fluid::createFluidProperties(), MaterialPropertyLib::createFunction(), ProcessLib::HeatConduction::createHeatConductionProcess(), ProcessLib::HeatTransportBHE::createHeatTransportBHEProcess(), ProcessLib::HT::createHTProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::HydroMechanics::createHydroMechanicsProcess(), ChemistryLib::PhreeqcKernelData::createInitialAqueousSolution(), ProcessLib::LargeDeformation::createLargeDeformationProcess(), ProcessLib::LiquidFlow::createLiquidFlowProcess(), MaterialLib::Solids::Lubby2::createLubby2(), ProcessLib::createOutputConfig(), ProcessLib::PhaseField::createPhaseFieldProcess(), MaterialLib::PorousMedium::createPorousMediaProperties(), MaterialLib::PorousMedium::createRelativePermeabilityModel(), ProcessLib::RichardsComponentTransport::createRichardsComponentTransportProcess(), ProcessLib::RichardsFlow::createRichardsFlowProcess(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), ProcessLib::SmallDeformationNonlocal::createSmallDeformationNonlocalProcess(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::SmallDeformation::createSmallDeformationProcess(), ChemistryLib::PhreeqcIOData::createSolutionComponents(), ProcessLib::SteadyStateDiffusion::createSteadyStateDiffusion(), ProcessLib::StokesFlow::createStokesFlowProcess(), ProcessLib::TES::createTESProcess(), ProcessLib::TH2M::createTH2MProcess(), ProcessLib::ThermalTwoPhaseFlowWithPP::createThermalTwoPhaseFlowWithPPProcess(), ProcessLib::ThermoHydroMechanics::createThermoHydroMechanicsProcess(), ProcessLib::ThermoMechanicalPhaseField::createThermoMechanicalPhaseFieldProcess(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), ProcessLib::ThermoRichardsFlow::createThermoRichardsFlowProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcessStage2(), ParameterLib::createTimeDependentHeterogeneousParameter(), BaseLib::createTimeInterval(), ProcessLib::createTimeLoop(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowPrhoMaterialProperties(), ProcessLib::TwoPhaseFlowWithPP::createTwoPhaseFlowWithPPProcess(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowWithPrhoProcess(), ProcessLib::WellboreSimulator::createWellboreSimulatorProcess(), getConfigParameter(), ProcessLib::HeatTransportBHE::BHE::parseBHE1PTypeConfig(), ProcessLib::HeatTransportBHE::BHE::parseBHECoaxialConfig(), ProcessLib::HeatTransportBHE::BHE::parseBHEUTypeConfig(), and anonymous_namespace{CreateMFrontGeneric.cpp}::readMaterialProperties().

◆ getConfigSubtreeList()

Range< ConfigTree::SubtreeIterator > BaseLib::ConfigTree::getConfigSubtreeList ( std::string const & root) const

◆ getConfigSubtreeOptional()

std::optional< ConfigTree > BaseLib::ConfigTree::getConfigSubtreeOptional ( std::string const & root) const

Get the subtree rooted at root if present

Precondition
root must not have been read before from this ConfigTree.

Definition at line 171 of file ConfigTree.cpp.

173{
174 checkUnique(root);
175
176 if (auto subtree = tree_->get_child_optional(root))
177 {
178 markVisited(root, Attr::TAG, false);
179 return ConfigTree(*subtree, *this, root);
180 }
181 markVisited(root, Attr::TAG, true);
182 return std::nullopt;
183}
ConfigTree(PTree &&top_level_tree, std::string filename, Callback error_cb, Callback warning_cb)

References ConfigTree(), checkUnique(), markVisited(), TAG, and tree_.

Referenced by ProcessLib::ProcessVariable::ProcessVariable(), ProjectData::ProjectData(), ParameterLib::checkThirdBaseExistanceFor2D(), ChemistryLib::PhreeqcIOData::createChemicalSystem(), anonymous_namespace{CreateComponent.cpp}::createComponent(), ProcessLib::ComponentTransport::createComponentTransportProcess(), MaterialLib::Solids::createConstitutiveRelationIce(), ParameterLib::createCoordinateSystemWithImplicitBase(), ProcessLib::createDeactivatedSubdomain(), ProcessLib::createDeactivatedSubdomains(), MaterialLib::Solids::Ehlers::createEhlers(), MaterialLib::Fluid::createFluidProperties(), ProcessLib::HT::createHTProcess(), ProcessLib::LIE::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::HydroMechanics::createHydroMechanicsProcess(), ProcessLib::createInitialStress(), ProcessLib::LiquidFlow::createLiquidFlowProcess(), MaterialPropertyLib::createMedium(), MaterialLib::Solids::MFront::createMFrontConfig(), NumLib::createNumericalStabilization(), ProcessLib::createOutputConfig(), anonymous_namespace{CreatePhase.cpp}::createPhase(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), MeshGeoToolsLib::createSearchLengthAlgorithm(), ProcessLib::createSecondaryVariables(), ProcessLib::SteadyStateDiffusion::createSteadyStateDiffusion(), ProcessLib::createTimeLoop(), getConfigParameterOptional(), getConfigParameterOptionalImpl(), getConfigParameterOptionalImpl(), getConfigSubtree(), NumLib::parseCoupling(), MathLib::LinearSolverOptionsParser< EigenLinearSolver >::parseNameAndOptions(), MathLib::LinearSolverOptionsParser< PETScLinearSolver >::parseNameAndOptions(), anonymous_namespace{ProjectData.cpp}::readMeshes(), anonymous_namespace{ProjectData.cpp}::readRasters(), and anonymous_namespace{CreateMFrontGeneric.cpp}::readStateVariablesInitialValueProperties().

◆ getProjectFileName()

std::string const & BaseLib::ConfigTree::getProjectFileName ( ) const
inline

Used to get the project file name.

Definition at line 303 of file ConfigTree.h.

303{ return filename_; }

References filename_.

◆ getValue()

template<typename T >
T BaseLib::ConfigTree::getValue ( ) const

Get the plain data contained in the current level of the tree.

Returns
the data converted to the type T
Precondition
The data must not have been read before.

Definition at line 149 of file ConfigTree-impl.h.

150{
151 if (have_read_data_)
152 {
153 error("The data of this subtree has already been read.");
154 }
155
156 have_read_data_ = true;
157
158 if (auto v = tree_->get_value_optional<T>())
159 {
160 return *v;
161 }
162 error("Value `" + shortString(tree_->data()) +
163 "' is not convertible to the desired type.");
164}

References error(), have_read_data_, shortString(), and tree_.

Referenced by ChemistryLib::PhreeqcKernelData::createInitialAqueousSolution(), ChemistryLib::PhreeqcIOData::createSolutionComponents(), ParameterLib::parseBase1OrBase2(), parseOutputMeshConfig(), and anonymous_namespace{ProjectData.cpp}::readSingleMesh().

◆ hasChildren()

bool BaseLib::ConfigTree::hasChildren ( ) const
private

Checks if this tree has any children.

Definition at line 391 of file ConfigTree.cpp.

392{
393 auto const& tree = *tree_;
394 if (tree.begin() == tree.end())
395 {
396 return false; // no children
397 }
398 if (tree.front().first == "<xmlattr>" && (++tree.begin()) == tree.end())
399 {
400 return false; // only attributes
401 }
402
403 return true;
404}

References tree_.

◆ ignoreConfigAttribute()

void BaseLib::ConfigTree::ignoreConfigAttribute ( std::string const & attr) const

Tell this instance to ignore the XML attribute attr.

This method is used to avoid warning messages.

Precondition
attr must not have been read before from this ConfigTree.

Definition at line 205 of file ConfigTree.cpp.

206{
207 checkUniqueAttr(attr);
208
209 // Exercise: Guess what not! (hint: if not found, peek only)
210 // Btw. (not a hint) tree_->find() does not seem to work here.
211 bool peek_only = !tree_->get_child_optional("<xmlattr>." + attr);
212
213 markVisited(attr, Attr::ATTR, peek_only);
214}

References ATTR, checkUniqueAttr(), markVisited(), and tree_.

◆ ignoreConfigParameter()

void BaseLib::ConfigTree::ignoreConfigParameter ( std::string const & param) const

Tell this instance to ignore parameter param.

This method is used to avoid warning messages.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 197 of file ConfigTree.cpp.

198{
199 checkUnique(param);
200 // if not found, peek only
201 bool peek_only = tree_->find(param) == tree_->not_found();
202 markVisited(param, Attr::TAG, peek_only);
203}

References checkUnique(), markVisited(), TAG, and tree_.

Referenced by NumLib::createTimeStepper(), and MathLib::ignoreOtherLinearSolvers().

◆ ignoreConfigParameterAll()

void BaseLib::ConfigTree::ignoreConfigParameterAll ( std::string const & param) const

Tell this instance to ignore all parameters param on the current level of the tree.

This method is used to avoid warning messages.

Precondition
param must not have been read before from this ConfigTree.

Definition at line 216 of file ConfigTree.cpp.

217{
218 checkUnique(param);
219 auto& ct = markVisited(param, Attr::TAG, true);
220
221 auto p = tree_->equal_range(param);
222 for (auto it = p.first; it != p.second; ++it)
223 {
224 ++ct.count;
225 }
226}

References checkUnique(), markVisited(), TAG, and tree_.

◆ joinPaths()

std::string BaseLib::ConfigTree::joinPaths ( std::string const & p1,
std::string const & p2 ) const
private

Used to generate the path of a subtree.

Definition at line 309 of file ConfigTree.cpp.

311{
312 if (p2.empty())
313 {
314 error("Second path to be joined is empty.");
315 }
316
317 if (p1.empty())
318 {
319 return p2;
320 }
321
322 return p1 + pathseparator + p2;
323}
static const char pathseparator
Character separating two path components.
Definition ConfigTree.h:676

References error(), and pathseparator.

◆ markVisited() [1/2]

ConfigTree::CountType & BaseLib::ConfigTree::markVisited ( std::string const & key,
Attr const is_attr,
bool const peek_only ) const
private

Keeps track of the key key and its value type ConfigTree.

This method asserts that a key is read always with the same type.

param peek_only if true, do not change the read-count of the given key.

Definition at line 369 of file ConfigTree.cpp.

372{
373 return markVisited<ConfigTree>(key, is_attr, peek_only);
374}

◆ markVisited() [2/2]

template<typename T >
ConfigTree::CountType & BaseLib::ConfigTree::markVisited ( std::string const & key,
Attr const is_attr,
bool peek_only ) const
private

Keeps track of the key key and its value type T.

This method asserts that a key is read always with the same type.

param peek_only if true, do not change the read-count of the given key.

Definition at line 215 of file ConfigTree-impl.h.

218{
219 auto const type = std::type_index(typeid(T));
220
221 auto p = visited_params_.emplace(std::make_pair(is_attr, key),
222 CountType{peek_only ? 0 : 1, type});
223
224 if (!p.second)
225 { // no insertion happened
226 auto& v = p.first->second;
227 if (v.type == type)
228 {
229 if (!peek_only)
230 {
231 ++v.count;
232 }
233 }
234 else
235 {
236 error("There already was an attempt to obtain key <" + key +
237 "> with type '" + v.type.name() + "' (now: '" + type.name() +
238 "').");
239 }
240 }
241
242 return p.first->second;
243}

References error(), and visited_params_.

Referenced by getConfigParameterList(), getConfigSubtreeList(), getConfigSubtreeOptional(), ignoreConfigAttribute(), ignoreConfigParameter(), ignoreConfigParameterAll(), BaseLib::ConfigTree::SubtreeIterator::operator*(), and BaseLib::ConfigTree::ValueIterator< ValueType >::operator*().

◆ markVisitedDecrement()

void BaseLib::ConfigTree::markVisitedDecrement ( Attr const is_attr,
std::string const & key ) const
private

Used in the destructor to compute the difference between number of reads of a parameter and the number of times it exists in the ConfigTree

Definition at line 376 of file ConfigTree.cpp.

378{
379 auto const type = std::type_index(typeid(nullptr));
380
381 auto p = visited_params_.emplace(std::make_pair(is_attr, key),
382 CountType{-1, type});
383
384 if (!p.second)
385 { // no insertion happened
386 auto& v = p.first->second;
387 --v.count;
388 }
389}

References visited_params_.

Referenced by checkAndInvalidate().

◆ onerror()

void BaseLib::ConfigTree::onerror ( std::string const & filename,
std::string const & path,
std::string const & message )
static

Default error callback function Will throw std::runtime_error

Definition at line 241 of file ConfigTree.cpp.

243{
244 OGS_FATAL("ConfigTree: In file `{:s}' at path <{:s}>: {:s}", filename, path,
245 message);
246}

References OGS_FATAL.

Referenced by BaseLib::makeConfigTree().

◆ onwarning()

void BaseLib::ConfigTree::onwarning ( std::string const & filename,
std::string const & path,
std::string const & message )
static

Default warning callback function Will print a warning message

Definition at line 248 of file ConfigTree.cpp.

250{
251 WARN("ConfigTree: In file `{:s}' at path <{:s}>: {:s}", filename, path,
252 message);
253}
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40

References WARN().

Referenced by BaseLib::makeConfigTree().

◆ operator=() [1/2]

ConfigTree & BaseLib::ConfigTree::operator= ( ConfigTree && other)

After being moved from, other is in an undefined state and must not be used anymore!

Definition at line 101 of file ConfigTree.cpp.

102{
104
105 top_level_tree_ = std::move(other.top_level_tree_);
106 tree_ = other.tree_;
107 other.tree_ = nullptr;
108 path_ = std::move(other.path_);
109 filename_ = std::move(other.filename_);
110 visited_params_ = std::move(other.visited_params_);
111 have_read_data_ = other.have_read_data_;
112 onerror_ = std::move(other.onerror_);
113 onwarning_ = std::move(other.onwarning_);
114
115 return *this;
116}

References checkAndInvalidate(), filename_, have_read_data_, onerror_, onwarning_, path_, top_level_tree_, tree_, and visited_params_.

◆ operator=() [2/2]

ConfigTree & BaseLib::ConfigTree::operator= ( ConfigTree const & )
delete

copying is not compatible with the semantics of this class

◆ peekConfigParameter()

template<typename T >
T BaseLib::ConfigTree::peekConfigParameter ( std::string const & param) const

Peek at a parameter param of type T from the configuration tree.

This method is an exception to the single-read rule. It is meant to be used to tell from a ConfigTree instance where to pass that instance on for further processing.

But in order that the requested parameter counts as "completely parsed", it has to be read through some other method, too.

Return value and error behaviour are the same as for getConfigParameter<T>(std::string const&).

Definition at line 126 of file ConfigTree-impl.h.

127{
128 checkKeyname(param);
129
130 if (auto p = tree_->get_child_optional(param))
131 {
132 try
133 {
134 return p->get_value<T>();
135 }
136 catch (boost::property_tree::ptree_bad_data const&)
137 {
138 error("Value for key <" + param + "> `" + shortString(p->data()) +
139 "' not convertible to the desired type.");
140 }
141 }
142 else
143 {
144 error("Key <" + param + "> has not been found");
145 }
146}

References checkKeyname(), error(), shortString(), and tree_.

Referenced by MaterialPropertyLib::createAverageMolarMass(), MaterialPropertyLib::createBishopsPowerLaw(), MaterialPropertyLib::createBishopsSaturationCutoff(), ProcessLib::createBoundaryCondition(), MaterialLib::PorousMedium::createCapillaryPressureModel(), MaterialPropertyLib::createCapillaryPressureVanGenuchten(), MaterialPropertyLib::createClausiusClapeyron(), MaterialPropertyLib::createConstant(), MaterialLib::Solids::createConstitutiveRelation(), NumLib::createConvergenceCriterion(), MaterialPropertyLib::createCubicLawPermeability(), MaterialPropertyLib::createCurve(), ProcessLib::createDirichletBoundaryConditionWithinTimeInterval(), MaterialPropertyLib::createDupuitPermeability(), MaterialPropertyLib::createEffectiveThermalConductivityPorosityMixing(), MaterialPropertyLib::createEmbeddedFracturePermeability(), MaterialPropertyLib::createExponential(), MaterialLib::Fluid::createFluidDensityModel(), MaterialPropertyLib::createFunction(), MaterialPropertyLib::createGasPressureDependentPermeability(), MaterialPropertyLib::createIdealGasLaw(), MaterialPropertyLib::createIdealGasLawBinaryMixture(), MaterialPropertyLib::createLinear(), MaterialPropertyLib::createLinearSaturationSwellingStress(), MaterialPropertyLib::createLinearWaterVapourLatentHeat(), MaterialPropertyLib::createLiquidViscosityVogels(), MaterialPropertyLib::createOrthotropicEmbeddedFracturePermeability(), ParameterLib::createParameter(), MaterialPropertyLib::createParameterProperty(), MaterialLib::Fracture::Permeability::createPermeabilityModel(), MaterialPropertyLib::createPermeabilityMohrCoulombFailureIndexModel(), MaterialPropertyLib::createPermeabilityOrthotropicPowerLaw(), MaterialPropertyLib::createPorosityFromMassBalance(), anonymous_namespace{CreateProperty.cpp}::createProperty(), MaterialLib::PorousMedium::createRelativePermeabilityModel(), MaterialPropertyLib::createRelPermBrooksCorey(), MaterialPropertyLib::createRelPermBrooksCoreyNonwettingPhase(), MaterialPropertyLib::createRelPermGeneralizedPower(), MaterialPropertyLib::createRelPermGeneralizedPowerNonwettingPhase(), MaterialPropertyLib::createRelPermLiakopoulos(), MaterialPropertyLib::createRelPermNonWettingPhaseVanGenuchtenMualem(), MaterialPropertyLib::createRelPermUdell(), MaterialPropertyLib::createRelPermUdellNonwettingPhase(), MaterialPropertyLib::createRelPermVanGenuchten(), MaterialPropertyLib::createSaturationBrooksCorey(), MaterialPropertyLib::createSaturationDependentSwelling(), MaterialPropertyLib::createSaturationExponential(), MaterialPropertyLib::createSaturationLiakopoulos(), MaterialPropertyLib::createSaturationVanGenuchten(), MaterialPropertyLib::createSaturationVanGenuchtenWithVolumetricStrain(), MaterialPropertyLib::createSaturationWeightedThermalConductivity(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::createSourceTerm(), MaterialPropertyLib::createSpecificHeatCapacityWithLatentHeat(), MaterialPropertyLib::createStrainDependentPermeability(), MaterialPropertyLib::createTemperatureDependentFraction(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), NumLib::createTimeStepper(), MaterialPropertyLib::createTransportPorosityFromMassBalance(), MaterialPropertyLib::createVapourDiffusionDeVries(), MaterialPropertyLib::createVapourDiffusionFEBEX(), MaterialPropertyLib::createVapourDiffusionPMQ(), MaterialLib::Fluid::createViscosityModel(), MaterialPropertyLib::createVolumeFractionAverage(), ProcessLib::createVolumetricSourceTerm(), MaterialPropertyLib::createWaterDensityIAPWSIF97Region1(), MaterialPropertyLib::createWaterEnthalpyIAPWSIF97Region1(), MaterialPropertyLib::createWaterLiquidDensityIAPWSIF97Region4(), MaterialPropertyLib::createWaterLiquidEnthalpyIAPWSIF97Region4(), MaterialPropertyLib::createWaterSaturationTemperatureIAPWSIF97Region4(), MaterialPropertyLib::createWaterTemperatureIAPWSIF97Region1(), MaterialPropertyLib::createWaterThermalConductivityIAPWS(), MaterialPropertyLib::createWaterVapourDensity(), MaterialPropertyLib::createWaterVapourDensityIAPWSIF97Region4(), MaterialPropertyLib::createWaterVapourEnthalpyIAPWSIF97Region4(), MaterialPropertyLib::createWaterVapourLatentHeatWithCriticalTemperature(), and MaterialPropertyLib::createWaterViscosityIAPWS().

◆ shortString()

std::string BaseLib::ConfigTree::shortString ( std::string const & s)
staticprivate

returns a short string at suitable for error/warning messages

Definition at line 273 of file ConfigTree.cpp.

274{
275 const std::size_t maxlen = 100;
276
277 if (s.size() < maxlen)
278 {
279 return s;
280 }
281
282 return s.substr(0, maxlen - 3) + "...";
283}

Referenced by checkAndInvalidate(), getConfigAttributeOptional(), getConfigParameterOptionalImpl(), getValue(), and peekConfigParameter().

◆ warning()

void BaseLib::ConfigTree::warning ( std::string const & message) const
private

Called for printing warning messages. Will call the warning callback. This method only acts as a helper method.

Definition at line 236 of file ConfigTree.cpp.

237{
238 onwarning_(filename_, path_, message);
239}

References filename_, onwarning_, and path_.

Referenced by checkAndInvalidate().

Friends And Related Symbol Documentation

◆ checkAndInvalidate [1/3]

void checkAndInvalidate ( ConfigTree & conf)
friend

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 486 of file ConfigTree.cpp.

487{
488 conf.checkAndInvalidate();
489}

◆ checkAndInvalidate [2/3]

void checkAndInvalidate ( ConfigTree *const conf)
friend

Check if conf has been read entirely and invalidate it.

This method can safely be called on nullptr's.

See also
ConfigTree::checkAndInvalidate()

Definition at line 491 of file ConfigTree.cpp.

492{
493 if (conf)
494 {
495 conf->checkAndInvalidate();
496 }
497}

◆ checkAndInvalidate [3/3]

void checkAndInvalidate ( std::unique_ptr< ConfigTree > const & conf)
friend

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 499 of file ConfigTree.cpp.

500{
501 if (conf)
502 {
503 conf->checkAndInvalidate();
504 }
505}

Member Data Documentation

◆ filename_

std::string BaseLib::ConfigTree::filename_
private

The path of the file from which this tree has been read.

Definition at line 654 of file ConfigTree.h.

Referenced by error(), getProjectFileName(), operator=(), and warning().

◆ have_read_data_

bool BaseLib::ConfigTree::have_read_data_ = false
mutableprivate

Indicates if the plain data contained in this tree has already been read.

Definition at line 670 of file ConfigTree.h.

Referenced by checkAndInvalidate(), getValue(), and operator=().

◆ key_chars

const std::string BaseLib::ConfigTree::key_chars = key_chars_start + "_0123456789"
staticprivate

Set of allowed characters in a key name.

Definition at line 682 of file ConfigTree.h.

Referenced by checkKeyname().

◆ key_chars_start

const std::string BaseLib::ConfigTree::key_chars_start = "abcdefghijklmnopqrstuvwxyz"
staticprivate

Set of allowed characters as the first letter of a key name.

Definition at line 679 of file ConfigTree.h.

Referenced by checkKeyname().

◆ onerror_

Callback BaseLib::ConfigTree::onerror_
private

Custom error callback.

Definition at line 672 of file ConfigTree.h.

Referenced by ConfigTree(), error(), and operator=().

◆ onwarning_

Callback BaseLib::ConfigTree::onwarning_
private

Custom warning callback.

Definition at line 673 of file ConfigTree.h.

Referenced by ConfigTree(), operator=(), and warning().

◆ path_

std::string BaseLib::ConfigTree::path_
private

A path printed in error/warning messages.

Definition at line 651 of file ConfigTree.h.

Referenced by error(), operator=(), and warning().

◆ pathseparator

const char BaseLib::ConfigTree::pathseparator = '/'
staticprivate

Character separating two path components.

Definition at line 676 of file ConfigTree.h.

Referenced by joinPaths().

◆ top_level_tree_

std::shared_ptr<PTree const> BaseLib::ConfigTree::top_level_tree_
private

Root of the tree.

Owned by all ConfigTree instances that might access any part of it.

Definition at line 645 of file ConfigTree.h.

Referenced by operator=().

◆ tree_

◆ visited_params_

std::map<KeyType, CountType> BaseLib::ConfigTree::visited_params_
mutableprivate

A map KeyType -> (count, type) keeping track which parameters have been read how often and which datatype they have.

This member will be written to when reading from the config tree. Therefore it has to be mutable in order to be able to read from constant instances, e.g., those passed as constant references to temporaries.

Definition at line 666 of file ConfigTree.h.

Referenced by checkAndInvalidate(), checkUnique(), checkUniqueAttr(), markVisited(), markVisitedDecrement(), and operator=().


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