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 102 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. More...
 
using Callback = std::function< void(const std::string &filename, const std::string &path, const std::string &message)>
 

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 More...
 
 ConfigTree (ConfigTree &&other)
 
ConfigTreeoperator= (ConfigTree const &)=delete
 copying is not compatible with the semantics of this class More...
 
ConfigTreeoperator= (ConfigTree &&other)
 
std::string const & getProjectFileName () const
 Used to get the project file name. More...
 
 ~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 &root) 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
 
template<typename T >
void checkConfigParameter (std::string const &param, T const &value) const
 
template<typename Ch >
void checkConfigParameter (std::string const &param, Ch const *value) const
 Make checkConfigParameter() work for string literals. More...
 
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. More...
 

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). More...
 

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. More...
 
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. More...
 
 ConfigTree (PTree const &tree, ConfigTree const &parent, std::string const &root)
 Used for wrapping a subtree. More...
 
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_]. More...
 
std::string joinPaths (std::string const &p1, std::string const &p2) const
 Used to generate the path of a subtree. More...
 
void checkUnique (std::string const &key) const
 Asserts that the key has not been read yet. More...
 
void checkUniqueAttr (std::string const &attr) const
 Asserts that the attribute attr has not been read yet. More...
 
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. More...
 
void checkAndInvalidate ()
 

Static Private Member Functions

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

Private Attributes

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

Static Private Attributes

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

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. More...
 
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. More...
 

Member Typedef Documentation

◆ Callback

using BaseLib::ConfigTree::Callback = 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 260 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 251 of file ConfigTree.h.

Member Enumeration Documentation

◆ Attr

enum 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 34 of file ConfigTree.cpp.

38  : top_level_tree_(std::make_shared<PTree>(std::move(top_level_tree))),
39  tree_(top_level_tree_.get()),
40  filename_(std::move(filename)),
41  onerror_(std::move(error_cb)),
42  onwarning_(std::move(warning_cb))
43 {
44  if (!onerror_)
45  {
46  OGS_FATAL("ConfigTree: No valid error handler provided.");
47  }
48  if (!onwarning_)
49  {
50  OGS_FATAL("ConfigTree: No valid warning handler provided.");
51  }
52 }
#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 66 of file ConfigTree.cpp.

67  : top_level_tree_(std::move(other.top_level_tree_)),
68  tree_(other.tree_),
69  path_(std::move(other.path_)),
70  filename_(std::move(other.filename_)),
71  visited_params_(std::move(other.visited_params_)),
72  have_read_data_(other.have_read_data_),
73  onerror_(std::move(other.onerror_)),
74  onwarning_(std::move(other.onwarning_))
75 {
76  other.tree_ = nullptr;
77 }
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 79 of file ConfigTree.cpp.

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

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 54 of file ConfigTree.cpp.

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

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 243 of file ConfigTree.cpp.

244 {
246  {
247  return;
248  }
249 
250  ERR("ConfigTree: There have been errors when parsing the configuration "
251  "file(s):");
252 
253  for (auto const& msg : configtree_destructor_error_messages)
254  {
255  ERR("{:s}", msg);
256  }
257 
258  OGS_FATAL("There have been errors when parsing the configuration file(s).");
259 }

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 394 of file ConfigTree.cpp.

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

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

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

◆ checkConfigParameter() [1/2]

template<typename Ch >
void BaseLib::ConfigTree::checkConfigParameter ( std::string const &  param,
Ch const *  value 
) const

Make checkConfigParameter() work for string literals.

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

159 {
160  if (getConfigParameter<std::string>(param) != value)
161  {
162  error("The value of key <" + param + "> is not the expected one.");
163  }
164 }
void error(std::string const &message) const
Definition: ConfigTree.cpp:216

References error().

◆ checkConfigParameter() [2/2]

template<typename T >
void BaseLib::ConfigTree::checkConfigParameter ( std::string const &  param,
T const &  value 
) const

Assert that param has the given value.

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

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

149 {
150  if (getConfigParameter<T>(param) != value)
151  {
152  error("The value of key <" + param + "> is not the expected one.");
153  }
154 }

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::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(), MaterialPropertyLib::createLinear(), MaterialLib::Fluid::createLinearConcentrationAndPressureDependentDensity(), MaterialLib::Fluid::createLinearConcentrationDependentDensity(), MaterialLib::Fracture::createLinearElasticIsotropic(), MaterialLib::Solids::createLinearElasticIsotropic(), MaterialLib::Solids::createLinearElasticOrthotropic(), MaterialLib::Fluid::createLinearPressureDependentViscosity(), MaterialPropertyLib::createLinearSaturationSwellingStress(), MaterialLib::Fluid::createLinearTemperatureDependentDensity(), MaterialPropertyLib::createLinearWaterVapourLatentHeat(), MaterialLib::Fluid::createLiquidDensity(), ProcessLib::LiquidFlow::createLiquidFlowProcess(), MaterialLib::Solids::Lubby2::createLubby2(), ParameterLib::createMeshElementParameter(), ParameterLib::createMeshNodeParameter(), MaterialLib::Solids::MFront::createMFront(), 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(), MaterialLib::PorousMedium::createRelativePermeabilityModel(), MaterialPropertyLib::createRelPermBrooksCorey(), MaterialPropertyLib::createRelPermBrooksCoreyNonwettingPhase(), 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(), 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::createVapourDiffusionFEBEX(), MaterialPropertyLib::createVapourDiffusionPMQ(), ProcessLib::createVariableDependentNeumannBoundaryCondition(), MaterialPropertyLib::createVermaPruessModel(), MaterialLib::Fluid::createViscosityModel(), MaterialPropertyLib::createVolumeFractionAverage(), ProcessLib::createVolumetricSourceTerm(), MaterialPropertyLib::createWaterVapourDensity(), MaterialPropertyLib::createWaterVapourLatentHeatWithCriticalTemperature(), 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 273 of file ConfigTree.cpp.

274 {
275  if (key.empty())
276  {
277  error("Search for empty key.");
278  }
279  else if (key_chars_start.find(key.front()) == std::string::npos)
280  {
281  error("Key <" + key + "> starts with an illegal character.");
282  }
283  else if (key.find_first_not_of(key_chars, 1) != std::string::npos)
284  {
285  error("Key <" + key + "> contains illegal characters.");
286  }
287  else if (key.find("__") != std::string::npos)
288  {
289  // This is illegal because we use parameter names to generate doxygen
290  // page names. Thereby "__" acts as a separator character. Choosing
291  // other separators is not possible because of observed limitations
292  // for valid doxygen page names.
293  error("Key <" + key + "> contains double underscore.");
294  }
295 }
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 313 of file ConfigTree.cpp.

314 {
315  checkKeyname(key);
316 
317  if (visited_params_.find({Attr::TAG, key}) != visited_params_.end())
318  {
319  error("Key <" + key + "> has already been processed.");
320  }
321 }

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 323 of file ConfigTree.cpp.

324 {
325  // Workaround for handling attributes with xml namespaces and uppercase
326  // letters.
327  if (attr.find(':') != std::string::npos)
328  {
329  auto pos = decltype(std::string::npos){0};
330 
331  // Replace colon and uppercase letters with an allowed character 'a'.
332  // That means, attributes containing a colon are also allowed to contain
333  // uppercase letters.
334  auto attr2 = attr;
335  do
336  {
337  pos = attr2.find_first_of(":ABCDEFGHIJKLMNOPQRSTUVWXYZ", pos);
338  if (pos != std::string::npos)
339  {
340  attr2[pos] = 'a';
341  }
342  } while (pos != std::string::npos);
343 
344  checkKeyname(attr2);
345  }
346  else
347  {
348  checkKeyname(attr);
349  }
350 
351  if (visited_params_.find({Attr::ATTR, attr}) != visited_params_.end())
352  {
353  error("Attribute '" + attr + "' has already been processed.");
354  }
355 }

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 216 of file ConfigTree.cpp.

217 {
218  onerror_(filename_, path_, message);
219  OGS_FATAL(
220  "ConfigTree: The error handler does not break out of the normal "
221  "control flow.");
222 }

References filename_, OGS_FATAL, onerror_, and path_.

Referenced by checkConfigParameter(), checkKeyname(), checkUnique(), checkUniqueAttr(), getConfigAttribute(), getConfigAttributeOptional(), 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 185 of file ConfigTree-impl.h.

186 {
187  if (auto a = getConfigAttributeOptional<T>(attr))
188  {
189  return *a;
190  }
191 
192  error("Did not find XML attribute with name '" + attr + "'.");
193 }

References error().

Referenced by ChemistryLib::PhreeqcIOData::createAqueousSolution(), 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 196 of file ConfigTree-impl.h.

198 {
199  if (auto a = getConfigAttributeOptional<T>(attr))
200  {
201  return *a;
202  }
203 
204  return default_value;
205 }

◆ 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 208 of file ConfigTree-impl.h.

210 {
211  checkUniqueAttr(attr);
212  auto& ct = markVisited<T>(attr, Attr::ATTR, true);
213 
214  if (auto attrs = tree_->get_child_optional("<xmlattr>"))
215  {
216  if (auto a = attrs->get_child_optional(attr))
217  {
218  ++ct.count; // count only if attribute has been found
219  if (auto v = a->get_value_optional<T>())
220  {
221  return std::make_optional(*v);
222  }
223  error("Value for XML attribute '" + attr + "' `" +
224  shortString(a->data()) +
225  "' not convertible to the desired type.");
226  }
227  }
228 
229  return std::nullopt;
230 }
void checkUniqueAttr(std::string const &attr) const
Asserts that the attribute attr has not been read yet.
Definition: ConfigTree.cpp:323
static const double v

References ATTR, checkUniqueAttr(), error(), shortString(), tree_, and MathLib::v.

Referenced by ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowPrhoMaterialProperties(), 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 39 of file ConfigTree-impl.h.

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

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::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::createFunction(), 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(), 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::createMFront(), ProcessLib::createNeumannBoundaryCondition(), NumLib::createNewtonRaphsonSolverParameters(), ProcessLib::createNodalSourceTerm(), NumLib::createNonlinearSolver(), MaterialLib::PorousMedium::createNonWettingPhaseBrooksCoreyOilGas(), MaterialLib::PorousMedium::createNonWettingPhaseVanGenuchten(), ProcessLib::NormalTractionBoundaryCondition::createNormalTractionBoundaryCondition(), MaterialPropertyLib::createOrthotropicEmbeddedFracturePermeability(), ProcessLib::createOutput(), ParameterLib::createParameter(), MaterialPropertyLib::createParameterProperty(), MaterialLib::PorousMedium::createPermeabilityModel(), MaterialPropertyLib::createPermeabilityMohrCoulombFailureIndexModel(), MaterialPropertyLib::createPermeabilityOrthotropicPowerLaw(), anonymous_namespace{CreatePhase.cpp}::createPhase(), ProcessLib::PhaseField::createPhaseFieldProcess(), MathLib::createPiecewiseLinearCurve(), ProcessLib::HeatTransportBHE::BHE::createPipe(), MaterialPropertyLib::createPorosityFromMassBalance(), MaterialLib::PorousMedium::createPorosityModel(), ProcessLib::createPrimaryVariableConstraintDirichletBoundaryCondition(), ProcessLib::createPythonBoundaryCondition(), ProcessLib::createPythonSourceTerm(), ParameterLib::createRandomFieldMeshElementParameter(), ProcessLib::HeatTransportBHE::BHE::createRefrigerantProperties(), MaterialPropertyLib::createRelPermBrooksCorey(), MaterialPropertyLib::createRelPermBrooksCoreyNonwettingPhase(), 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::createSaturationVanGenuchten(), ProcessLib::SmallDeformationNonlocal::createSmallDeformationNonlocalProcess(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), ProcessLib::SmallDeformation::createSmallDeformationProcess(), MaterialPropertyLib::createSoilThermalConductivitySomerton(), ProcessLib::createSolutionDependentDirichletBoundaryCondition(), MaterialLib::Fluid::createSpecificFluidHeatCapacityModel(), MaterialPropertyLib::createSpecificHeatCapacityWithLatentHeat(), ProcessLib::StokesFlow::createStokesFlowProcess(), MaterialLib::PorousMedium::createStorageModel(), 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(), NumLib::createTimeDiscretization(), BaseLib::createTimeInterval(), MaterialPropertyLib::createTransportPorosityFromMassBalance(), ProcessLib::TwoPhaseFlowWithPP::createTwoPhaseFlowWithPPProcess(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowWithPrhoProcess(), MaterialLib::PorousMedium::createVanGenuchten(), MaterialPropertyLib::createVapourDiffusionFEBEX(), ProcessLib::createVariableDependentNeumannBoundaryCondition(), MaterialPropertyLib::createVermaPruessModel(), MaterialLib::Fluid::createViscosityModel(), ProcessLib::createVolumetricSourceTerm(), 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(), and anonymous_namespace{ProjectData.cpp}::readMeshes().

◆ 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 50 of file ConfigTree-impl.h.

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

◆ 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 117 of file ConfigTree.cpp.

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

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 112 of file ConfigTree-impl.h.

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

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 138 of file ConfigTree.cpp.

140 {
141  checkUnique(param);
142  markVisited(param, Attr::TAG, true);
143 
144  auto p = tree_->equal_range(param);
145 
146  return Range<ParameterIterator>(ParameterIterator(p.first, param, *this),
147  ParameterIterator(p.second, param, *this));
148 }
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 62 of file ConfigTree-impl.h.

64 {
65  checkUnique(param);
66 
67  return getConfigParameterOptionalImpl(param, static_cast<T*>(nullptr));
68 }
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(), ProcessLib::HydroMechanics::createHydroMechanicsProcess(), MaterialLib::Solids::MFront::createMFront(), NumLib::createNewtonRaphsonSolverParameters(), ProcessLib::PhaseField::createPhaseFieldProcess(), ProcessLib::RichardsComponentTransport::createRichardsComponentTransportProcess(), ProcessLib::RichardsMechanics::createRichardsMechanicsProcess(), ProcessLib::TH2M::createTH2MProcess(), ProcessLib::ThermoHydroMechanics::createThermoHydroMechanicsProcess(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), ProcessLib::ThermoRichardsFlow::createThermoRichardsFlowProcess(), ProcessLib::ThermoRichardsMechanics::createThermoRichardsMechanicsProcess(), MaterialLib::PorousMedium::createVanGenuchten(), anonymous_namespace{ProcessVariable.cpp}::findMeshInConfig(), ParameterLib::findOptionalTagParameter(), ProcessLib::parseCompensateNonEquilibriumInitialResiduum(), and MathLib::LinearSolverOptionsParser< EigenLisLinearSolver >::parseNameAndOptions().

◆ getConfigParameterOptional() [2/2]

std::optional< ConfigTree > BaseLib::ConfigTree::getConfigParameterOptional ( std::string const &  root) 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 127 of file ConfigTree.cpp.

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

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 83 of file ConfigTree-impl.h.

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

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 71 of file ConfigTree-impl.h.

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

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 150 of file ConfigTree.cpp.

151 {
152  if (auto t = getConfigSubtreeOptional(root))
153  {
154  return std::move(*t);
155  }
156  error("Key <" + root + "> has not been found.");
157 }
static const double t

References error(), getConfigSubtreeOptional(), and MathLib::t.

Referenced by ProjectData::ProjectData(), ProcessLib::TES::TESProcess::TESProcess(), MaterialLib::PorousMedium::createCapillaryPressureModel(), ChemistryLib::PhreeqcIOData::createChemicalSystem(), ProcessLib::createCompareJacobiansJacobianAssembler(), ProcessLib::ComponentTransport::createComponentTransportProcess(), 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::LiquidFlow::createLiquidFlowProcess(), MaterialLib::Solids::Lubby2::createLubby2(), MaterialLib::Solids::MFront::createMFront(), ProcessLib::createOutput(), 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::createThermoRichardsMechanicsProcess(), ParameterLib::createTimeDependentHeterogeneousParameter(), BaseLib::createTimeInterval(), ProcessLib::createTimeLoop(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowPrhoMaterialProperties(), ProcessLib::TwoPhaseFlowWithPP::createTwoPhaseFlowWithPPProcess(), ProcessLib::TwoPhaseFlowWithPrho::createTwoPhaseFlowWithPrhoProcess(), getConfigParameter(), ProcessLib::HeatTransportBHE::BHE::parseBHE1PTypeConfig(), ProcessLib::HeatTransportBHE::BHE::parseBHECoaxialConfig(), and ProcessLib::HeatTransportBHE::BHE::parseBHEUTypeConfig().

◆ 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 159 of file ConfigTree.cpp.

161 {
162  checkUnique(root);
163 
164  if (auto subtree = tree_->get_child_optional(root))
165  {
166  markVisited(root, Attr::TAG, false);
167  return ConfigTree(*subtree, *this, root);
168  }
169  markVisited(root, Attr::TAG, true);
170  return std::nullopt;
171 }
ConfigTree(PTree &&top_level_tree, std::string filename, Callback error_cb, Callback warning_cb)
Definition: ConfigTree.cpp:34

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

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

◆ getProjectFileName()

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

Used to get the project file name.

Definition at line 299 of file ConfigTree.h.

299 { return filename_; }

References filename_.

◆ getValue()

template<typename T >
T BaseLib::ConfigTree::getValue

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 167 of file ConfigTree-impl.h.

168 {
169  if (have_read_data_)
170  {
171  error("The data of this subtree has already been read.");
172  }
173 
174  have_read_data_ = true;
175 
176  if (auto v = tree_->get_value_optional<T>())
177  {
178  return *v;
179  }
180  error("Value `" + shortString(tree_->data()) +
181  "' is not convertible to the desired type.");
182 }

References error(), have_read_data_, shortString(), tree_, and MathLib::v.

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

◆ hasChildren()

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

Checks if this tree has any children.

Definition at line 379 of file ConfigTree.cpp.

380 {
381  auto const& tree = *tree_;
382  if (tree.begin() == tree.end())
383  {
384  return false; // no children
385  }
386  if (tree.front().first == "<xmlattr>" && (++tree.begin()) == tree.end())
387  {
388  return false; // only attributes
389  }
390 
391  return true;
392 }

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 193 of file ConfigTree.cpp.

194 {
195  checkUniqueAttr(attr);
196 
197  // Exercise: Guess what not! (hint: if not found, peek only)
198  // Btw. (not a hint) tree_->find() does not seem to work here.
199  bool peek_only = !tree_->get_child_optional("<xmlattr>." + attr);
200 
201  markVisited(attr, Attr::ATTR, peek_only);
202 }

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 185 of file ConfigTree.cpp.

186 {
187  checkUnique(param);
188  // if not found, peek only
189  bool peek_only = tree_->find(param) == tree_->not_found();
190  markVisited(param, Attr::TAG, peek_only);
191 }

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 204 of file ConfigTree.cpp.

205 {
206  checkUnique(param);
207  auto& ct = markVisited(param, Attr::TAG, true);
208 
209  auto p = tree_->equal_range(param);
210  for (auto it = p.first; it != p.second; ++it)
211  {
212  ++ct.count;
213  }
214 }

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 297 of file ConfigTree.cpp.

299 {
300  if (p2.empty())
301  {
302  error("Second path to be joined is empty.");
303  }
304 
305  if (p1.empty())
306  {
307  return p2;
308  }
309 
310  return p1 + pathseparator + p2;
311 }
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 357 of file ConfigTree.cpp.

360 {
361  return markVisited<ConfigTree>(key, is_attr, peek_only);
362 }

◆ 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 233 of file ConfigTree-impl.h.

236 {
237  auto const type = std::type_index(typeid(T));
238 
239  auto p = visited_params_.emplace(std::make_pair(is_attr, key),
240  CountType{peek_only ? 0 : 1, type});
241 
242  if (!p.second)
243  { // no insertion happened
244  auto& v = p.first->second;
245  if (v.type == type)
246  {
247  if (!peek_only)
248  {
249  ++v.count;
250  }
251  }
252  else
253  {
254  error("There already was an attempt to obtain key <" + key +
255  "> with type '" + v.type.name() + "' (now: '" + type.name() +
256  "').");
257  }
258  }
259 
260  return p.first->second;
261 }

References error(), MathLib::v, 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 364 of file ConfigTree.cpp.

366 {
367  auto const type = std::type_index(typeid(nullptr));
368 
369  auto p = visited_params_.emplace(std::make_pair(is_attr, key),
370  CountType{-1, type});
371 
372  if (!p.second)
373  { // no insertion happened
374  auto& v = p.first->second;
375  --v.count;
376  }
377 }

References MathLib::v, and 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 229 of file ConfigTree.cpp.

231 {
232  OGS_FATAL("ConfigTree: In file `{:s}' at path <{:s}>: {:s}", filename, path,
233  message);
234 }

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 236 of file ConfigTree.cpp.

238 {
239  WARN("ConfigTree: In file `{:s}' at path <{:s}>: {:s}", filename, path,
240  message);
241 }
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition: Logging.h:39

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 100 of file ConfigTree.cpp.

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

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 124 of file ConfigTree-impl.h.

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

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::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::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::createRelPermLiakopoulos(), MaterialPropertyLib::createRelPermNonWettingPhaseVanGenuchtenMualem(), MaterialPropertyLib::createRelPermUdell(), MaterialPropertyLib::createRelPermUdellNonwettingPhase(), MaterialPropertyLib::createRelPermVanGenuchten(), MaterialPropertyLib::createSaturationBrooksCorey(), MaterialPropertyLib::createSaturationDependentSwelling(), MaterialPropertyLib::createSaturationDependentThermalConductivity(), MaterialPropertyLib::createSaturationExponential(), MaterialPropertyLib::createSaturationLiakopoulos(), MaterialPropertyLib::createSaturationVanGenuchten(), ProcessLib::LIE::SmallDeformation::createSmallDeformationProcess(), MaterialPropertyLib::createSoilThermalConductivitySomerton(), ProcessLib::createSourceTerm(), MaterialPropertyLib::createSpecificHeatCapacityWithLatentHeat(), MaterialPropertyLib::createStrainDependentPermeability(), MaterialPropertyLib::createTemperatureDependentFraction(), ProcessLib::ThermoMechanics::createThermoMechanicsProcess(), NumLib::createTimeStepper(), MaterialPropertyLib::createTransportPorosityFromMassBalance(), MaterialPropertyLib::createVapourDiffusionFEBEX(), MaterialPropertyLib::createVapourDiffusionPMQ(), MaterialLib::Fluid::createViscosityModel(), MaterialPropertyLib::createVolumeFractionAverage(), ProcessLib::createVolumetricSourceTerm(), MaterialPropertyLib::createWaterVapourDensity(), and MaterialPropertyLib::createWaterVapourLatentHeatWithCriticalTemperature().

◆ shortString()

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

returns a short string at suitable for error/warning messages

Definition at line 261 of file ConfigTree.cpp.

262 {
263  const std::size_t maxlen = 100;
264 
265  if (s.size() < maxlen)
266  {
267  return s;
268  }
269 
270  return s.substr(0, maxlen - 3) + "...";
271 }
static const double s

References MathLib::s.

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 224 of file ConfigTree.cpp.

225 {
226  onwarning_(filename_, path_, message);
227 }

References filename_, onwarning_, and path_.

Referenced by checkAndInvalidate().

Friends And Related Function 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 474 of file ConfigTree.cpp.

475 {
476  conf.checkAndInvalidate();
477 }

◆ 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 479 of file ConfigTree.cpp.

480 {
481  if (conf)
482  {
483  conf->checkAndInvalidate();
484  }
485 }

◆ 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 487 of file ConfigTree.cpp.

488 {
489  if (conf)
490  {
491  conf->checkAndInvalidate();
492  }
493 }

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: