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