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 ];
322 "Group " <<
getDataContext() <<
" has no child named " << key << std::endl
325 T *
const castedChild = dynamicCast< T * >( child );
327 GEOS_FMT(
"{} was expected to be a '{}'.",
336 template<
typename T = Group,
typename KEY =
void >
339 Group const *
const child = m_subGroups[ key ];
341 "Group " <<
getDataContext() <<
" has no child named " << key << std::endl
344 T
const *
const castedChild = dynamicCast< T const * >( child );
346 GEOS_FMT(
"{} was expected to be a '{}'.",
361 template<
typename T = Group >
363 {
return dynamicCast< T & >(
const_cast< Group &
>( getBaseGroupByPath( path ) ) ); }
368 template<
typename T = Group >
370 {
return dynamicCast< T const & >( getBaseGroupByPath( path ) ); }
379 {
return m_subGroups; }
386 {
return m_subGroups; }
404 template<
typename T = Group >
406 {
return dynamicCast< T const * >( m_subGroups[ name ] ) !=
nullptr; }
413 template<
typename T >
416 bool hasSubGroup =
false;
419 forSubGroups< T >( [&]( T
const & ){ hasSubGroup =
true; } );
437 template<
typename CASTTYPE,
typename CONTAINERTYPE,
typename LAMBDA >
440 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, CASTTYPE
const, CASTTYPE >;
441 T *
const castedContainer =
dynamic_cast< T *
>( &container );
442 if( castedContainer !=
nullptr )
444 lambda( *castedContainer );
463 template<
typename T0,
typename T1,
typename ... CASTTYPES,
typename CONTAINERTYPE,
typename LAMBDA >
466 using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, T0
const, T0 >;
467 T *
const castedContainer =
dynamic_cast< T *
>( &container );
469 if( castedContainer !=
nullptr )
471 lambda( *castedContainer );
499 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
502 for(
auto & subGroupIter : m_subGroups )
506 lambda( castedSubGroup );
514 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
517 for(
auto const & subGroupIter : m_subGroups )
519 applyLambdaToContainer< GROUPTYPE, GROUPTYPES... >( *subGroupIter.second, [&](
auto const & castedSubGroup )
521 lambda( castedSubGroup );
534 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
538 for(
auto & subGroupIter : m_subGroups )
541 [&](
auto & castedSubGroup )
543 lambda( counter, castedSubGroup );
552 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LAMBDA >
556 for(
auto const & subGroupIter : m_subGroups )
559 [&](
auto const & castedSubGroup )
561 lambda( counter, castedSubGroup );
578 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
579 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
583 for(
auto const & subgroup : subGroupKeys )
587 lambda( counter, castedSubGroup );
604 template<
typename GROUPTYPE =
Group,
typename ... GROUPTYPES,
typename LOOKUP_CONTAINER,
typename LAMBDA >
605 void forSubGroups( LOOKUP_CONTAINER
const & subGroupKeys, LAMBDA && lambda )
const
608 for(
auto const & subgroup : subGroupKeys )
612 lambda( counter, castedSubGroup );
636 template<
typename LAMBDA >
639 for(
auto & wrapperIter : m_wrappers )
641 lambda( *wrapperIter.second );
648 template<
typename LAMBDA >
651 for(
auto const & wrapperIter : m_wrappers )
653 lambda( *wrapperIter.second );
664 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
667 for(
auto & wrapperIter : m_wrappers )
669 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
670 std::forward< LAMBDA >( lambda ));
681 template<
typename TYPE,
typename ... TYPES,
typename LAMBDA >
684 for(
auto const & wrapperIter : m_wrappers )
686 applyLambdaToContainer< Wrapper< TYPE >,
Wrapper< TYPES >... >( *wrapperIter.second,
687 std::forward< LAMBDA >( lambda ));
772 std::set< string > & siblingNames );
817 template<
typename T,
typename TBASE=T >
828 template<
typename T,
typename TBASE=T >
839 template<
typename T >
850 template<
typename T >
876 template<
typename LOG_LEVEL_INFO >
877 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
892 string indent( level*2,
' ' );
894 for(
auto const & subGroupIter : m_subGroups )
896 std::cout << indent << subGroupIter.second->getName() << std::endl;
897 subGroupIter.second->generateDataStructureSkeleton( level + 1 );
967 parallelDeviceEvents & events )
const;
985 parallelDeviceEvents & events )
const;
1001 parallelDeviceEvents & events )
const;
1025 parallelDeviceEvents & events )
const;
1050 parallelDeviceEvents & events )
const;
1073 parallelDeviceEvents & events )
const;
1098 parallelDeviceEvents & events,
1099 MPI_Op op=MPI_REPLACE );
1122 template<
typename KEY >
1125 WrapperBase const *
const wrapper = m_wrappers[ key ];
1127 "Group " <<
getDataContext() <<
" has no wrapper named " << key << std::endl
1129 std::domain_error );
1137 template<
typename KEY >
1142 "Group " <<
getDataContext() <<
" has no wrapper named " << key << std::endl
1144 std::domain_error );
1155 {
return m_wrappers.
getIndex( name ); }
1162 {
return m_wrappers; }
1168 {
return m_wrappers; }
1175 {
return m_wrappers.
size(); }
1203 template<
typename LOOKUP_TYPE >
1205 {
return m_wrappers[ lookup ] !=
nullptr; }
1215 template<
typename T,
typename LOOKUP_TYPE >
1219 return dynamicCast< Wrapper< T >
const & >( wrapper );
1225 template<
typename T,
typename LOOKUP_TYPE >
1229 return dynamicCast< Wrapper< T > & >( wrapper );
1240 template<
typename T,
typename LOOKUP_TYPE >
1242 {
return dynamicCast< Wrapper< T >
const * >( m_wrappers[ index ] ); }
1247 template<
typename T,
typename LOOKUP_TYPE >
1249 {
return dynamicCast< Wrapper< T > * >( m_wrappers[ index ] ); }
1273 template<
typename T,
typename LOOKUP_TYPE >
1276 {
return getWrapper< T >( lookup ).reference(); }
1281 template<
typename T,
typename LOOKUP_TYPE >
1283 {
return getWrapper< T >( lookup ).reference(); }
1311 {
return m_capacity; }
1346 {
return *m_dataContext; }
1355 template<
typename KEY >
1357 {
return getWrapperBase< KEY >( key ).getDataContext(); }
1383 {
return m_parent !=
nullptr; }
1404 {
return m_sizedFromParent; }
1413 m_sizedFromParent = val;
1474 {
return m_conduitNode; }
1478 {
return m_conduitNode; }
1519 #if defined(GEOS_USE_PYGEOSX)
1520 virtual PyTypeObject * getPythonType()
const;
1584 Group const & getBaseGroupByPath(
string const & path )
const;
1600 template<
bool DO_PACKING >
1606 parallelDeviceEvents & events )
const;
1610 Group * m_parent =
nullptr;
1645 conduit::Node & m_conduitNode;
1648 std::unique_ptr< LogLevelsRegistry > m_logLevelsRegistry;
1652 std::unique_ptr< DataContext > m_dataContext;
1668 template<
typename T,
typename TBASE >
1670 ViewKey::index_type *
const rkey )
1672 std::unique_ptr< TBASE > newObj = std::make_unique< T >();
1677 if( rkey !=
nullptr )
1679 *rkey = m_wrappers.
getIndex( name );
1691 template<
typename T,
typename TBASE >
1694 ViewKey::index_type index;
1695 Wrapper< TBASE > & rval = registerWrapper< T, TBASE >( viewKey.key(), &index );
1696 viewKey.setIndex( index );
1702 template<
typename T >
1704 std::unique_ptr< T > newObject )
1706 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1708 new Wrapper< T >( name, *
this, std::move( newObject ) ),
1719 template<
typename T >
1723 static_assert( !std::is_base_of< WrapperBase, T >::value,
"This function should not be used for `WrapperBase`. Use the dedicated `registerWrapper` instead." );
1736 template<
typename LOG_LEVEL_INFO >
1737 std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >,
void >
1740 GEOS_ERROR_IF( m_logLevelsRegistry ==
nullptr,
"You cannot call addLogLevel after schema generation" );
1743 if( wrapper ==
nullptr )
1749 m_logLevelsRegistry->addEntry( LOG_LEVEL_INFO::getMinLogLevel(),
1750 LOG_LEVEL_INFO::getDescription() );
1751 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(EXP, msg)
Conditionally raise a hard error and terminate the program.
#define GEOS_THROW_IF(EXP, msg, TYPE)
Conditionally throw an exception.
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.
void enableLogLevelInput()
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.
std::vector< string > getWrappersNames() 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.
std::vector< string > getSubGroupsNames() const
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.
array1d< 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).
std::int32_t integer
Signed integer type.
signed char buffer_unit_type
Type stored in communication buffers.
Array< T, 1 > array1d
Alias for 1D array.
std::string_view string_view
String type.
Exception class used to report errors from type conversion.
Structure to hold scoped key names.
static constexpr char const * logLevelString()