21 #ifndef GEOS_DATAREPOSITORY_GROUP_HPP_
22 #define GEOS_DATAREPOSITORY_GROUP_HPP_
36 #ifndef NOCHARTOSTRING_KEYLOOKUP
38 #define NOCHARTOSTRING_KEYLOOKUP 0
50 namespace dataRepository
88 explicit Group(
string const & name,
89 Group *
const parent );
97 explicit Group(
string const & name,
98 conduit::Node & rootNode );
199 template<
typename T = Group >
202 newObject->m_parent =
this;
203 return dynamicCast< T & >( *m_subGroups.
insert( name, newObject.release(),
true ) );
216 template<
typename T = Group >
218 {
return dynamicCast< T & >( *m_subGroups.
insert( name, newObject,
false ) ); }
230 template<
typename T = Group >
232 {
return registerGroup< T >( name, std::make_unique< T >( name,
this ) ); }
244 template<
typename T = Group >
247 T & rval = registerGroup< T >( keyIndex.
key(), std::make_unique< T >( keyIndex.
key(),
this ) );
298 template<
typename T = Group,
typename KEY =
void >
300 {
return dynamicCast< T * >( m_subGroups[ key ] ); }
305 template<
typename T = Group,
typename KEY =
void >
307 {
return dynamicCast< T const * >( m_subGroups[ key ] ); }
317 template<
typename T = Group,
typename KEY =
void >
320 Group *
const child = m_subGroups[ key ];
324 T *
const castedChild = dynamicCast< T * >( child );
326 GEOS_FMT(
"'{}' was expected to be a '{}'.",
327 getName(), LvArray::system::demangleType< T >() ),
335 template<
typename T = Group,
typename KEY =
void >
338 Group const *
const child = m_subGroups[ key ];
342 T
const *
const castedChild = dynamicCast< T const * >( child );
344 GEOS_FMT(
"'{}' was expected to be a '{}'.",
345 getName(), LvArray::system::demangleType< T >() ),
359 template<
typename T = Group >
361 {
return dynamicCast< T & >(
const_cast< Group &
>( getBaseGroupByPath( path ) ) ); }
366 template<
typename T = Group >
368 {
return dynamicCast< T const & >( getBaseGroupByPath( path ) ); }
377 {
return m_subGroups; }
384 {
return m_subGroups; }
402 template<
typename T = Group >
404 {
return dynamicCast< T const * >( m_subGroups[ name ] ) !=
nullptr; }
411 template<
typename T >
414 bool hasSubGroup =
false;
417 forSubGroups< T >( [&]( T
const & ){ hasSubGroup =
true; } );
435 template<
typename CASTTYPE,
typename CONTAINERTYPE,
typename LAMBDA >
438 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, CASTTYPE
const, CASTTYPE >;
439 T *
const castedContainer =
dynamic_cast< T *
>( &container );
440 if( castedContainer !=
nullptr )
442 lambda( *castedContainer );
461 template<
typename T0,
typename T1,
typename ... CASTTYPES,
typename CONTAINERTYPE,
typename LAMBDA >
464 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, T0
const, T0 >;
465 T *
const castedContainer =
dynamic_cast< T *
>( &container );
467 if( castedContainer !=
nullptr )
469 lambda( *castedContainer );
497 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
500 for(
auto & subGroupIter : m_subGroups )
504 lambda( castedSubGroup );
512 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
515 for(
auto const & subGroupIter : m_subGroups )
517 applyLambdaToContainer< GROUPTYPE, GROUPTYPES... >( *subGroupIter.second, [&](
auto const & castedSubGroup )
519 lambda( castedSubGroup );
532 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
536 for(
auto & subGroupIter : m_subGroups )
539 [&](
auto & castedSubGroup )
541 lambda( counter, castedSubGroup );
550 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
554 for(
auto const & subGroupIter : m_subGroups )
557 [&](
auto const & castedSubGroup )
559 lambda( counter, castedSubGroup );
576 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
577 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
581 for(
auto const & subgroup : subGroupKeys )
585 lambda( counter, castedSubGroup );
602 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
603 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
const
606 for(
auto const & subgroup : subGroupKeys )
610 lambda( counter, castedSubGroup );
634 template<
typename LAMBDA >
637 for(
auto & wrapperIter : m_wrappers )
639 lambda( *wrapperIter.second );
646 template<
typename LAMBDA >
649 for(
auto const & wrapperIter : m_wrappers )
651 lambda( *wrapperIter.second );
662 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
665 for(
auto & wrapperIter : m_wrappers )
667 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
668 std::forward< LAMBDA >( lambda ));
679 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
682 for(
auto const & wrapperIter : m_wrappers )
684 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
685 std::forward< LAMBDA >( lambda ));
770 std::set< string > & siblingNames );
815 template<
typename T,
typename TBASE=T >
826 template<
typename T,
typename TBASE=T >
837 template<
typename T >
848 template<
typename T >
874 template<
typename LOG_LEVEL_INFO >
875 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
890 string indent( level*2,
' ' );
892 for(
auto const & subGroupIter : m_subGroups )
894 std::cout << indent << subGroupIter.second->getName() << std::endl;
895 subGroupIter.second->generateDataStructureSkeleton( level + 1 );
965 parallelDeviceEvents & events )
const;
983 parallelDeviceEvents & events )
const;
999 parallelDeviceEvents & events )
const;
1023 parallelDeviceEvents & events )
const;
1048 parallelDeviceEvents & events )
const;
1071 parallelDeviceEvents & events )
const;
1096 parallelDeviceEvents & events,
1097 MPI_Op op=MPI_REPLACE );
1120 template<
typename KEY >
1123 WrapperBase const *
const wrapper = m_wrappers[ key ];
1125 "No wrapper named " << key <<
" found." << std::endl
1135 template<
typename KEY >
1140 "No wrapper named " << key <<
" found." << std::endl
1153 {
return m_wrappers.
getIndex( name ); }
1160 {
return m_wrappers; }
1166 {
return m_wrappers; }
1173 {
return m_wrappers.
size(); }
1201 template<
typename LOOKUP_TYPE >
1203 {
return m_wrappers[ lookup ] !=
nullptr; }
1213 template<
typename T,
typename LOOKUP_TYPE >
1217 return dynamicCast< Wrapper< T >
const & >( wrapper );
1223 template<
typename T,
typename LOOKUP_TYPE >
1227 return dynamicCast< Wrapper< T > & >( wrapper );
1238 template<
typename T,
typename LOOKUP_TYPE >
1240 {
return dynamicCast< Wrapper< T >
const * >( m_wrappers[ index ] ); }
1245 template<
typename T,
typename LOOKUP_TYPE >
1247 {
return dynamicCast< Wrapper< T > * >( m_wrappers[ index ] ); }
1271 template<
typename T,
typename LOOKUP_TYPE >
1274 {
return getWrapper< T >( lookup ).reference(); }
1279 template<
typename T,
typename LOOKUP_TYPE >
1281 {
return getWrapper< T >( lookup ).reference(); }
1309 {
return m_capacity; }
1344 {
return *m_dataContext; }
1353 template<
typename KEY >
1355 {
return getWrapperBase< KEY >( key ).getDataContext(); }
1365 "Group does not have a parent.",
1376 "Group does not have a parent.",
1385 {
return m_parent !=
nullptr; }
1406 {
return m_sizedFromParent; }
1415 m_sizedFromParent = val;
1476 {
return m_conduitNode; }
1480 {
return m_conduitNode; }
1521 #if defined(GEOS_USE_PYGEOSX)
1522 virtual PyTypeObject * getPythonType()
const;
1586 Group const & getBaseGroupByPath(
string const & path )
const;
1602 template<
bool DO_PACKING >
1608 parallelDeviceEvents & events )
const;
1612 Group * m_parent =
nullptr;
1647 conduit::Node & m_conduitNode;
1650 std::unique_ptr< LogLevelsRegistry > m_logLevelsRegistry;
1654 std::unique_ptr< DataContext > m_dataContext;
1670 template<
typename T,
typename TBASE >
1672 ViewKey::index_type *
const rkey )
1674 std::unique_ptr< TBASE > newObj = std::make_unique< T >();
1679 if( rkey !=
nullptr )
1681 *rkey = m_wrappers.
getIndex( name );
1693 template<
typename T,
typename TBASE >
1696 ViewKey::index_type index;
1697 Wrapper< TBASE > & rval = registerWrapper< T, TBASE >( viewKey.key(), &index );
1698 viewKey.setIndex( index );
1704 template<
typename T >
1706 std::unique_ptr< T > newObject )
1708 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1710 new Wrapper< T >( name, *
this, std::move( newObject ) ),
1721 template<
typename T >
1725 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1738 template<
typename LOG_LEVEL_INFO >
1739 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
1742 GEOS_ERROR_IF( m_logLevelsRegistry ==
nullptr,
"You cannot call addLogLevel after schema generation" );
1745 if( wrapper ==
nullptr )
1751 m_logLevelsRegistry->addEntry( LOG_LEVEL_INFO::getMinLogLevel(),
1752 LOG_LEVEL_INFO::getDescription() );
1753 wrapper->
setDescription( m_logLevelsRegistry->buildLogLevelDescription());
#define GEOS_DECLTYPE_AUTO_RETURN
Doxygen can't parse a decltype( auto ) return type, using this gets around that.
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
#define GEOS_ERROR_IF(COND,...)
Conditionally raise a hard error and terminate the program.
#define GEOS_THROW_IF(COND, MSG,...)
Conditionally raise a hard error and terminate the program.
INDEX_TYPE index_type
the type used for the index
void setIndex(INDEX_TYPE const &index) const
Set the index.
KEY_TYPE const & key() const
Access for the key.
INDEX_TYPE size() const
function to return the number of entries stored
KeyIndexT< keyType const, indexType > KeyIndex
alias for the KeyIndex itself
T * insert(KEY_TYPE const &keyName, T_PTR source, bool takeOwnership, bool overwrite=false)
insert new entry into MappedVector
INDEX_TYPE getIndex(KEY_TYPE const &key) const
This class provides the base class/interface for the catalog value objects.
std::unordered_map< std::string, std::unique_ptr< CatalogInterface< BASETYPE, ARGS... > > > CatalogType
This is the type that will be used for the catalog. The catalog is actually instantiated in the BASET...
T & getGroupByPath(string const &path)
Retrieve a group from the hierarchy using a path.
void forSubGroups(LOOKUP_CONTAINER const &subGroupKeys, LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
T const & getGroupByPath(string const &path) const
Retrieve a group from the hierarchy using a path.
virtual void initializePreSubGroups()
Called by Initialize() prior to initializing sub-Groups.
virtual void initialize_postMeshGeneration()
initialization post generation of the mesh.
localIndex capacity() const
Get the "capacity" of the group, which determines the capacity of resizable wrappers.
virtual void postInputInitialization()
virtual localIndex packSize(string_array const &wrapperNames, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of indices within a list of wrappers.
void setInputFlags(InputFlags flags)
Set input flags for schema generation.
void processInputFileRecursive(xmlWrapper::xmlDocument &xmlDocument, xmlWrapper::xmlNode &targetNode, xmlWrapper::xmlNodePos const &targetNodePos)
Same as processInputFileRecursive(xmlWrapper::xmlDocument &, xmlWrapper::xmlNode &) but allow to reus...
int sizedFromParent() const
Check whether this Group is resized when its parent is resized.
localIndex pack(buffer_unit_type *&buffer, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of indices for all registered wrappers.
void deregisterGroup(string const &name)
Removes a child group from this group.
Wrapper< TBASE > & registerWrapper(string const &name, wrapperMap::KeyIndex::index_type *const rkey=nullptr)
Create and register a Wrapper around a new object.
T * getGroupPointer(KEY const &key)
Return a pointer to a sub-group of the current Group.
localIndex packSize(arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of indices for all registered wrappers.
virtual localIndex unpack(buffer_unit_type const *&buffer, arrayView1d< localIndex > &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events, MPI_Op op=MPI_REPLACE)
Unpack a buffer.
InputFlags getInputFlags() const
Get input flags for schema generation.
DataContext const & getDataContext() const
bool hasWrapper(LOOKUP_TYPE const &lookup) const
Check if a wrapper exists.
T & registerGroup(string const &name, T *newObject)
Register a new Group as a sub-group of current Group.
void postInputInitializationRecursive()
Recursively call postInputInitialization() to apply post processing after reading input values.
Group(Group &&source)=default
Move constructor.
wrapperMap & wrappers()
Get access to the internal wrapper storage.
localIndex getIndexInParent() const
Get the group's index within its parent group.
void processInputFileRecursive(xmlWrapper::xmlDocument &xmlDocument, xmlWrapper::xmlNode &targetNode)
Recursively read values using ProcessInputFile() from the input file and put them into the wrapped va...
T & registerGroup(string const &name, std::unique_ptr< T > newObject)
Register a new Group as a sub-group of current Group.
string dumpWrappersNames() const
Group(string const &name, Group *const parent)
Constructor.
void forWrappers(LAMBDA &&lambda)
Apply the given functor to wrappers that can be cast to one of specified types.
virtual void expandObjectCatalogs()
Expand any catalogs in the data structure.
MappedVector< WrapperBase, WrapperBase *, keyType, indexType > wrapperMap
The template specialization of MappedVector to use for the collection wrappers objects.
virtual void initializePostSubGroups()
Called by Initialize() after to initializing sub-Groups.
virtual void reinit()
Performs re-initialization of certain variable depending on the solver being used.
void setRestartFlags(RestartFlags flags)
Set flags that control restart output of this group.
Wrapper< T > & getWrapper(LOOKUP_TYPE const &index)
Retrieve a Wrapper stored in this group.
WrapperBase & registerWrapper(std::unique_ptr< WrapperBase > wrapper)
Register and take ownership of an existing Wrapper.
void forSubGroupsIndex(LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
string const & getName() const
Get group name.
string dumpSubGroupsNames() const
GEOS_DECLTYPE_AUTO_RETURN getReference(LOOKUP_TYPE const &lookup) const
Look up a wrapper and get reference to wrapped object.
WrapperBase & getWrapperBase(KEY const &key)
Return a reference to a WrapperBase stored in this group.
WrapperBase const & getWrapperBase(KEY const &key) const
Return a reference to a WrapperBase stored in this group.
virtual void registerDataOnMeshRecursive(Group &meshBodies)
Calls RegisterDataOnMesh() recursively.
conduit::Node & getConduitNode()
Return the Conduit node object associated with this group.
void forSubGroups(LAMBDA &&lambda) const
Apply the given functor to subgroups that can be casted to one of specified types.
virtual void initializePostInitialConditionsPostSubGroups()
Called by InitializePostInitialConditions() after to initializing sub-Groups.
void initialize()
Run initialization functions on this and all subgroups.
Group(Group const &)=delete
Deleted copy constructor.
T & registerGroup(subGroupMap::KeyIndex const &keyIndex)
Register a new Group as a sub-group of current Group.
static CatalogInterface::CatalogType & getCatalog()
Get the singleton catalog for this Group.
void forSubGroupsIndex(LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
virtual void initializationOrder(string_array &order)
Sets the initialization order for sub-Groups.
RestartFlags getRestartFlags() const
Get flags that control restart output of this group.
void deregisterWrapper(string const &name)
Removes a Wrapper from this group.
std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >, void > addLogLevel()
Append a levelCondition and a log description to the description of the wrapped object given a log in...
void initializePostInitialConditions()
Initialization routine to be called after calling ApplyInitialConditions().
localIndex numSubGroups() const
return the number of sub groups in this Group
indexType numWrappers() const
Return the number of wrappers.
virtual void reserve(indexType const newsize)
Set the new capacity and reserve it in all wrappers that resize with parent.
string dumpInputOptions() const
T & getGroup(KEY const &key)
Return a reference to a sub-group of the current Group.
void loadFromConduit()
Read the group and its wrappers from Conduit.
MappedVector< Group, Group *, keyType, indexType > subGroupMap
The template specialization of MappedVector to use for the collection of sub-Group objects.
Group & getParent()
Access the group's parent.
void finishWriting()
Write the group and its wrappers into Conduit.
virtual void postRestartInitialization()
Performs initialization required after reading from a restart file.
Group(string const &name, conduit::Node &rootNode)
Constructor.
bool hasGroup(string const &name) const
Check whether a sub-group exists.
indexType getWrapperIndex(string const &name) const
bool hasSubGroupOfType() const
Check whether a sub-group exists by type.
static bool applyLambdaToContainer(CONTAINERTYPE &container, LAMBDA &&lambda)
Apply a given functor to a container if the container can be cast to one of the specified types.
void prepareToWrite()
Register the group and its wrappers with Conduit.
T const * getGroupPointer(KEY const &key) const
Return a pointer to a sub-group of the current Group.
virtual bool registerCallback(void *func, const std::type_info &funcType)
Register a callback function on the group.
void forWrappers(LAMBDA &&lambda) const
Apply the given functor to wrappers.
virtual localIndex pack(buffer_unit_type *&buffer, string_array const &wrapperNames, arrayView1d< localIndex const > const &packList, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of indices within a list of wrappers.
localIndex getSubGroupIndex(keyType const &key) const
Get the index of a sub-Group within this group.
Wrapper< T > const & getWrapper(LOOKUP_TYPE const &index) const
Retrieve a Wrapper stored in this group.
T & getReference(LOOKUP_TYPE const &lookup)
Look up a wrapper and get reference to wrapped object.
virtual void registerDataOnMesh(Group &meshBodies)
Register data on mesh entities.
localIndex size() const
Get the "size" of the group, which determines the number of elements in resizable wrappers.
virtual localIndex packSize(string_array const &wrapperNames, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Get the size required to pack a list of wrappers.
Group()=delete
Deleted default constructor.
Wrapper< T > * getWrapperPointer(LOOKUP_TYPE const &index)
Retrieve a Wrapper stored in this group.
T const & getGroup(KEY const &key) const
Return a reference to a sub-group of the current Group.
void forSubGroups(LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
stdVector< string > getWrappersNames() const
stdVector< string > getSubGroupsNames() const
integer getLogLevel() const
virtual Group * createChild(string const &childKey, string const &childName)
Creates a new sub-Group using the ObjectCatalog functionality.
void forWrappers(LAMBDA &&lambda) const
Apply the given functor to wrappers that can be cast to one of specified types.
string getPath() const
Return the path of this Group in the data repository. Starts with '/' followed by the hierarchy of th...
Group & operator=(Group const &)=delete
Deleted copy assignment operator.
void setLogLevel(integer const logLevel)
Set verbosity level.
Group const & getParent() const
Access the group's parent.
conduit::Node const & getConduitNode() const
Return the Conduit node object associated with this group.
void postRestartInitializationRecursive()
Initialization routine to be called after calling reading a restart file.
Group & setSizedFromParent(int val)
Set whether this wrapper is resized when its parent is resized.
DataContext const & getWrapperDataContext(KEY key) const
Group & operator=(Group &&)=delete
Deleted move assignment operator.
virtual localIndex pack(buffer_unit_type *&buffer, string_array const &wrapperNames, integer const recursive, bool onDevice, parallelDeviceEvents &events) const
Pack a list of wrappers to a buffer.
virtual ~Group()
Destructor, deletes all Groups and Wrappers owned by this Group.
void forWrappers(LAMBDA &&lambda)
Apply the given functor to wrappers.
subGroupMap const & getSubGroups() const
Get the subgroups object.
void forSubGroups(LOOKUP_CONTAINER const &subGroupKeys, LAMBDA &&lambda)
Apply the given functor to subgroups that can be casted to one of specified types.
void generateDataStructureSkeleton(integer const level)
Build a complete datastructure for schema generation.
virtual void setSchemaDeviations(xmlWrapper::xmlNode schemaRoot, xmlWrapper::xmlNode schemaParent, integer documentationType)
Inform the schema generator of any deviations between the xml and GEOS data structures.
void printDataHierarchy(integer indent=0) const
Prints the data hierarchy recursively.
wrapperMap const & wrappers() const
Get access to the internal wrapper storage.
T & registerGroup(string const &name)
Register a new Group as a sub-group of current Group.
virtual void initializePostInitialConditionsPreSubGroups()
Called by InitializePostInitialConditions() prior to initializing sub-Groups.
static string processInputName(xmlWrapper::xmlNode const &targetNode, xmlWrapper::xmlNodePos const &targetNodePos, string_view parentNodeName, xmlWrapper::xmlNodePos const &parentNodePos, std::set< string > &siblingNames)
Wrapper< T > const * getWrapperPointer(LOOKUP_TYPE const &index) const
Retrieve a Wrapper stored in this group.
subGroupMap & getSubGroups()
Get the subgroups object.
virtual void resize(localIndex const newSize)
Resize the group and all contained wrappers that resize with parent.
Base class for all wrappers containing common operations.
int sizedFromParent() const
Check whether this wrapper is resized when its parent is resized.
Wrapper< T > & setInputFlag(InputFlags const input)
Set the InputFlag of the wrapper.
std::enable_if_t< !traits::is_array< U > &&DefaultValue< U >::has_default_value, Wrapper< T > & > setApplyDefaultValue(typename DefaultValue< U >::value_type const &defaultVal)
Set and apply for default value.
Wrapper< T > & setDescription(string const &description)
Set the description string of the wrapper.
virtual void resize(int ndims, localIndex const *const dims) override
Calls T::resize( num_dims, dims )
@ OPTIONAL
Optional in input.
Group::wrapperMap::KeyIndex ViewKey
Type alias for KeyIndexT type used for wrapper lookups.
localIndex indexType
The default index type for entries the hierarchy.
string keyType
The default key type for entries in the hierarchy.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
stdVector< string > string_array
A 1-dimensional array of geos::string types.
std::string string
String type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
signed char buffer_unit_type
Type stored in communication buffers.
int integer
Signed integer type.
std::string_view string_view
String type.
internal::StdVectorWrapper< T, Allocator, USE_STD_CONTAINER_BOUNDS_CHECKING > stdVector
Exception class used to report errors from type conversion.
Exception class used to report domain errors. Generally, the domain of a mathematical function is the...
Structure to hold scoped key names.
static constexpr char const * logLevelString()