42 #ifndef TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
43 #define TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
45 #include "Teuchos_ParameterEntryValidator.hpp"
47 #include "Teuchos_ParameterListExceptions.hpp"
50 #include "Teuchos_Assert.hpp"
55 #ifdef HAVE_TEUCHOSCORE_QUADMATH
56 # include <quadmath.h>
57 #endif // HAVE_TEUCHOSCORE_QUADMATH
91 template<
class IntegralType>
115 const std::string& defaultParameterName,
116 const bool caseSensitive =
true);
143 std::string
const& defaultParameterName,
144 const bool caseSensitive =
true);
178 const std::string& defaultParameterName,
179 const bool caseSensitive =
true);
195 const std::string &str,
const std::string ¶mName =
"",
196 const std::string &sublistName =
""
216 const std::string ¶mName =
"",
217 const std::string &sublistName =
"",
218 const bool activeQuery =
true)
const;
237 const std::string ¶mName =
"",
238 const std::string &sublistName =
"",
239 const bool activeQuery =
true)
const;
249 const std::string& paramName,
250 const std::string& defaultValue)
const;
257 const std::string &defaultValue
285 const std::string &str,
const std::string ¶mName =
"",
286 const std::string &sublistName =
""
294 return caseSensitive_;
306 std::string
const& docString,
317 std::string
const& paramName,
318 std::string
const& sublistName
324 std::string defaultParameterName_;
325 std::string validValues_;
329 typedef std::map<std::string,IntegralType> map_t;
332 const bool caseSensitive_;
343 static std::string upperCase (
const std::string s) {
344 std::string s_upper = s;
345 std::transform (s_upper.begin (), s_upper.end (), s_upper.begin (), ::toupper);
355 template<
class IntegralType>
356 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
357 stringToIntegralParameterEntryValidator(
358 ArrayView<const std::string>
const& strings,
359 std::string
const& defaultParameterName
367 template<
class IntegralType>
368 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
369 stringToIntegralParameterEntryValidator(
370 ArrayView<const std::string>
const& strings,
371 std::string
const& defaultParameterName,
372 const bool caseSensitive
380 template<
class IntegralType>
381 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
382 stringToIntegralParameterEntryValidator(
383 ArrayView<const std::string>
const& strings,
384 ArrayView<const IntegralType>
const& integralValues,
385 std::string
const& defaultParameterName
393 template<
class IntegralType>
394 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
395 stringToIntegralParameterEntryValidator(
396 ArrayView<const std::string>
const& strings,
397 ArrayView<const IntegralType>
const& integralValues,
398 std::string
const& defaultParameterName,
399 const bool caseSensitive
407 template<
class IntegralType>
408 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
409 stringToIntegralParameterEntryValidator(
410 ArrayView<const std::string>
const& strings,
411 ArrayView<const std::string>
const& stringsDocs,
412 ArrayView<const IntegralType>
const& integralValues,
413 std::string
const& defaultParameterName
421 template<
class IntegralType>
422 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
423 stringToIntegralParameterEntryValidator(
424 ArrayView<const std::string>
const& strings,
425 ArrayView<const std::string>
const& stringsDocs,
426 ArrayView<const IntegralType>
const& integralValues,
427 std::string
const& defaultParameterName,
428 const bool caseSensitive
442 template<
class IntegralType>
443 void setStringToIntegralParameter(
444 std::string
const& paramName,
445 std::string
const& defaultValue,
446 std::string
const& docString,
447 ArrayView<const std::string>
const& strings,
448 ParameterList * paramList
463 template<
class IntegralType>
464 void setStringToIntegralParameter(
465 std::string
const& paramName,
466 std::string
const& defaultValue,
467 std::string
const& docString,
468 ArrayView<const std::string>
const& strings,
469 ArrayView<const IntegralType>
const& integralValues,
470 ParameterList * paramList
485 template<
class IntegralType>
486 void setStringToIntegralParameter(
487 std::string
const& paramName,
488 std::string
const& defaultValue,
489 std::string
const& docString,
490 ArrayView<const std::string>
const& strings,
491 ArrayView<const std::string>
const& stringsDocs,
492 ArrayView<const IntegralType>
const& integralValues,
493 ParameterList * paramList
507 template<
class IntegralType>
508 IntegralType getIntegralValue(
509 ParameterList
const& paramList, std::string
const& paramName
524 template<
class IntegralType>
525 std::string getStringValue(
526 ParameterList
const& paramList, std::string
const& paramName
535 template<
class IntegralType>
536 RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
538 ParameterEntry
const& entry, ParameterList
const& paramList,
539 std::string
const& paramName
548 std::string getVerbosityLevelParameterValueName(
557 RCP<StringToIntegralParameterEntryValidator<EVerbosityLevel> >
558 verbosityLevelParameterEntryValidator(std::string
const& defaultParameterName);
565 template<
class IntegralType>
582 template<
class IntegralType>
586 return stringToIntegralParameterEntryValidator<IntegralType>(
587 tuple<std::string>(
""), tuple<std::string>(
""),
588 tuple<IntegralType>((IntegralType)1),
"");
621 const std::string &sublistName =
"",
const bool activeQuery =
true
629 const int defaultValue
638 const std::string getXMLTypeName()
const;
642 std::string
const& docString,
648 validStringValues()
const;
653 std::string
const& paramName,
654 std::string
const& sublistName
658 void validateAndModify(
659 std::string
const& paramName,
660 std::string
const& sublistName,
671 std::string acceptedTypesString_;
676 void finishInitialization();
680 std::string
const& paramName,
681 std::string
const& sublistName
693 boolParameterEntryValidator();
718 enum EPreferredType { PREFER_INT, PREFER_LONG_LONG, PREFER_DOUBLE, PREFER_STRING };
726 :allowInt_(allowAllTypesByDefault)
727 ,allowLongLong_(allowAllTypesByDefault)
728 ,allowDouble_(allowAllTypesByDefault)
729 ,allowString_(allowAllTypesByDefault)
733 { allowInt_ = _allowInt;
return *
this; }
736 { allowLongLong_ = _allowLongLong;
return *
this; }
739 { allowDouble_ = _allowDouble;
return *
this; }
742 { allowString_ = _allowString;
return *
this; }
779 EPreferredType
const preferredType,
780 AcceptedTypes
const& acceptedTypes
795 const std::string &sublistName =
"",
const bool activeQuery =
true
803 long long getLongLong(
805 const std::string &sublistName =
"",
const bool activeQuery =
true
813 const std::string &sublistName =
"",
const bool activeQuery =
true
817 std::string getString(
819 const std::string &sublistName =
"",
const bool activeQuery =
true
827 const int defaultValue
833 long long getLongLong(
835 const long long defaultValue
843 const double defaultValue
849 std::string getString(
851 const std::string &defaultValue
856 bool isIntAllowed()
const;
860 bool isLongLongAllowed()
const;
864 bool isDoubleAllowed()
const;
868 bool isStringAllowed()
const;
872 EPreferredType getPreferredType()
const;
879 return getIntEnumString ();
880 case PREFER_LONG_LONG:
881 return getLongLongEnumString ();
883 return getDoubleEnumString ();
885 return getStringEnumString ();
887 const std::string typeString (toString (enumValue));
888 throw std::runtime_error(
"Cannot convert enumValue: " + typeString +
" to a string");
895 if (enumString == getIntEnumString ()) {
898 else if (enumString == getLongLongEnumString ()) {
899 return PREFER_LONG_LONG;
901 else if (enumString == getDoubleEnumString ()) {
902 return PREFER_DOUBLE;
904 else if (enumString == getStringEnumString ()) {
905 return PREFER_STRING;
908 throw std::runtime_error (
"Cannot convert enumString: " + enumString +
" to an enum");
918 const std::string getXMLTypeName()
const;
922 std::string
const& docString,
928 validStringValues()
const;
933 std::string
const& paramName,
934 std::string
const& sublistName
938 void validateAndModify(
939 std::string
const& paramName,
940 std::string
const& sublistName,
952 EPreferredType preferredType_;
953 std::string acceptedTypesString_;
957 #pragma warning(push)
958 #pragma warning(disable:4251)
960 const AcceptedTypes acceptedTypes_;
969 static const std::string& getIntEnumString(){
971 return intEnumString_;
975 static const std::string& getLongLongEnumString(){
977 return longLongEnumString_;
981 static const std::string& getDoubleEnumString(){
983 return doubleEnumString_;
987 static const std::string& getStringEnumString(){
989 return stringEnumString_;
993 void finishInitialization();
996 ParameterEntry
const& entry,
997 std::string
const& paramName,
998 std::string
const& sublistName
1011 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1012 anyNumberParameterEntryValidator();
1019 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1020 anyNumberParameterEntryValidator(
1022 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
1030 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
void setIntParameter(
1031 std::string
const& paramName,
1032 int const value, std::string
const& docString,
1033 ParameterList *paramList,
1034 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
1035 = AnyNumberParameterEntryValidator::AcceptedTypes()
1044 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
void setLongLongParameter(
1045 std::string
const& paramName,
1046 long long const value, std::string
const& docString,
1047 ParameterList *paramList,
1048 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
1049 = AnyNumberParameterEntryValidator::AcceptedTypes()
1057 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
void setDoubleParameter(
1058 std::string
const& paramName,
1059 double const& value, std::string
const& docString,
1060 ParameterList *paramList,
1061 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
1062 = AnyNumberParameterEntryValidator::AcceptedTypes()
1071 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
void setNumericStringParameter(
1072 std::string
const& paramName,
1073 std::string
const& value, std::string
const& docString,
1074 ParameterList *paramList,
1075 AnyNumberParameterEntryValidator::AcceptedTypes
const& acceptedTypes
1076 = AnyNumberParameterEntryValidator::AcceptedTypes()
1094 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
int getIntParameter(
1095 ParameterList
const& paramList, std::string
const& paramName
1113 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
long long getLongLongParameter(
1114 ParameterList
const& paramList, std::string
const& paramName
1131 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
double getDoubleParameter(
1132 ParameterList
const& paramList,
1133 std::string
const& paramName
1152 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT std::string getNumericStringParameter(
1153 ParameterList
const& paramList,
1154 std::string
const& paramName
1188 return T::this_type_is_missing_a_specialization();
1239 class EnhancedNumberTraits<short int>{
1241 static inline short int min() {
return std::numeric_limits<short int>::min(); }
1242 static inline short int max() {
return std::numeric_limits<short int>::max(); }
1243 static inline short int defaultStep() {
return 1; }
1249 class EnhancedNumberTraits<short unsigned int>{
1251 static inline short unsigned int min() {
return std::numeric_limits<short unsigned int>::min(); }
1252 static inline short unsigned int max() {
return std::numeric_limits<short unsigned int>::max(); }
1253 static inline short unsigned int defaultStep() {
return 1; }
1259 class EnhancedNumberTraits<int>{
1261 static inline int min() {
return std::numeric_limits<int>::min(); }
1262 static inline int max() {
return std::numeric_limits<int>::max(); }
1269 class EnhancedNumberTraits<unsigned int>{
1271 static inline unsigned int min() {
return std::numeric_limits<unsigned int>::min(); }
1272 static inline unsigned int max() {
return std::numeric_limits<unsigned int>::max(); }
1273 static inline unsigned int defaultStep() {
return 1; }
1279 class EnhancedNumberTraits<long int>{
1281 static inline long int min() {
return std::numeric_limits<long int>::min(); }
1282 static inline long int max() {
return std::numeric_limits<long int>::max(); }
1283 static inline long int defaultStep() {
return 1; }
1289 class EnhancedNumberTraits<long unsigned int>{
1291 static inline long unsigned int min() {
return std::numeric_limits<long unsigned int>::min(); }
1292 static inline long unsigned int max() {
return std::numeric_limits<long unsigned int>::max(); }
1293 static inline long unsigned int defaultStep() {
return 1; }
1299 class EnhancedNumberTraits<long long int>{
1301 static inline long long int min() {
return std::numeric_limits<long long int>::min(); }
1302 static inline long long int max() {
return std::numeric_limits<long long int>::max(); }
1303 static inline long long int defaultStep() {
return 1; }
1309 class EnhancedNumberTraits<long long unsigned int>{
1311 static inline long long unsigned int min() {
return std::numeric_limits<long long unsigned int>::min(); }
1312 static inline long long unsigned int max() {
return std::numeric_limits<long long unsigned int>::max(); }
1313 static inline long long unsigned int defaultStep() {
return 1; }
1318 #ifdef HAVE_TEUCHOSCORE_QUADMATH
1320 class EnhancedNumberTraits<__float128>{
1322 static inline __float128
min() {
return -std::numeric_limits<__float128>::max(); }
1323 static inline __float128
max() {
return std::numeric_limits<__float128>::max(); }
1324 static inline __float128
defaultStep() {
return 1; }
1327 #endif // HAVE_TEUCHOSCORE_QUADMATH
1330 class EnhancedNumberTraits<double>{
1332 static inline double min() {
return -std::numeric_limits<double>::max(); }
1333 static inline double max() {
return std::numeric_limits<double>::max(); }
1338 #ifdef HAVE_TEUCHOS_LONG_DOUBLE
1340 class EnhancedNumberTraits<long double>{
1342 static inline long double min() {
return -std::numeric_limits<long double>::max(); }
1343 static inline long double max() {
return std::numeric_limits<long double>::max(); }
1344 static inline long double defaultStep() {
return 1; }
1350 class EnhancedNumberTraits<float>{
1352 static inline float min() {
return -std::numeric_limits<float>::max(); }
1353 static inline float max() {
return std::numeric_limits<float>::max(); }
1391 minVal(min), maxVal(max), step_(step), precision_(precision),
1392 containsMin(true), containsMax(true){}
1404 containsMax(false){}
1442 precision_ = precision;
1515 std::string
const &sublistName)
const;
1523 const bool activeQuery)
const;
1531 void printDoc(std::string
const &docString, std::ostream &out)
const{
1533 out <<
"#\tValidator Used: " << std::endl;
1534 out <<
"#\t\tNumber Validator" << std::endl;
1537 out <<
"#\t\tMin (inclusive): " << minVal << std::endl;
1538 out <<
"#\t\tMax (inclusive): " << maxVal << std::endl;
1551 bool useIntConversions()
const;
1573 unsigned short precision_;
1589 std::string
const& paramName,
1590 std::string
const& sublistName,
1598 if( anyValue.
type() ==
typeid(std::string) ) {
1599 anyValue = getNumberFromString(*entry,
false);
1601 any_cast<T>(anyValue),
1608 paramName, sublistName, entry);
1620 if(
typeid(T) ==
typeid(
char))
return true;
1621 if(
typeid(T) ==
typeid(
unsigned char))
return true;
1622 if(
typeid(T) ==
typeid(
int))
return true;
1623 if(
typeid(T) ==
typeid(
unsigned int))
return true;
1624 if(
typeid(T) ==
typeid(
short))
return true;
1625 if(
typeid(T) ==
typeid(
unsigned short))
return true;
1626 if(
typeid(T) ==
typeid(
long))
return true;
1627 if(
typeid(T) ==
typeid(
unsigned long))
return true;
1628 if(
typeid(T) ==
typeid(
long long))
return true;
1629 if(
typeid(T) ==
typeid(
unsigned long long))
return true;
1646 const any &anyValue = entry.
getAny(activeQuery);
1647 if(useIntConversions()) {
1648 return any((T)convertStringToInt(any_cast<std::string>(anyValue)));
1651 return any((T)convertStringToDouble(any_cast<std::string>(anyValue)));
1657 std::string
const &sublistName)
const
1665 if( anyValue.
type() ==
typeid(std::string) ) {
1667 anyValue = getNumberFromString(entry,
false);
1673 "The \"" << paramName <<
"\"" <<
1674 " parameter in the \"" << sublistName <<
1675 "\" sublist is has an error." << std::endl << std::endl <<
1676 "Error: The value that you entered was the wrong type." << std::endl <<
1677 "Parameter: " << paramName << std::endl <<
1678 "Type specified: " << entryName << std::endl <<
1681 bool isValueInRange;
1682 any_cast<T>(anyValue) >= minVal && any_cast<T>(anyValue) <= maxVal
1683 ? isValueInRange =
true : isValueInRange=
false;
1686 "The \"" << paramName <<
"\"" <<
1687 " parameter in the \"" << sublistName <<
1688 "\" sublist is has an error." << std::endl << std::endl <<
1689 "Error: The value that was entered doesn't fall with in " <<
1690 "the range set by the validator" << std::endl <<
1691 "Parameter: " << paramName << std::endl <<
1692 "Min: " << minVal << std::endl <<
1693 "Max: " << maxVal << std::endl <<
1694 "Value entered: " <<
1695 (any_cast<T>(anyValue)) << std::endl << std::endl);
1767 bool fileMustExist()
const;
1782 bool fileEmptyNameOK()
const;
1797 bool setFileMustExist(
bool shouldFileExist);
1807 bool setFileEmptyNameOK(
bool isEmptyNameOK);
1815 ValidStringsList validStringValues()
const;
1820 std::string
const ¶mName,
1821 std::string
const &sublistName)
const;
1824 const std::string getXMLTypeName()
const;
1827 void printDoc(std::string
const &docString, std::ostream &out)
const;
1839 bool mustAlreadyExist_;
1904 ValidStringsList setValidStrings(
1913 ValidStringsList validStringValues()
const;
1916 void validate(
ParameterEntry const &entry, std::string
const ¶mName,
1917 std::string
const &sublistName)
const;
1920 const std::string getXMLTypeName()
const;
1923 void printDoc(std::string
const &docString, std::ostream &out)
const;
1934 ValidStringsList validStrings_;
1966 template<
class Val
idatorType,
class EntryType>
1982 prototypeValidator_(prototypeValidator){}
1991 return prototypeValidator_;
2001 return prototypeValidator_->validStringValues();
2034 template<
class Val
idatorType,
class EntryType>
2056 std::string
const &sublistName)
const;
2060 return "TwoDArrayValidator(" +
2066 virtual void printDoc(std::string
const &docString, std::ostream &out)
const
2069 std::string toPrint;
2070 toPrint +=
"TwoDArrayValidator:\n";
2071 toPrint +=
"Prototype Validator:\n";
2079 template<
class Val
idatorType,
class EntryType>
2081 std::string
const &sublistName)
const
2087 "The \"" << paramName <<
"\"" <<
2088 " parameter in the \"" << sublistName <<
2089 "\" sublist is has an error." << std::endl << std::endl <<
2090 "Error: The value you entered was the wrong type." << std::endl <<
2091 "Parameter: " << paramName << std::endl <<
2092 "Type specified: " << entryName << std::endl <<
2094 std::endl << std::endl);
2097 getValue<Teuchos::TwoDArray<EntryType> >(entry);
2099 for(
int i = 0; i<extracted.getNumRows(); ++i){
2100 for(
int j = 0; j<extracted.getNumCols(); ++j){
2102 dummyParameter.
setValue(extracted(i,j));
2104 prototype->validate(
2105 dummyParameter, paramName, sublistName);
2108 std::stringstream oss;
2109 oss <<
"TwoDArray Validator Exception:" << std::endl <<
2110 "Bad Index: (" << i <<
"," << j <<
")" << std::endl << e.what();
2123 template<
class Val
idatorType,
class EntryType>
2140 template<
class Val
idatorType,
class EntryType>
2219 template<
class Val
idatorType,
class EntryType>
2242 std::string
const &sublistName)
const;
2246 return "ArrayValidator(" +
2252 virtual void printDoc(std::string
const &docString, std::ostream &out)
const
2255 std::string toPrint;
2256 toPrint +=
"ArrayValidator:\n";
2257 toPrint +=
"Prototype Validator:\n";
2265 template<
class Val
idatorType,
class EntryType>
2267 std::string
const &sublistName)
const
2273 "The \"" << paramName <<
"\"" <<
2274 " parameter in the \"" << sublistName <<
2275 "\" sublist is has an error." << std::endl << std::endl <<
2276 "Error: The value you entered was the wrong type." << std::endl <<
2277 "Parameter: " << paramName << std::endl <<
2278 "Type specified: " << entryName << std::endl <<
2280 std::endl << std::endl);
2283 getValue<Teuchos::Array<EntryType> >(entry);
2285 for(
int i = 0; i<extracted.size(); ++i){
2287 dummyParameter.
setValue(extracted[i]);
2289 prototype->validate(
2290 dummyParameter, paramName, sublistName);
2293 std::stringstream oss;
2294 oss <<
"Array Validator Exception:" << std::endl <<
2295 "Bad Index: " << i << std::endl << e.what();
2306 template<
class Val
idatorType,
class EntryType>
2323 template<
class Val
idatorType,
class EntryType>
2417 template<
class IntegralType>
2418 StringToIntegralParameterEntryValidator<IntegralType>::
2420 std::string
const& defaultParameterName,
2421 const bool caseSensitive) :
2423 defaultParameterName_ (defaultParameterName),
2424 caseSensitive_ (caseSensitive)
2426 typedef typename map_t::value_type val_t;
2427 for (
int i = 0; i < static_cast<int> (strings.
size ()); ++i) {
2428 const bool unique = caseSensitive_ ?
2429 map_.insert (val_t (strings[i], static_cast<IntegralType> (i))).second :
2430 map_.insert (val_t (upperCase (strings[i]), static_cast<IntegralType> (i))).second;
2432 ! unique, std::logic_error,
2433 "For parameter \"" << defaultParameterName_ <<
"\": "
2434 "strings[" << i <<
"] = \"" << strings[i] <<
"\" is a duplicate.");
2436 setValidValues (strings);
2440 template<
class IntegralType>
2444 std::string
const& defaultParameterName,
2445 const bool caseSensitive) :
2447 defaultParameterName_ (defaultParameterName),
2448 caseSensitive_ (caseSensitive)
2450 #ifdef TEUCHOS_DEBUG
2454 strings.
size() != integralValues.
size(),
2456 "The input arrays strings and integralValues must have the same length.");
2458 typedef typename map_t::value_type val_t;
2459 for (
int i = 0; i < static_cast<int> (strings.
size ()); ++i) {
2460 const bool unique = caseSensitive_ ?
2461 map_.insert (val_t (strings[i], integralValues[i])).second :
2462 map_.insert (val_t (upperCase (strings[i]), integralValues[i])).second;
2465 ! unique, std::logic_error,
2466 "For parameter \"" << defaultParameterName_ <<
"\": "
2467 "strings[" << i <<
"] = \"" << strings[i] <<
"\" is a duplicate.");
2469 setValidValues (strings);
2472 template<
class IntegralType>
2477 std::string
const& defaultParameterName,
2478 const bool caseSensitive) :
2480 defaultParameterName_ (defaultParameterName),
2481 caseSensitive_ (caseSensitive)
2483 #ifdef TEUCHOS_DEBUG
2489 strings.
size() != integralValues.
size(),
2491 "The input arrays strings and integralValues must have the same length.");
2494 strings.
size() != stringsDocs.
size(),
2496 "The input arrays strings and stringsDocs must have the same length.");
2498 typedef typename map_t::value_type val_t;
2499 for (
int i = 0; i < static_cast<int> (strings.
size ()); ++i) {
2500 const bool unique = caseSensitive_ ?
2501 map_.insert (val_t (strings[i], integralValues[i])).second :
2502 map_.insert (val_t (upperCase (strings[i]), integralValues[i])).second;
2504 ! unique, std::logic_error,
2505 "For parameter \"" << defaultParameterName_ <<
"\": "
2506 "strings[" << i <<
"] = \"" << strings[i] <<
"\" is a duplicate.");
2508 setValidValues(strings,&stringsDocs);
2514 template<
class IntegralType>
2517 const std::string &str,
const std::string ¶mName
2518 ,
const std::string &sublistName
2521 typename map_t::const_iterator itr = map_.find (caseSensitive_ ? str : upperCase (str));
2524 ,
"Error, the value \"" << str <<
"\" is not recognized for the parameter \""
2525 << ( paramName.length() ? paramName : defaultParameterName_ ) <<
"\""
2526 <<
"\nin the sublist \"" << sublistName <<
"\"."
2527 <<
"\n\nValid values include:"
2532 return (*itr).second;
2536 template<
class IntegralType>
2540 ,
const std::string &sublistName,
const bool activeQuery
2543 const bool validType = ( entry.
getAny(activeQuery).
type() ==
typeid(std::string) );
2546 ,
"Error, the parameter {paramName=\""<<(paramName.length()?paramName:defaultParameterName_)
2548 <<
"\nin the sublist \"" << sublistName <<
"\""
2549 <<
"\nhas the wrong type."
2550 <<
"\n\nThe correct type is \"string\"!"
2553 &strValue = any_cast<std::string>(entry.
getAny(activeQuery));
2554 return getIntegralValue(strValue,paramName,sublistName);
2558 template<
class IntegralType>
2562 ,
const std::string &sublistName,
const bool activeQuery
2566 this->getIntegralValue(entry,paramName,sublistName,activeQuery);
2568 return any_cast<std::string>(entry.
getAny(activeQuery));
2572 template<
class IntegralType>
2576 ,
const std::string &defaultValue
2579 const std::string& strValue =
2580 paramList.
get (paramName,
2581 caseSensitive_ ? defaultValue : upperCase (defaultValue));
2582 return getIntegralValue (strValue, paramName, paramList.
name ());
2586 template<
class IntegralType>
2590 ,
const std::string &defaultValue
2593 const std::string& strValue =
2594 paramList.
get (paramName,
2595 caseSensitive_ ? defaultValue : upperCase (defaultValue));
2596 getIntegralValue(strValue,paramName,paramList.
name());
2600 template<
class IntegralType>
2604 return validStringValuesDocs_;
2607 template<
class IntegralType>
2611 return defaultParameterName_;
2614 template<
class IntegralType>
2617 const std::string &str,
const std::string ¶mName
2618 ,
const std::string &sublistName
2621 getIntegralValue (caseSensitive_ ? str : upperCase (str),
2630 template<
class IntegralType>
2636 template<
class IntegralType>
2638 std::string
const& docString
2643 out <<
"# Valid std::string values:\n";
2645 if(validStringValuesDocs_.get()) {
2646 for(
int i = 0; i < static_cast<int>(validStringValues_->size()); ++i ) {
2647 out <<
"# \"" << (*validStringValues_)[i] <<
"\"\n";
2660 template<
class IntegralType>
2664 return validStringValues_;
2668 template<
class IntegralType>
2671 ,std::string
const& paramName
2672 ,std::string
const& sublistName
2675 this->getIntegralValue (entry, paramName, sublistName,
false);
2681 template<
class IntegralType>
2687 if (caseSensitive_) {
2691 RCP<Array<std::string> > vals (
new Array<std::string> (strings.
size ()));
2693 (*vals)[i] = upperCase (strings[i]);
2695 validStringValues_ = rcp_const_cast<
const Array<std::string> > (vals);
2699 validStringValuesDocs_ =
rcp (
new Array<std::string> (*stringsDocs));
2702 std::ostringstream oss;
2703 for (
int i = 0; i < static_cast<int> (strings.
size()); ++i) {
2704 oss <<
" \"" << strings[i] <<
"\"\n";
2707 validValues_ = oss.str();
2719 template<
class IntegralType>
2722 Teuchos::stringToIntegralParameterEntryValidator(
2723 ArrayView<const std::string>
const& strings,
2724 std::string
const& defaultParameterName
2728 new StringToIntegralParameterEntryValidator<IntegralType>(
2729 strings, defaultParameterName
2735 template<
class IntegralType>
2738 Teuchos::stringToIntegralParameterEntryValidator(
2739 ArrayView<const std::string>
const& strings,
2740 std::string
const& defaultParameterName,
2741 const bool caseSensitive
2744 typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2745 return rcp (
new ret_type (strings, defaultParameterName, caseSensitive));
2750 template<
class IntegralType>
2753 Teuchos::stringToIntegralParameterEntryValidator(
2754 ArrayView<const std::string>
const& strings,
2755 ArrayView<const IntegralType>
const& integralValues,
2756 std::string
const& defaultParameterName
2760 new StringToIntegralParameterEntryValidator<IntegralType>(
2761 strings, integralValues, defaultParameterName
2767 template<
class IntegralType>
2770 Teuchos::stringToIntegralParameterEntryValidator(
2771 ArrayView<const std::string>
const& strings,
2772 ArrayView<const IntegralType>
const& integralValues,
2773 std::string
const& defaultParameterName,
2774 const bool caseSensitive)
2776 typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2777 return rcp (
new ret_type (strings, integralValues,
2778 defaultParameterName, caseSensitive));
2782 template<
class IntegralType>
2785 Teuchos::stringToIntegralParameterEntryValidator(
2786 ArrayView<const std::string>
const& strings,
2787 ArrayView<const std::string>
const& stringsDocs,
2788 ArrayView<const IntegralType>
const& integralValues,
2789 std::string
const& defaultParameterName
2793 new StringToIntegralParameterEntryValidator<IntegralType>(
2794 strings, stringsDocs, integralValues, defaultParameterName
2800 template<
class IntegralType>
2803 Teuchos::stringToIntegralParameterEntryValidator(
2804 ArrayView<const std::string>
const& strings,
2805 ArrayView<const std::string>
const& stringsDocs,
2806 ArrayView<const IntegralType>
const& integralValues,
2807 std::string
const& defaultParameterName,
2808 const bool caseSensitive)
2810 typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2811 return rcp (
new ret_type (strings, stringsDocs, integralValues,
2812 defaultParameterName, caseSensitive));
2816 template<
class IntegralType>
2817 void Teuchos::setStringToIntegralParameter(
2818 std::string
const& paramName,
2819 std::string
const& defaultValue,
2820 std::string
const& docString,
2821 ArrayView<const std::string>
const& strings,
2822 ParameterList * paramList
2825 typedef ParameterEntryValidator PEV;
2828 paramName, defaultValue, docString,
2829 rcp_implicit_cast<const PEV>(
2830 stringToIntegralParameterEntryValidator<IntegralType>(
2838 template<
class IntegralType>
2839 void Teuchos::setStringToIntegralParameter(
2840 std::string
const& paramName,
2841 std::string
const& defaultValue,
2842 std::string
const& docString,
2843 ArrayView<const std::string>
const& strings,
2844 ArrayView<const IntegralType>
const& integralValues,
2845 ParameterList * paramList
2848 typedef ParameterEntryValidator PEV;
2851 paramName, defaultValue, docString,
2852 rcp_implicit_cast<const PEV>(
2853 stringToIntegralParameterEntryValidator<IntegralType>(
2854 strings, integralValues, paramName
2861 template<
class IntegralType>
2862 void Teuchos::setStringToIntegralParameter(
2863 std::string
const& paramName,
2864 std::string
const& defaultValue,
2865 std::string
const& docString,
2866 ArrayView<const std::string>
const& strings,
2867 ArrayView<const std::string>
const& stringsDocs,
2868 ArrayView<const IntegralType>
const& integralValues,
2869 ParameterList * paramList
2873 typedef ParameterEntryValidator PEV;
2876 paramName, defaultValue, docString,
2877 rcp_implicit_cast<const PEV>(
2878 stringToIntegralParameterEntryValidator<IntegralType>(
2879 strings, stringsDocs, integralValues, paramName
2886 template<
class IntegralType>
2887 IntegralType Teuchos::getIntegralValue(
2888 ParameterList
const& paramList, std::string
const& paramName
2891 const ParameterEntry &entry = paramList.getEntry(paramName);
2892 RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
2893 integralValidator = getStringToIntegralParameterEntryValidator<IntegralType>(
2894 entry, paramList, paramName
2896 return integralValidator->getIntegralValue(
2897 entry, paramName, paramList.name(), true );
2901 template<
class IntegralType>
2902 std::string Teuchos::getStringValue(
2903 ParameterList
const& paramList, std::string
const& paramName
2906 const ParameterEntry &entry = paramList.getEntry(paramName);
2907 RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
2908 integralValidator = getStringToIntegralParameterEntryValidator<IntegralType>(
2909 entry, paramList, paramName
2911 return integralValidator->getStringValue(
2912 entry, paramName, paramList.name(), true
2917 template<
class IntegralType>
2920 ParameterEntry
const& entry, ParameterList
const& paramList,
2921 std::string
const& paramName
2924 const RCP<const ParameterEntryValidator> validator = entry.validator();
2926 is_null(validator), Exceptions::InvalidParameterType,
2927 "Error! The parameter \""<<paramName<<
"\" exists\n"
2928 "in the parameter (sub)list \""<<paramList.name()<<
"\"\n"
2929 "but it does not contain any validator needed to extract\n"
2930 "an integral value of type \""<<TypeNameTraits<IntegralType>::name()<<
"\"!"
2932 const RCP<const StringToIntegralParameterEntryValidator<IntegralType> > integralValidator =
2933 rcp_dynamic_cast<
const StringToIntegralParameterEntryValidator<IntegralType> >(
2937 is_null(integralValidator), Exceptions::InvalidParameterType,
2938 "Error! The parameter \""<<paramName<<
"\" exists\n"
2939 "in the parameter (sub)list \""<<paramList.name()<<
"\"\n"
2940 "but it contains the wrong type of validator. The expected validator type\n"
2941 "is \""<<TypeNameTraits<StringToIntegralParameterEntryValidator<IntegralType> >::name()<<
"\"\n"
2942 "but the contained validator type is \""<<
typeName(*validator)<<
"\"!"
2944 return integralValidator;
2948 #endif // TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
static bool mustAlreadyExistDefault()
The default value of the mustAlreadyExist parameter in the constructor.
A thin wrapper around the Teuchos Array class that allows for 2 dimensional arrays.
std::string validateString(const std::string &str, const std::string ¶mName="", const std::string &sublistName="") const
Validate the std::string and pass it on.
RCP< T > rcp(const boost::shared_ptr< T > &sptr)
Conversion function that takes in a boost::shared_ptr object and spits out a Teuchos::RCP object...
const std::string & name() const
The name of this ParameterList.
T getMax() const
Gets the maximum acceptable value for the validator.
bool isCaseSensitive() const
Whether this validator is case sensitive.
EnhancedNumberValidator()
Constructs a EnhancedNumberValidator without an explicit minimum or maximum.
Convience class for StringValidators that are to be applied to TwoDArrays.
void printDoc(std::string const &docString, std::ostream &out) const
Print documentation to the given output string.
static RCP< T > getDummyObject()
Retrieves a dummy object of type T.
RCP< const StringToIntegralParameterEntryValidator< IntegralType > > getStringToIntegralParameterEntryValidator(ParameterEntry const &entry, ParameterList const ¶mList, std::string const ¶mName)
Get a StringToIntegralParameterEntryValidator<IntegralType> object out of a ParameterEntry object...
void setValue(T value, bool isDefault=false, const std::string &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Templated set method that uses the input value type to determine the type of parameter.
ValidStringsList validStringValues() const
bool allowInt() const
Allow an int value?
Convience class for EnhancedNumberValidators that are to be applied to arrays.
void validateAndModify(std::string const ¶mName, std::string const &sublistName, ParameterEntry *entry) const
RCP< T2 > rcp_dynamic_cast(const RCP< T1 > &p1, bool throw_on_fail=false)
Dynamic cast of underlying RCP type from T1* to T2*.
EPreferredType
Determines what type is the preferred type.
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
This object is held as the "value" in the Teuchos::ParameterList std::map.
virtual void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
bool allowString() const
Allow an std::string value?
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
Default structure used by EnhancedNumberTraits<T> to produce a compile time error when the specializa...
void setMax(T max)
Sets the maximum acceptable value for the validator.
size_type size() const
The total number of items in the managed array.
Standard implementation of a ParameterEntryValidator that maps from a list of strings to an enum or i...
AcceptedTypes & allowString(bool _allowString)
Set allow an std::string value or not.
bool hasMax() const
Determines whether or not the validator has a maximum value.
T getMin() const
Gets the minimum acceptable value for the validator.
static std::ostream & printLines(std::ostream &os, const std::string &linePrefix, const std::string &lines)
Print lines with prefix first.
EVerbosityLevel
Verbosity level.
Modified boost::any class, which is a container for a templated value.
static EPreferredType getPrefferedTypeStringEnum(const std::string &enumString)
Gets the preferred type enum associated with a give string.
bool is_null(const ArrayRCP< T > &p)
Returns true if p.get()==NULL.
AcceptedTypes & allowInt(bool _allowInt)
Set allow an int value or not.
AbstractArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs an AbstractArrayValidator.
Takes a validator, wraps it, and applies it to a TwoDArray.
bool hasMin() const
Determines whether or not the validator has a minimum value.
unsigned short getPrecision() const
Gets the precision specified for the validator.
virtual void validateAndModify(std::string const ¶mName, std::string const &sublistName, ParameterEntry *entry) const
Validate and perhaps modify a parameter entry's value.
A std::string utilities class for Teuchos.
Determines the types that are accepted.
ValidStringsList validStringValues() const
A thin wrapper around the Array class which causes it to be interpreted as a 2D Array.
RCP< const ValidatorType > getPrototype() const
Returns the prototype validator for this Array Validator.
void printDoc(std::string const &docString, std::ostream &out) const
Convience class for StringValidators that are to be applied to arrays.
static T notDefined()
This function should not compile if there is an attempt to instantiate!
ValidStringsList validStringValues() const
Ordinal size_type
The type of Array sizes and capacities.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
Templated Parameter List class.
const std::string getXMLTypeName() const
static unsigned short defaultPrecision()
Gets the default precision with which the number type should be displayed.
void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
Validate the given ParameterEntry.
const std::string getXMLTypeName() const
Teuchos::any getNumberFromString(const ParameterEntry &entry, const bool activeQuery) const
std::string getStringValue(const ParameterEntry &entry, const std::string ¶mName="", const std::string &sublistName="", const bool activeQuery=true) const
Find the string value for the given ParameterEntry.
ArrayStringValidator(RCP< const StringValidator > prototypeValidator)
Convience class for EnhancedNumberValidators that are to be applied to TwoDArray. ...
An abstract base class for all ArrayValidators.
Standard implementation of a BoolParameterEntryValidator that accepts bool values (true/false) or str...
ArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs a ArrayValidator.
Convience class for FileNameValidators that are to be applied to TwoDArrays.
Validate a file name entry.
const std::string getXMLTypeName() const
AcceptedTypes(bool allowAllTypesByDefault=true)
Allow all types or not on construction.
void setStep(T step)
Sets the step being used for the validator.
Takes a validator, wraps it, and applies it to an array.
A list of parameters of arbitrary type.
bool allowDouble() const
Allow an double value?
A simple validator that only allows certain string values to be choosen or simply enforces that a par...
static T min()
Gets the minimum possible value the number type can take on.
TwoDArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs a ArrayValidator.
Abstract interface for an object that can validate a ParameterEntry's value.
any & getAny(bool activeQry=true)
Direct access to the Teuchos::any data value underlying this object. The bool argument activeQry (def...
void setPrecision(unsigned short precision)
Sets the precision specified for the validator.
IntegralType getIntegralValue(const std::string &str, const std::string ¶mName="", const std::string &sublistName="") const
For a string value, find its corresponding enum or integer value.
void setMin(T min)
Sets the minimum acceptable value for the validator.
EnhancedNumberValidator(T min, T max, T step=EnhancedNumberTraits< T >::defaultStep(), unsigned short precision=EnhancedNumberTraits< T >::defaultPrecision())
Constructs a EnhancedNumberValidator.
virtual void printDoc(std::string const &docString, std::ostream &out) const
RCP< const Array< std::string > > ValidStringsList
Default traits class that just returns typeid(T).name().
Class for retrieving a dummy object of type T.
bool allowLongLong() const
Allow an long long value?
static const std::string & getPrefferedTypeString(EPreferredType enumValue)
Gets the string representation of a given preferred type enum.
ArrayFileNameValidator(RCP< const FileNameValidator > prototypeValidator)
static T defaultStep()
gets default amount a value of the number type should be incremented by when being utilizied in a UI...
static T max()
Gets the maximum possible value the number type can take on.
Class uesd to validate a particular type of number.
Convience class for FileNameValidators that are to be applied to arrays.
Class defining the traits of the number type being used in an EnhancedNumberValidator.
virtual void printDoc(std::string const &docString, std::ostream &out) const
std::string typeName() const
Return the name of the type.
TwoDArrayNumberValidator(RCP< const EnhancedNumberValidator< T > > prototypeValidator)
AcceptedTypes & allowDouble(bool _allowDouble)
Set allow a double value or not.
ValidStringsList getStringDocs() const
Get a pointer to the array containing all the documentation strings.
Smart reference counting pointer class for automatic garbage collection.
TwoDArrayStringValidator(RCP< const StringValidator > prototypeValidator)
const std::type_info & type() const
Return the type of value being stored.
TwoDArrayFileNameValidator(RCP< const FileNameValidator > prototypeValidator)
virtual void validate(ParameterEntry const &entry, std::string const ¶mName, std::string const &sublistName) const
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
This macro is checks that to numbers are equal and if not then throws an exception with a good error ...
const std::string & getDefaultParameterName() const
Get the name of the default parameter for the validator.
Standard implementation of a ParameterEntryValidator that accepts numbers from a number of different ...
T getStep() const
Gets the step being used for the validator.
Defines basic traits returning the name of a type in a portable and readable way. ...
AcceptedTypes & allowLongLong(bool _allowLongLong)
Set allow an long long value or not.
#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...
const std::string getXMLTypeName() const
static std::string name()
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
ArrayNumberValidator(RCP< const EnhancedNumberValidator< T > > prototypeValidator)