10 #ifndef TEUCHOS_PARAMETER_LIST_H
11 #define TEUCHOS_PARAMETER_LIST_H
17 #include "TeuchosParameterList_config.h"
18 #include "Teuchos_ParameterListExceptions.hpp"
21 #include "Teuchos_StringIndexedOrderedValueObjectContainer.hpp"
22 #include "Teuchos_Assert.hpp"
120 PrintOptions() : indent_(0), showTypes_(
false), showFlags_(
false), showDoc_(
false), showDefault_(
true) {}
121 PrintOptions& indent(
int _indent) { indent_ = _indent;
return *
this; }
122 PrintOptions& showTypes(
bool _showTypes) { showTypes_ = _showTypes;
return *
this; }
123 PrintOptions& showFlags(
bool _showFlags) { showFlags_ = _showFlags;
return *
this; }
124 PrintOptions& showDoc(
bool _showDoc) { showDoc_ = _showDoc;
return *
this; }
125 PrintOptions& showDefault(
bool _showDefault) { showDefault_ = _showDefault;
return *
this; }
126 PrintOptions& incrIndent(
int indents) { indent_ += indents;
return *
this; }
127 int indent()
const {
return indent_; }
128 bool showTypes()
const {
return showTypes_; }
129 bool showFlags()
const {
return showFlags_; }
130 bool showDoc()
const {
return showDoc_; }
131 bool showDefault()
const {
return showDefault_; }
255 std::string
const& docString =
"",
263 template<
typename T,
typename S,
typename = std::enable_if_t<std::is_convertible_v<S, std::remove_const_t<T>>>>
266 std::string
const& docString =
"",
274 std::string
const& name,
char value[], std::string
const& docString =
"",
283 std::string
const& name,
const char value[], std::string
const& docString =
"",
291 std::string
const& name,
ParameterList const& value, std::string
const& docString =
""
298 template <
typename U,
typename = std::enable_if_t<std::is_same_v<std::decay_t<U>, ParameterEntry>>>
308 int const depth = 1000);
331 T&
get(
const std::string& name, T def_value);
336 std::string&
get(
const std::string& name,
char def_value[]);
341 std::string&
get(
const std::string& name,
const char def_value[]);
374 T&
get (
const std::string& name);
404 const T&
get (
const std::string& name)
const;
413 T* getPtr(
const std::string& name);
422 const T* getPtr(
const std::string& name)
const;
484 std::string
const& name,
bool throwIfNotExists = true
498 const std::string& name,
bool mustAlreadyExist =
false,
499 const std::string& docString =
""
508 const std::string& docString =
""
523 const std::string& name()
const;
529 bool isParameter (
const std::string& name)
const;
535 bool isSublist (
const std::string& name)
const;
543 bool isType (
const std::string& name)
const;
545 #ifndef DOXYGEN_SHOULD_SKIP_THIS
557 bool isType(
const std::string& name, T* ptr)
const;
561 Ordinal numParams ()
const;
577 std::ostream& print(std::ostream& os,
const PrintOptions &printOptions)
const;
581 std::ostream& print(std::ostream& os,
int indent = 0,
bool showTypes =
false,
bool showFlags =
true,
bool showDefault =
true )
const;
584 void unused(std::ostream& os)
const;
587 std::string currentParametersString()
const;
655 void validateParameters(
657 int const depth = 1000,
699 void validateParametersAndSetDefaults(
701 int const depth = 1000
718 void modifyParameterList(
ParameterList &validParamList,
int const depth = 1000);
731 const bool left_to_right =
true);
744 void validateEntryExists(
const std::string &funcName,
const std::string &name,
749 void validateEntryType(
const std::string &funcName,
const std::string &name,
752 void validateEntryIsList(
const std::string &name,
const ParameterEntry &entry)
const;
754 void validateMissingSublistMustExist(
const std::string &baselist_name,
755 const std::string &sublist_name,
const bool mustAlreadyExist)
const;
757 void updateSubListNames(
int depth = 0);
762 std::string name_ =
"ANONYMOUS";
776 bool disableRecursiveValidation_ =
false;
779 bool disableRecursiveModification_ =
false;
782 bool disableRecursiveReconciliation_ =
false;
850 static std::string name() {
return "ParameterList"; }
870 return !( list1 == list2 );
881 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
bool haveSameModifiers (
const ParameterList& list1,
899 bool verbose =
false);
913 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
bool haveSameValuesSorted(
const ParameterList& list1,
935 std::string
const& name_in, T&& value_in, std::string
const& docString_in,
941 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
943 const std::string docString =
944 (docString_in.length() ? docString_in : param->docString());
946 (
nonnull(validator_in) ? validator_in : param->validator());
948 ParameterEntry param_new(std::forward<T>(value_in),
false,
false, docString, validator );
950 validator->validate(param_new, name_in, this->
name());
956 ParameterEntry param_new(std::forward<T>(value_in),
false,
false, docString_in, validator_in);
958 param_new.
validator()->validate(param_new, name_in, this->
name());
960 params_.
setObj(name_in, param_new);
965 template<
typename T,
typename S,
typename>
968 std::string
const& name_in,
const S& value_in, std::string
const& docString_in,
972 return set(name_in, static_cast<const T&>(value_in), docString_in, validator_in);
977 std::string
const& name_in,
char value[], std::string
const& docString
980 {
return set(name_in, std::string(value), docString, validator); }
985 const std::string& name_in,
const char value[],
const std::string &docString
988 {
return set( name_in, std::string(value), docString, validator ); }
993 std::string
const& name_in,
ParameterList const& value, std::string
const&
1001 template <
typename U,
typename>
1005 params_.
setObj(name_in, std::forward<U>(entry_in));
1009 template<
typename T>
1014 for (itr = this->
begin(); itr != this->
end(); ++itr){
1015 const std::string &entry_name = itr->first;
1016 if (this->
isSublist(entry_name) && depth > 0){
1020 if (theEntry->
isType<T>()){
1031 template<
typename T>
1036 if (param_idx == SIOVOCB::getInvalidOrdinal()) {
1041 this->
template validateEntryType<T>(
"get", name_in, *param);
1042 return getValue<T>(*param);
1048 {
return get(name_in, std::string(def_value)); }
1053 {
return get(name_in, std::string(def_value)); }
1056 template<
typename T>
1060 validateEntryExists(
"get",name_in,foundEntry);
1061 this->
template validateEntryType<T>(
"get",name_in,*foundEntry);
1062 return getValue<T>(*foundEntry);
1066 template<
typename T>
1070 validateEntryExists(
"get",name_in,foundEntry);
1071 this->
template validateEntryType<T>(
"get",name_in,*foundEntry);
1072 return getValue<T>(*foundEntry);
1076 template<
typename T>
1082 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1084 if (param_ptr->isType<T>()) {
1085 return ¶m_ptr->getValue<T>(0);
1097 template<
typename T>
1103 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1105 if (param_ptr->isType<T>()) {
1106 return ¶m_ptr->getValue<T>(0);
1119 validateEntryExists(
"get", name_in, foundEntry);
1128 validateEntryExists(
"get", name_in, foundEntry);
1139 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1152 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1164 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1176 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1177 return rcpFromPtr(params_.
getObjPtr(param_idx));
1185 {
return modifier_; }
1198 #ifndef DOXYGEN_SHOULD_SKIP_THIS
1199 template<
typename T>
1204 if (param_idx != SIOVOCB::getInvalidOrdinal()) {
1205 return params_.
getObjPtr(param_idx)->isType<T>();
1212 template<
typename T>
1215 return this->
isType(name_in, static_cast<T*>(0));
1224 return params_.
begin();
1230 return params_.
end();
1255 inline ParameterList::Iterator ParameterList::nonconstEnd()
1261 inline ParameterEntry& ParameterList::nonconstEntry(Iterator i)
1267 template<
typename T>
1269 void ParameterList::validateEntryType(
1270 const std::string &,
const std::string &name_in,
1271 const ParameterEntry &entry_in
1275 entry_in.getAny().type() !=
typeid(T), Exceptions::InvalidParameterType
1276 ,
"Error! An attempt was made to access parameter \""<<name_in<<
"\""
1277 " of type \""<<entry_in.getAny().typeName()<<
"\""
1278 "\nin the parameter (sub)list \""<<this->
name()<<
"\""
1294 template<
typename T>
1297 return l.template get<T>(name);
1306 template<
typename T>
1310 return getParameter<T>(l,name);
1320 template<
typename T>
1323 return l.template get<T>(name);
1334 template<
typename T>
1338 return l.template getPtr<T>(name);
1349 template<
typename T>
1353 return l.template getPtr<T>(name);
1363 template<
typename T>
1367 return l.
isType( name, (T*)NULL );
1377 template<
typename T>
1381 return l.
isType( name, (T*)NULL );
1396 template<
typename T>
1398 const std::string ¶mName
1404 paramList->
set(paramName,toString(array));
1472 template<
typename T>
1475 ,
const std::string ¶mName
1476 ,
const int arrayDim = -1
1477 ,
const bool mustExist =
true
1480 std::string arrayStr;
1482 arrayStr = getParameter<std::string>(paramList,paramName);
1486 *arrayStrPtr = getParameterPtr<std::string>(paramList,paramName);
1488 arrayStr = *arrayStrPtr;
1496 a = fromStringToArray<T>(arrayStr);
1501 ,
"Error! The parameter \""<<paramName<<
"\"\n"
1502 "in the sublist \""<<paramList.
name()<<
"\"\n"
1503 "exists, but the std::string value:\n"
1507 "is not a valid array represntation!"
1511 ( ( a.
size()>0 && arrayDim>=0 ) && static_cast<int>(a.
size())!=arrayDim )
1513 ,
"Error! The parameter \""<<paramName<<
"\"\n"
1514 "in the sublist \""<<paramList.
name()<<
"\"\n"
1515 "exists and is a valid array, but the dimension of\n"
1516 "the read in array a.size() = " << a.
size() <<
"\n"
1517 "was not equal to the expected size arrayDim = " << arrayDim <<
"!"
1535 template<
typename T>
1539 bool param_exists =
false;
1540 bool overwrite =
false;
1541 if (paramName == newName){
1545 param_exists =
true;
1547 "The parameter " << paramName <<
" is not of type " <<
typeid(T).name());
1549 std::logic_error,
"The parameter " << newName <<
" already exists in this "
1553 pl.
set(newName, params);
1555 return param_exists;
1565 bool mustAlreadyExist =
false,
const std::string& docString =
""
1568 return rcpWithEmbeddedObjPostDestroy(
1569 ¶mList->
sublist(name, mustAlreadyExist, docString), paramList, false );
1581 return rcpWithEmbeddedObjPostDestroy(
1582 ¶mList->
sublist(name), paramList, false );
void print() const
Print function to use in debugging in a debugger.
bool replaceParameterWithArray(const std::string ¶mName, const std::string &newName, ParameterList &pl)
Replace a parameter with an array containing the parameter.
Object held as the "value" in the Teuchos::ParameterList std::map.
const std::string & name() const
The name of this ParameterList.
C++ Standard Library compatable filtered iterator.
Ordinal getObjOrdinalIndex(const std::string &key) const
Get the ordinal index given the string key.
ParameterList & setEntry(const std::string &name, U &&entry)
Set a parameter directly as a ParameterEntry.
ConstIterator end() const
An iterator pointing beyond the last entry.
Array< T > getArrayFromStringParameter(const ParameterList ¶mList, const std::string ¶mName, const int arrayDim=-1, const bool mustExist=true)
Get an Array object (with entries of type T) from a parameter holding a std::string representation of...
RCP< ParameterEntry > getEntryRCP(const std::string &name)
Retrieves the RCP for an entry with the name name if it exists.
void setValidator(RCP< const ParameterEntryValidator > const &validator)
Set the validator.
RCP< const ParameterEntryValidator > validator() const
Return the (optional) validator object.
RCP< ParameterList > createParameterList()
Nonmember constructor.
RCP< ParameterList > createParameterList(const std::string &name)
Nonmember constructor.
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
bool nonnull(const std::shared_ptr< T > &p)
Returns true if p.get()!=NULL.
This object is held as the "value" in the Teuchos::ParameterList std::map.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool isParameterType(ParameterList &l, const std::string &name)
A templated helper function for determining the type of a parameter entry for a non-const list...
Ordinal setObj(const std::string &key, U &&obj)
Set (or reset) object by value and return its ordinal index.
bool isType() const
Test the type of the data being contained.
RCP< ParameterList > sublist(const RCP< ParameterList > ¶mList, const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Return a RCP to a sublist in another RCP-ed parameter list.
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Templated set method.
void recursivelySetValidator(RCP< const ParameterEntryValidator > const &validator, int const depth=1000)
Recursively attach a validator to parameters of type T.
const T * getParameterPtr(const ParameterList &l, const std::string &name)
A templated helper function for getting a pointer to a parameter from a non-const list...
ParameterEntry * getEntryPtr(const std::string &name)
Retrieves the pointer for an entry with the name name if it exists.
RCP< ParameterList > parameterList()
Nonmember constructor.
ConstIterator end() const
bool isParameter(const std::string &name) const
Whether the given parameter exists in this list.
bool remove(std::string const &name, bool throwIfNotExists=true)
Remove a parameter (does not depend on the type of the parameter).
std::ostream & operator<<(std::ostream &os, const ParameterList &l)
Output stream operator for handling the printing of the parameter list.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
bool isSublist(const std::string &name) const
Whether the given sublist exists in this list.
bool isParameterType(const ParameterList &l, const std::string &name)
A templated helper function for determining the type of a parameter entry for a const list...
bool operator!=(const ParameterList &list1, const ParameterList &list2)
Returns true if two parameter lists are not the same.
RCP< ParameterList > parameterList(const ParameterList &source)
Nonmember constructor.
params_t::ConstIterator ConstIterator
Parameter container const iterator typedef.
const T & getParameter(const ParameterList &l, const std::string &name)
A templated helper function for getting a parameter from a const list. This helper function prevents ...
Utility class for setting and passing in print options.
T & getParameter(ParameterList &l, const std::string &name)
A templated helper function for getting a parameter from a non-const list. This helper function preve...
ConstIterator begin() const
An iterator pointing to the first entry.
RCP< const ParameterList > sublist(const RCP< const ParameterList > ¶mList, const std::string &name)
Return a RCP to a sublist in another RCP-ed parameter list.
T * getParameterPtr(ParameterList &l, const std::string &name)
A templated helper function for getting a pointer to a parameter from a non-const list...
Ptr< const ObjType > getObjPtr(const Ordinal &idx) const
Get a const semi-persisting association with the stored object indexed by ordinal.
T * getPtr(const std::string &name)
Retrieves the pointer for parameter name of type T from a list. A null pointer is returned if this pa...
A list of parameters of arbitrary type.
Provides std::map class for deficient platforms.
Parameter List Modifier class.
const ParameterEntry & entry(ConstIterator i) const
Access to ParameterEntry (i.e., returns i->second)
Templated array class derived from the STL std::vector.
RCP< const ParameterListModifier > getModifier() const
Return the optional modifier object.
Default traits class that just returns typeid(T).name().
ConstIterator begin() const
void setStringParameterFromArray(const std::string ¶mName, const Array< T > &array, ParameterList *paramList)
Set a std::string parameter representation of an array.
bool isType(const std::string &name) const
Whether the given parameter exists in this list and has type T.
EValidateDefaults
Validation defaults enum.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Creates an empty sublist and returns a reference to the sublist name. If the list already exists...
ParameterList & setName(const std::string &name)
Set the name of *this list.
Smart reference counting pointer class for automatic garbage collection.
ParameterEntry & getEntry(const std::string &name)
Retrieves an entry with the name name.
Ptr< ObjType > getNonconstObjPtr(const Ordinal &idx)
Get a nonconst semi-persisting association with the stored object indexed by ordinal.
EValidateUsed
Validation used enum.
RCP< ParameterList > parameterList(const std::string &name)
Nonmember constructor.
Reference-counted pointer class and non-member templated function implementations.
Base types for StringIndexedOrderedValueObjectContainer.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
This macro is designed to be a short version of TEUCHOS_TEST_FOR_EXCEPTION() that is easier to call...
Simple wrapper class for raw pointers to single objects where no persisting relationship exists...
static std::string name()
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes...