Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_StandardParameterEntryValidators.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Teuchos: Common Tools Package
4 //
5 // Copyright 2004 NTESS and the Teuchos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
11 #define TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
12 
13 #include "Teuchos_ParameterEntryValidator.hpp"
15 #include "Teuchos_ParameterListExceptions.hpp"
17 #include "Teuchos_TwoDArray.hpp"
18 #include "Teuchos_Assert.hpp"
19 #include "Teuchos_StrUtils.hpp"
22 
23 #ifdef HAVE_TEUCHOSCORE_QUADMATH
24 # include <quadmath.h> // __float128 constants and functions
25 #endif // HAVE_TEUCHOSCORE_QUADMATH
26 
27 #include <locale>
28 
29 
30 namespace Teuchos {
31 
59 template<class IntegralType>
61 public:
64 
83  const std::string& defaultParameterName,
84  const bool caseSensitive = true);
85 
110  const ArrayView<const IntegralType>& integralValues,
111  std::string const& defaultParameterName,
112  const bool caseSensitive = true);
113 
144  const ArrayView<const std::string>& stringsDocs,
145  const ArrayView<const IntegralType>& integralValues,
146  const std::string& defaultParameterName,
147  const bool caseSensitive = true);
149 
151 
162  IntegralType getIntegralValue(
163  const std::string &str, const std::string &paramName = "",
164  const std::string &sublistName = ""
165  ) const;
166 
182  IntegralType
183  getIntegralValue (const ParameterEntry &entry,
184  const std::string &paramName = "",
185  const std::string &sublistName = "",
186  const bool activeQuery = true) const;
187 
203  std::string
204  getStringValue (const ParameterEntry &entry,
205  const std::string &paramName = "",
206  const std::string &sublistName = "",
207  const bool activeQuery = true) const;
208 
215  IntegralType
216  getIntegralValue (ParameterList& paramList,
217  const std::string& paramName,
218  const std::string& defaultValue) const;
219 
223  std::string getStringValue(
224  ParameterList &paramList, const std::string &paramName,
225  const std::string &defaultValue
226  ) const;
227 
234 
239  const std::string& getDefaultParameterName() const;
240 
252  std::string validateString(
253  const std::string &str, const std::string &paramName = "",
254  const std::string &sublistName = ""
255  ) const;
256 
261  bool isCaseSensitive () const {
262  return caseSensitive_;
263  }
264 
266 
268 
270  const std::string getXMLTypeName() const;
271 
273  void printDoc(
274  std::string const& docString,
275  std::ostream & out
276  ) const;
277 
280  validStringValues() const;
281 
283  void validate(
284  ParameterEntry const& entry,
285  std::string const& paramName,
286  std::string const& sublistName
287  ) const;
288 
289 #if defined(HAVE_TEUCHOS_MODIFY_DEFAULTS_DURING_VALIDATION)
290  void validateAndModify(
291  std::string const& paramName,
292  std::string const& sublistName,
293  ParameterEntry * entry
294  ) const;
295 #endif
296 
298 
299 private:
300  std::string defaultParameterName_;
301  std::string validValues_;
302  ValidStringsList validStringValues_;
303  ValidStringsList validStringValuesDocs_;
304 
305  typedef std::map<std::string,IntegralType> map_t;
306  map_t map_;
307  typedef std::map<IntegralType,std::string> inv_map_t;
308  inv_map_t inv_map_;
309 
310  const bool caseSensitive_;
311 
323  void init(const ArrayView<const std::string>& strings,
324  const ArrayView<const IntegralType>& integralValues);
325 
326  void setValidValues(
327  ArrayView<const std::string> const& strings,
328  ArrayView<const std::string> const* stringsDocs = NULL
329  );
330 
331  // Not defined and not to be called.
333 
335  static std::string upperCase (const std::string s) {
336  std::string s_upper = s;
337  std::transform (s_upper.begin (), s_upper.end (), s_upper.begin (), ::toupper);
338  return s_upper;
339  }
340 };
341 
342 
347 template<class IntegralType>
348 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
349 stringToIntegralParameterEntryValidator(
350  ArrayView<const std::string> const& strings,
351  std::string const& defaultParameterName
352  );
353 
354 
359 template<class IntegralType>
360 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
361 stringToIntegralParameterEntryValidator(
362  ArrayView<const std::string> const& strings,
363  std::string const& defaultParameterName,
364  const bool caseSensitive
365  );
366 
367 
372 template<class IntegralType>
373 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
374 stringToIntegralParameterEntryValidator(
375  ArrayView<const std::string> const& strings,
376  ArrayView<const IntegralType> const& integralValues,
377  std::string const& defaultParameterName
378  );
379 
380 
385 template<class IntegralType>
386 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
387 stringToIntegralParameterEntryValidator(
388  ArrayView<const std::string> const& strings,
389  ArrayView<const IntegralType> const& integralValues,
390  std::string const& defaultParameterName,
391  const bool caseSensitive
392  );
393 
394 
399 template<class IntegralType>
400 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
401 stringToIntegralParameterEntryValidator(
402  ArrayView<const std::string> const& strings,
403  ArrayView<const std::string> const& stringsDocs,
404  ArrayView<const IntegralType> const& integralValues,
405  std::string const& defaultParameterName
406  );
407 
408 
413 template<class IntegralType>
414 RCP<StringToIntegralParameterEntryValidator<IntegralType> >
415 stringToIntegralParameterEntryValidator(
416  ArrayView<const std::string> const& strings,
417  ArrayView<const std::string> const& stringsDocs,
418  ArrayView<const IntegralType> const& integralValues,
419  std::string const& defaultParameterName,
420  const bool caseSensitive
421  );
422 
423 
434 template<class IntegralType>
435 void setStringToIntegralParameter(
436  std::string const& paramName,
437  std::string const& defaultValue,
438  std::string const& docString,
439  ArrayView<const std::string> const& strings,
440  ParameterList * paramList
441  );
442 
443 
455 template<class IntegralType>
456 void setStringToIntegralParameter(
457  std::string const& paramName,
458  std::string const& defaultValue,
459  std::string const& docString,
460  ArrayView<const std::string> const& strings,
461  ArrayView<const IntegralType> const& integralValues,
462  ParameterList * paramList
463  );
464 
465 
477 template<class IntegralType>
478 void setStringToIntegralParameter(
479  std::string const& paramName,
480  std::string const& defaultValue,
481  std::string const& docString,
482  ArrayView<const std::string> const& strings,
483  ArrayView<const std::string> const& stringsDocs,
484  ArrayView<const IntegralType> const& integralValues,
485  ParameterList * paramList
486  );
487 
488 
499 template<class IntegralType>
500 IntegralType getIntegralValue(
501  ParameterList const& paramList, std::string const& paramName
502  );
503 
504 
516 template<class IntegralType>
517 std::string getStringValue(
518  ParameterList const& paramList, std::string const& paramName
519  );
520 
521 
527 template<class IntegralType>
528 RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
530  ParameterEntry const& entry, ParameterList const& paramList,
531  std::string const& paramName
532  );
533 
534 
540 std::string getVerbosityLevelParameterValueName(
541  const EVerbosityLevel verbLevel
542  );
543 
544 
549 RCP<StringToIntegralParameterEntryValidator<EVerbosityLevel> >
550 verbosityLevelParameterEntryValidator(std::string const& defaultParameterName);
551 
557 template<class IntegralType>
559 
560 public:
561 
564 
569  getDummyObject();
570 
572 };
573 
574 template<class IntegralType>
577 {
578  return stringToIntegralParameterEntryValidator<IntegralType>(
579  tuple<std::string>(""), tuple<std::string>(""),
580  tuple<IntegralType>((IntegralType)1), "");
581 }
582 
595 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT BoolParameterEntryValidator
596  : public ParameterEntryValidator
597 {
598 public:
599 
602 
604 
606 
609 
611  bool getBool(
612  const ParameterEntry &entry, const std::string &paramName = "",
613  const std::string &sublistName = "", const bool activeQuery = true
614  ) const;
615 
619  bool getBool(
620  ParameterList &paramList, const std::string &paramName,
621  const int defaultValue
622  ) const;
623 
625 
628 
630  const std::string getXMLTypeName() const;
631 
633  void printDoc(
634  std::string const& docString,
635  std::ostream & out
636  ) const;
637 
640  validStringValues() const;
641 
643  void validate(
644  ParameterEntry const& entry,
645  std::string const& paramName,
646  std::string const& sublistName
647  ) const;
648 
650  void validateAndModify(
651  std::string const& paramName,
652  std::string const& sublistName,
653  ParameterEntry * entry
654  ) const;
655 
657 
658 private:
659 
660  // ////////////////////////////
661  // Private data members
662 
663  std::string acceptedTypesString_;
664 
665  // ////////////////////////////
666  // Private member functions
667 
668  void finishInitialization();
669 
670  void throwTypeError(
671  ParameterEntry const& entry,
672  std::string const& paramName,
673  std::string const& sublistName
674  ) const;
675 };
676 
677 // Nonmember helper functions
678 
679 
684 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<BoolParameterEntryValidator>
685 boolParameterEntryValidator();
686 
687 
701 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT AnyNumberParameterEntryValidator
702  : public ParameterEntryValidator
703 {
704 public:
705 
708 
710  enum EPreferredType { PREFER_INT, PREFER_LONG_LONG, PREFER_DOUBLE, PREFER_STRING };
711 
712 
715  public:
717  AcceptedTypes( bool allowAllTypesByDefault = true )
718  :allowInt_(allowAllTypesByDefault)
719  ,allowLongLong_(allowAllTypesByDefault)
720  ,allowDouble_(allowAllTypesByDefault)
721  ,allowString_(allowAllTypesByDefault)
722  {}
724  AcceptedTypes& allowInt( bool _allowInt )
725  { allowInt_ = _allowInt; return *this; }
727  AcceptedTypes& allowLongLong( bool _allowLongLong )
728  { allowLongLong_ = _allowLongLong; return *this; }
730  AcceptedTypes& allowDouble( bool _allowDouble )
731  { allowDouble_ = _allowDouble; return *this; }
733  AcceptedTypes& allowString( bool _allowString )
734  { allowString_ = _allowString; return *this; }
736  bool allowInt() const { return allowInt_; }
738  bool allowLongLong() const { return allowLongLong_; }
740  bool allowDouble() const { return allowDouble_; }
742  bool allowString() const { return allowString_; }
743  private:
744  bool allowInt_;
745  bool allowLongLong_;
746  bool allowDouble_;
747  bool allowString_;
748  };
749 
751 
754 
759 
771  EPreferredType const preferredType,
772  AcceptedTypes const& acceptedTypes
773  );
774 
776 
779 
785  int getInt(
786  const ParameterEntry &entry, const std::string &paramName = "",
787  const std::string &sublistName = "", const bool activeQuery = true
788  ) const;
789 
795  long long getLongLong(
796  const ParameterEntry &entry, const std::string &paramName = "",
797  const std::string &sublistName = "", const bool activeQuery = true
798  ) const;
799 
803  double getDouble(
804  const ParameterEntry &entry, const std::string &paramName = "",
805  const std::string &sublistName = "", const bool activeQuery = true
806  ) const;
807 
809  std::string getString(
810  const ParameterEntry &entry, const std::string &paramName = "",
811  const std::string &sublistName = "", const bool activeQuery = true
812  ) const;
813 
817  int getInt(
818  ParameterList &paramList, const std::string &paramName,
819  const int defaultValue
820  ) const;
821 
825  long long getLongLong(
826  ParameterList &paramList, const std::string &paramName,
827  const long long defaultValue
828  ) const;
829 
833  double getDouble(
834  ParameterList &paramList, const std::string &paramName,
835  const double defaultValue
836  ) const;
837 
841  std::string getString(
842  ParameterList &paramList, const std::string &paramName,
843  const std::string &defaultValue
844  ) const;
845 
848  bool isIntAllowed() const;
849 
852  bool isLongLongAllowed() const;
853 
856  bool isDoubleAllowed() const;
857 
860  bool isStringAllowed() const;
861 
864  EPreferredType getPreferredType() const;
865 
867  static const std::string& getPrefferedTypeString (EPreferredType enumValue)
868  {
869  switch (enumValue) {
870  case PREFER_INT:
871  return getIntEnumString ();
872  case PREFER_LONG_LONG:
873  return getLongLongEnumString ();
874  case PREFER_DOUBLE:
875  return getDoubleEnumString ();
876  case PREFER_STRING:
877  return getStringEnumString ();
878  default:
879  const std::string typeString (toString (enumValue));
880  throw std::runtime_error("Cannot convert enumValue: " + typeString + " to a string");
881  }
882  }
883 
885  static EPreferredType getPrefferedTypeStringEnum (const std::string& enumString)
886  {
887  if (enumString == getIntEnumString ()) {
888  return PREFER_INT;
889  }
890  else if (enumString == getLongLongEnumString ()) {
891  return PREFER_LONG_LONG;
892  }
893  else if (enumString == getDoubleEnumString ()) {
894  return PREFER_DOUBLE;
895  }
896  else if (enumString == getStringEnumString ()) {
897  return PREFER_STRING;
898  }
899  else {
900  throw std::runtime_error ("Cannot convert enumString: " + enumString + " to an enum");
901  }
902  }
903 
905 
908 
910  const std::string getXMLTypeName() const;
911 
913  void printDoc(
914  std::string const& docString,
915  std::ostream & out
916  ) const;
917 
919  ValidStringsList
920  validStringValues() const;
921 
923  void validate(
924  ParameterEntry const& entry,
925  std::string const& paramName,
926  std::string const& sublistName
927  ) const;
928 
930  void validateAndModify(
931  std::string const& paramName,
932  std::string const& sublistName,
933  ParameterEntry * entry
934  ) const;
935 
936 
938 
939 private:
940 
941  // ////////////////////////////
942  // Private data members
943 
944  EPreferredType preferredType_;
945  std::string acceptedTypesString_;
946 
947 //use pragmas to disable some false-positive warnings for windows sharedlibs export
948 #ifdef _MSC_VER
949 #pragma warning(push)
950 #pragma warning(disable:4251)
951 #endif
952  const AcceptedTypes acceptedTypes_;
953 #ifdef _MSC_VER
954 #pragma warning(pop)
955 #endif
956 
957  // ////////////////////////////
958  // Private member functions
959 
960  /* \brief Gets the string representing the "int" preferred type enum */
961  static const std::string& getIntEnumString(){
962  static const std::string intEnumString_ = TypeNameTraits<int>::name();
963  return intEnumString_;
964  }
965 
966  /* \brief Gets the string representing the "int" preferred type enum */
967  static const std::string& getLongLongEnumString(){
968  static const std::string longLongEnumString_ = TypeNameTraits<long long>::name();
969  return longLongEnumString_;
970  }
971 
972  /* \brief Gets the string representing the "double" preferred type enum */
973  static const std::string& getDoubleEnumString(){
974  static const std::string doubleEnumString_ = TypeNameTraits<double>::name();
975  return doubleEnumString_;
976  }
977 
978  /* \brief Gets the string representing the "string" preferred type enum */
979  static const std::string& getStringEnumString(){
980  static const std::string stringEnumString_ = TypeNameTraits<std::string>::name();
981  return stringEnumString_;
982  }
983 
984 
985  void finishInitialization();
986 
987  void throwTypeError(
988  ParameterEntry const& entry,
989  std::string const& paramName,
990  std::string const& sublistName
991  ) const;
992 
993 };
994 
995 
996 // Nonmember helper functions
997 
998 
1003 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1004 anyNumberParameterEntryValidator();
1005 
1006 
1011 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1012 anyNumberParameterEntryValidator(
1014  AnyNumberParameterEntryValidator::AcceptedTypes const& acceptedTypes
1015  );
1016 
1022 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setIntParameter(
1023  std::string const& paramName,
1024  int const value, std::string const& docString,
1025  ParameterList *paramList,
1026  AnyNumberParameterEntryValidator::AcceptedTypes const& acceptedTypes
1027  = AnyNumberParameterEntryValidator::AcceptedTypes()
1028  );
1029 
1030 
1036 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setLongLongParameter(
1037  std::string const& paramName,
1038  long long const value, std::string const& docString,
1039  ParameterList *paramList,
1040  AnyNumberParameterEntryValidator::AcceptedTypes const& acceptedTypes
1041  = AnyNumberParameterEntryValidator::AcceptedTypes()
1042  );
1043 
1049 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setDoubleParameter(
1050  std::string const& paramName,
1051  double const& value, std::string const& docString,
1052  ParameterList *paramList,
1053  AnyNumberParameterEntryValidator::AcceptedTypes const& acceptedTypes
1054  = AnyNumberParameterEntryValidator::AcceptedTypes()
1055  );
1056 
1057 
1063 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setNumericStringParameter(
1064  std::string const& paramName,
1065  std::string const& value, std::string const& docString,
1066  ParameterList *paramList,
1067  AnyNumberParameterEntryValidator::AcceptedTypes const& acceptedTypes
1068  = AnyNumberParameterEntryValidator::AcceptedTypes()
1069  );
1070 
1071 
1086 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT int getIntParameter(
1087  ParameterList const& paramList, std::string const& paramName
1088  );
1089 
1090 
1105 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT long long getLongLongParameter(
1106  ParameterList const& paramList, std::string const& paramName
1107  );
1108 
1123 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT double getDoubleParameter(
1124  ParameterList const& paramList,
1125  std::string const& paramName
1126  );
1127 
1128 
1144 TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT std::string getNumericStringParameter(
1145  ParameterList const& paramList,
1146  std::string const& paramName
1147  );
1148 
1154 template<>
1155 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<AnyNumberParameterEntryValidator>{
1156 
1157 public:
1158 
1161 
1165  static RCP<AnyNumberParameterEntryValidator > getDummyObject();
1166 
1168 
1169 };
1170 
1171 
1176 template <class T>
1179  static inline T notDefined() {
1180  return T::this_type_is_missing_a_specialization();
1181  }
1182 };
1183 
1184 
1205 template <class T>
1207 public:
1208 
1210  static inline T min()
1212 
1214  static inline T max()
1216 
1219  static inline T defaultStep()
1221 
1224  static inline unsigned short defaultPrecision()
1226 
1227 };
1228 
1229 
1230 template<>
1231 class EnhancedNumberTraits<short int>{
1232 public:
1233  static inline short int min() { return std::numeric_limits<short int>::min(); }
1234  static inline short int max() { return std::numeric_limits<short int>::max(); }
1235  static inline short int defaultStep() { return 1; }
1236  static inline unsigned short defaultPrecision() { return 0; }
1237 };
1238 
1239 
1240 template<>
1241 class EnhancedNumberTraits<short unsigned int>{
1242 public:
1243  static inline short unsigned int min() { return std::numeric_limits<short unsigned int>::min(); }
1244  static inline short unsigned int max() { return std::numeric_limits<short unsigned int>::max(); }
1245  static inline short unsigned int defaultStep() { return 1; }
1246  static inline unsigned short defaultPrecision() { return 0; }
1247 };
1248 
1249 
1250 template<>
1251 class EnhancedNumberTraits<int>{
1252 public:
1253  static inline int min() { return std::numeric_limits<int>::min(); }
1254  static inline int max() { return std::numeric_limits<int>::max(); }
1255  static inline int defaultStep() { return 1; }
1256  static inline unsigned short defaultPrecision() { return 0; }
1257 };
1258 
1259 
1260 template<>
1261 class EnhancedNumberTraits<unsigned int>{
1262 public:
1263  static inline unsigned int min() { return std::numeric_limits<unsigned int>::min(); }
1264  static inline unsigned int max() { return std::numeric_limits<unsigned int>::max(); }
1265  static inline unsigned int defaultStep() { return 1; }
1266  static inline unsigned short defaultPrecision() { return 0; }
1267 };
1268 
1269 
1270 template<>
1271 class EnhancedNumberTraits<long int>{
1272 public:
1273  static inline long int min() { return std::numeric_limits<long int>::min(); }
1274  static inline long int max() { return std::numeric_limits<long int>::max(); }
1275  static inline long int defaultStep() { return 1; }
1276  static inline unsigned short defaultPrecision() { return 0; }
1277 };
1278 
1279 
1280 template<>
1281 class EnhancedNumberTraits<long unsigned int>{
1282 public:
1283  static inline long unsigned int min() { return std::numeric_limits<long unsigned int>::min(); }
1284  static inline long unsigned int max() { return std::numeric_limits<long unsigned int>::max(); }
1285  static inline long unsigned int defaultStep() { return 1; }
1286  static inline unsigned short defaultPrecision() { return 0; }
1287 };
1288 
1289 
1290 template<>
1291 class EnhancedNumberTraits<long long int>{
1292 public:
1293  static inline long long int min() { return std::numeric_limits<long long int>::min(); }
1294  static inline long long int max() { return std::numeric_limits<long long int>::max(); }
1295  static inline long long int defaultStep() { return 1; }
1296  static inline unsigned short defaultPrecision() { return 0; }
1297 };
1298 
1299 
1300 template<>
1301 class EnhancedNumberTraits<long long unsigned int>{
1302 public:
1303  static inline long long unsigned int min() { return std::numeric_limits<long long unsigned int>::min(); }
1304  static inline long long unsigned int max() { return std::numeric_limits<long long unsigned int>::max(); }
1305  static inline long long unsigned int defaultStep() { return 1; }
1306  static inline unsigned short defaultPrecision() { return 0; }
1307 };
1308 
1309 
1310 #ifdef HAVE_TEUCHOSCORE_QUADMATH
1311 template<>
1312 class EnhancedNumberTraits<__float128>{
1313 public:
1314  static inline __float128 min() { return -std::numeric_limits<__float128>::max(); }
1315  static inline __float128 max() { return std::numeric_limits<__float128>::max(); }
1316  static inline __float128 defaultStep() { return 1; }
1317  static inline unsigned short defaultPrecision() { return 100; }
1318 };
1319 #endif // HAVE_TEUCHOSCORE_QUADMATH
1320 
1321 template<>
1322 class EnhancedNumberTraits<double>{
1323 public:
1324  static inline double min() { return -std::numeric_limits<double>::max(); }
1325  static inline double max() { return std::numeric_limits<double>::max(); }
1326  static inline double defaultStep() { return 1; }
1327  static inline unsigned short defaultPrecision() { return 100; }
1328 };
1329 
1330 #ifdef HAVE_TEUCHOS_LONG_DOUBLE
1331 template<>
1332 class EnhancedNumberTraits<long double>{
1333 public:
1334  static inline long double min() { return -std::numeric_limits<long double>::max(); }
1335  static inline long double max() { return std::numeric_limits<long double>::max(); }
1336  static inline long double defaultStep() { return 1; }
1337  static inline unsigned short defaultPrecision() { return 100; }
1338 };
1339 #endif
1340 
1341 template<>
1342 class EnhancedNumberTraits<float>{
1343 public:
1344  static inline float min() { return -std::numeric_limits<float>::max(); }
1345  static inline float max() { return std::numeric_limits<float>::max(); }
1346  static inline float defaultStep() { return 1; }
1347  static inline unsigned short defaultPrecision() { return 100; }
1348 };
1349 
1355 template <class T>
1357 
1358 public:
1359 
1362 
1378  T min,
1379  T max,
1381  unsigned short precision=EnhancedNumberTraits<T>::defaultPrecision()):
1383  minVal(min), maxVal(max), step_(step), precision_(precision),
1384  containsMin(true), containsMax(true){}
1385 
1391  minVal(EnhancedNumberTraits<T>::min()),
1392  maxVal(EnhancedNumberTraits<T>::max()),
1393  step_(EnhancedNumberTraits<T>::defaultStep()),
1394  precision_(EnhancedNumberTraits<T>::defaultPrecision()),
1395  containsMin(false),
1396  containsMax(false){}
1397 
1399 
1401 
1402 
1407  void setMin(T min){
1408  minVal = min;
1409  containsMin = true;
1410  }
1411 
1416  void setMax(T max){
1417  maxVal = max;
1418  containsMax = true;
1419  }
1420 
1425  void setStep(T step){
1426  step_ = step;
1427  }
1428 
1433  void setPrecision(unsigned short precision){
1434  precision_ = precision;
1435  }
1436 
1438 
1441 
1446  T getMin() const{
1447  return minVal;
1448  }
1449 
1454  T getMax() const{
1455  return maxVal;
1456  }
1457 
1462  T getStep() const{
1463  return step_;
1464  }
1465 
1470  unsigned short getPrecision() const{
1471  return precision_;
1472  }
1473 
1475 
1477 
1478 
1483  bool hasMin() const{
1484  return containsMin;
1485  }
1486 
1491  bool hasMax() const{
1492  return containsMax;
1493  }
1494 
1496 
1499 
1502  return null;
1503  }
1504 
1506  void validate(ParameterEntry const &entry, std::string const &paramName,
1507  std::string const &sublistName) const;
1508 
1510  void validateAndModify( std::string const& paramName,
1511  std::string const& sublistName, ParameterEntry * entry) const;
1512 
1515  const bool activeQuery) const;
1516 
1518  const std::string getXMLTypeName() const{
1519  return "EnhancedNumberValidator(" + TypeNameTraits<T>::name()+ ")";
1520  }
1521 
1523  void printDoc(std::string const &docString, std::ostream &out) const{
1524  StrUtils::printLines(out,"# ",docString);
1525  out << "#\tValidator Used: " << std::endl;
1526  out << "#\t\tNumber Validator" << std::endl;
1527  out << "#\t\tType: " << Teuchos::TypeNameTraits<T>::name() <<
1528  std::endl;
1529  out << "#\t\tMin (inclusive): " << minVal << std::endl;
1530  out << "#\t\tMax (inclusive): " << maxVal << std::endl;
1531  }
1532 
1534 
1535 private:
1538 
1539  // note this was discussed in issue #612
1540  // currently we are keeping a string validator with EnhancedNumberValidator
1541  // an alternative is to make a combined class for AnyNumberParameterEntryValidator
1542  // and EnhancedNumberValidator
1543  bool useIntConversions() const;
1544 
1546 
1549 
1552  T minVal;
1553 
1556  T maxVal;
1557 
1560  T step_;
1561 
1565  unsigned short precision_;
1566 
1569  bool containsMin;
1570 
1573  bool containsMax;
1574 
1576 
1577 };
1578 
1579 template<class T>
1581  std::string const& paramName,
1582  std::string const& sublistName,
1583  ParameterEntry * entry
1584  ) const
1585 {
1586  TEUCHOS_TEST_FOR_EXCEPT(0==entry);
1587 
1588  any anyValue = entry->getAny(true);
1589  // preferred type is not string
1590  if( anyValue.type() == typeid(std::string) ) {
1591  anyValue = getNumberFromString(*entry,false);
1592  entry->setValue(
1593  any_cast<T>(anyValue),
1594  false // isDefault
1595  );
1596  }
1597  else {
1598  // default behavior
1600  paramName, sublistName, entry);
1601  }
1602 }
1603 
1604 template<class T>
1606 {
1607  // this will need some rethinking and exists only for supporting
1608  // conversion of strings to the templated type T
1609  // but we may want to unify this into the base class anyways
1610  // and share string conversion concepts with other parameters
1611  // like AnyNumberParameterEntryValidator
1612  if(typeid(T) == typeid(char)) return true;
1613  if(typeid(T) == typeid(unsigned char)) return true;
1614  if(typeid(T) == typeid(int)) return true;
1615  if(typeid(T) == typeid(unsigned int)) return true;
1616  if(typeid(T) == typeid(short)) return true;
1617  if(typeid(T) == typeid(unsigned short)) return true;
1618  if(typeid(T) == typeid(long)) return true;
1619  if(typeid(T) == typeid(unsigned long)) return true;
1620  if(typeid(T) == typeid(long long)) return true;
1621  if(typeid(T) == typeid(unsigned long long)) return true;
1622 
1623  // default to double stod to older atof conversion
1624  // depending on HAVE_TEUCHOSCORE_CXX11
1625  // those conversions would probably handle all above discrete types anyways
1626  return false;
1627 }
1628 
1629 template<class T>
1631  const ParameterEntry &entry, const bool activeQuery
1632  ) const
1633 {
1634  // perhaps we want to just eliminate the int checks
1635  // and always use double conversion which I think would work
1636  // well for all types - but this will give us a behavior which mirrors
1637  // AnyNumberParameterEntryValidator more closely
1638  const any &anyValue = entry.getAny(activeQuery);
1639  if(useIntConversions()) {
1640  return any((T)convertStringToInt(any_cast<std::string>(anyValue)));
1641  }
1642  else { // if not discrete, read as a double and cast to our type T
1643  return any((T)convertStringToDouble(any_cast<std::string>(anyValue)));
1644  }
1645 }
1646 
1647 template<class T>
1648 void EnhancedNumberValidator<T>::validate(ParameterEntry const &entry, std::string const &paramName,
1649  std::string const &sublistName) const
1650 {
1651  any anyValue = entry.getAny(true);
1652 
1653  // This was new code added to allow EnhancedNumberValidator to accept a string
1654  // This was added for consistency with AnyNumberParameterEntryValidator
1655  // and the new BoolParameterEntryValidator which all take string
1656  // We may wish to change this to be optional like AnyNumberParameterEntryValidator
1657  if( anyValue.type() == typeid(std::string) ) {
1658  // try to upgrade from a string to a number
1659  anyValue = getNumberFromString(entry, false);
1660  }
1661 
1662  const std::string &entryName = entry.getAny(false).typeName();
1663  TEUCHOS_TEST_FOR_EXCEPTION(anyValue.type() != typeid(T),
1665  "The \"" << paramName << "\"" <<
1666  " parameter in the \"" << sublistName <<
1667  "\" sublist is has an error." << std::endl << std::endl <<
1668  "Error: The value that you entered was the wrong type." << std::endl <<
1669  "Parameter: " << paramName << std::endl <<
1670  "Type specified: " << entryName << std::endl <<
1671  "Type accepted: " << Teuchos::TypeNameTraits<T>::name() << std::endl);
1672 
1673  bool isValueInRange;
1674  any_cast<T>(anyValue) >= minVal && any_cast<T>(anyValue) <= maxVal
1675  ? isValueInRange = true : isValueInRange=false;
1676  TEUCHOS_TEST_FOR_EXCEPTION(!(isValueInRange),
1678  "The \"" << paramName << "\"" <<
1679  " parameter in the \"" << sublistName <<
1680  "\" sublist is has an error." << std::endl << std::endl <<
1681  "Error: The value that was entered doesn't fall with in " <<
1682  "the range set by the validator" << std::endl <<
1683  "Parameter: " << paramName << std::endl <<
1684  "Min: " << minVal << std::endl <<
1685  "Max: " << maxVal << std::endl <<
1686  "Value entered: " <<
1687  (any_cast<T>(anyValue)) << std::endl << std::endl);
1688 }
1689 
1695 template<class T>
1697 
1698 public:
1699 
1702 
1707 
1709 };
1710 
1711 template<class T>
1714 {
1715  return rcp(new EnhancedNumberValidator<T>);
1716 }
1717 
1726 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT FileNameValidator : public ParameterEntryValidator {
1727 
1728 public:
1729 
1732 
1735  static bool mustAlreadyExistDefault() { return false; }
1736 
1738 
1741 
1747  FileNameValidator(bool mustAlreadyExist = mustAlreadyExistDefault());
1748 
1750 
1752 
1753 
1759  bool fileMustExist() const;
1760 
1762 
1763 
1774  bool fileEmptyNameOK() const;
1775 
1777 
1779 
1780 
1789  bool setFileMustExist(bool shouldFileExist);
1790 
1799  bool setFileEmptyNameOK(bool isEmptyNameOK);
1800 
1802 
1805 
1807  ValidStringsList validStringValues() const;
1808 
1810  void validate(
1811  ParameterEntry const &entry,
1812  std::string const &paramName,
1813  std::string const &sublistName) const;
1814 
1816  const std::string getXMLTypeName() const;
1817 
1819  void printDoc(std::string const &docString, std::ostream &out) const;
1820 
1822 
1823 private:
1824 
1827 
1831  bool mustAlreadyExist_;
1832  bool EmptyNameOK_;
1833 
1835 
1836 };
1837 
1843 template<>
1844 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<FileNameValidator>{
1845 
1846 public:
1847 
1850 
1854  static RCP<FileNameValidator> getDummyObject();
1855 
1857 
1858 };
1859 
1867 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT StringValidator : public ParameterEntryValidator {
1868 
1869 public:
1870 
1873 
1876  StringValidator();
1877 
1882  StringValidator(const Teuchos::Array<std::string> &validStrings);
1883 
1885 
1887 
1888 
1896  ValidStringsList setValidStrings(
1897  const Teuchos::Array<std::string> &validStrings);
1898 
1900 
1903 
1905  ValidStringsList validStringValues() const;
1906 
1908  void validate(ParameterEntry const &entry, std::string const &paramName,
1909  std::string const &sublistName) const;
1910 
1912  const std::string getXMLTypeName() const;
1913 
1915  void printDoc(std::string const &docString, std::ostream &out) const;
1916 
1918 
1919 private:
1920 
1923 
1926  ValidStringsList validStrings_;
1927 
1929 
1930 };
1931 
1937 template<>
1938 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<StringValidator>{
1939 
1940 public:
1941 
1944 
1948  static RCP<StringValidator> getDummyObject();
1949 
1951 
1952 };
1953 
1954 
1958 template<class ValidatorType, class EntryType>
1960 
1961 public:
1962 
1965 
1974  prototypeValidator_(prototypeValidator){}
1975 
1977 
1980 
1983  return prototypeValidator_;
1984  }
1985 
1987 
1990 
1993  return prototypeValidator_->validStringValues();
1994  }
1995 
1997 
1998 private:
1999 
2002 
2005  RCP<const ValidatorType> prototypeValidator_;
2006 
2009 
2011 
2012 };
2013 
2026 template<class ValidatorType, class EntryType>
2027 class TwoDArrayValidator : public AbstractArrayValidator<ValidatorType, EntryType>{
2028 public:
2031 
2039  AbstractArrayValidator<ValidatorType, EntryType>(prototypeValidator){}
2040 
2042 
2045 
2047  virtual void validate(ParameterEntry const &entry, std::string const &paramName,
2048  std::string const &sublistName) const;
2049 
2051  const std::string getXMLTypeName() const{
2052  return "TwoDArrayValidator(" +
2053  this->getPrototype()->getXMLTypeName() + ", " +
2055  }
2056 
2058  virtual void printDoc(std::string const &docString, std::ostream &out) const
2059  {
2060  StrUtils::printLines(out,"# ",docString);
2061  std::string toPrint;
2062  toPrint += "TwoDArrayValidator:\n";
2063  toPrint += "Prototype Validator:\n";
2064  this->getPrototype()->printDoc(toPrint, out);
2065  }
2066 
2068 
2069 };
2070 
2071 template<class ValidatorType, class EntryType>
2072 void TwoDArrayValidator<ValidatorType, EntryType>::validate(ParameterEntry const &entry, std::string const &paramName,
2073  std::string const &sublistName) const
2074 {
2075  any anyValue = entry.getAny(true);
2076  const std::string &entryName = entry.getAny(false).typeName();
2079  "The \"" << paramName << "\"" <<
2080  " parameter in the \"" << sublistName <<
2081  "\" sublist is has an error." << std::endl << std::endl <<
2082  "Error: The value you entered was the wrong type." << std::endl <<
2083  "Parameter: " << paramName << std::endl <<
2084  "Type specified: " << entryName << std::endl <<
2085  "Type accepted: " << TypeNameTraits<TwoDArray<EntryType> >::name() <<
2086  std::endl << std::endl);
2087 
2088  TwoDArray<EntryType> extracted =
2089  getValue<Teuchos::TwoDArray<EntryType> >(entry);
2090  RCP<const ParameterEntryValidator> prototype = this->getPrototype();
2091  for(int i = 0; i<extracted.getNumRows(); ++i){
2092  for(int j = 0; j<extracted.getNumCols(); ++j){
2093  ParameterEntry dummyParameter;
2094  dummyParameter.setValue(extracted(i,j));
2095  try{
2096  prototype->validate(
2097  dummyParameter, paramName, sublistName);
2098  }
2100  std::stringstream oss;
2101  oss << "TwoDArray Validator Exception:" << std::endl <<
2102  "Bad Index: (" << i << "," << j << ")" << std::endl << e.what();
2103  throw Exceptions::InvalidParameterValue(oss.str());
2104  }
2105  }
2106  }
2107 }
2108 
2109 
2115 template<class ValidatorType, class EntryType>
2116 class DummyObjectGetter<TwoDArrayValidator<ValidatorType, EntryType> >{
2117 
2118 public:
2119 
2122 
2127 
2129 
2130 };
2131 
2132 template<class ValidatorType, class EntryType>
2135 {
2138 }
2139 
2143 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT TwoDArrayStringValidator :
2144  public TwoDArrayValidator<StringValidator, std::string>{
2145 
2146 public:
2147 
2150 
2153  TwoDArrayValidator<StringValidator, std::string>(prototypeValidator){}
2154 
2156 
2157 };
2158 
2159 
2164 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT TwoDArrayFileNameValidator :
2165  public TwoDArrayValidator<FileNameValidator, std::string>{
2166 
2167 public:
2168 
2171 
2174  TwoDArrayValidator<FileNameValidator, std::string>(prototypeValidator){}
2175 
2177 
2178 };
2179 
2180 
2184 template<class T>
2185 class TwoDArrayNumberValidator : public TwoDArrayValidator<EnhancedNumberValidator<T>, T>{
2186 public:
2189 
2192  RCP<const EnhancedNumberValidator<T> > prototypeValidator):
2193  TwoDArrayValidator<EnhancedNumberValidator<T>, T>(prototypeValidator){}
2194 
2196 
2197 };
2198 
2199 
2211 template<class ValidatorType, class EntryType>
2212 class ArrayValidator : public AbstractArrayValidator<ValidatorType, EntryType>{
2213 
2214 public:
2215 
2218 
2225  AbstractArrayValidator<ValidatorType, EntryType>(prototypeValidator){}
2226 
2228 
2231 
2233  virtual void validate(ParameterEntry const &entry, std::string const &paramName,
2234  std::string const &sublistName) const;
2235 
2237  const std::string getXMLTypeName() const{
2238  return "ArrayValidator(" +
2239  this->getPrototype()->getXMLTypeName() + ", " +
2241  }
2242 
2244  virtual void printDoc(std::string const &docString, std::ostream &out) const
2245  {
2246  StrUtils::printLines(out,"# ",docString);
2247  std::string toPrint;
2248  toPrint += "ArrayValidator:\n";
2249  toPrint += "Prototype Validator:\n";
2250  this->getPrototype()->printDoc(toPrint, out);
2251  }
2252 
2254 
2255 };
2256 
2257 template<class ValidatorType, class EntryType>
2258 void ArrayValidator<ValidatorType, EntryType>::validate(ParameterEntry const &entry, std::string const &paramName,
2259  std::string const &sublistName) const
2260 {
2261  any anyValue = entry.getAny(true);
2262  const std::string &entryName = entry.getAny(false).typeName();
2263  TEUCHOS_TEST_FOR_EXCEPTION(anyValue.type() != typeid(Array<EntryType>),
2265  "The \"" << paramName << "\"" <<
2266  " parameter in the \"" << sublistName <<
2267  "\" sublist is has an error." << std::endl << std::endl <<
2268  "Error: The value you entered was the wrong type." << std::endl <<
2269  "Parameter: " << paramName << std::endl <<
2270  "Type specified: " << entryName << std::endl <<
2271  "Type accepted: " << TypeNameTraits<Array<EntryType> >::name() <<
2272  std::endl << std::endl);
2273 
2274  Array<EntryType> extracted =
2275  getValue<Teuchos::Array<EntryType> >(entry);
2276  RCP<const ParameterEntryValidator> prototype = this->getPrototype();
2277  for(int i = 0; i<extracted.size(); ++i){
2278  ParameterEntry dummyParameter;
2279  dummyParameter.setValue(extracted[i]);
2280  try{
2281  prototype->validate(
2282  dummyParameter, paramName, sublistName);
2283  }
2285  std::stringstream oss;
2286  oss << "Array Validator Exception:" << std::endl <<
2287  "Bad Index: " << i << std::endl << e.what();
2288  throw Exceptions::InvalidParameterValue(oss.str());
2289  }
2290  }
2291 }
2292 
2298 template<class ValidatorType, class EntryType>
2299 class DummyObjectGetter<ArrayValidator<ValidatorType, EntryType> >{
2300 
2301 public:
2302 
2305 
2310 
2312 
2313 };
2314 
2315 template<class ValidatorType, class EntryType>
2318 {
2321 }
2322 
2323 
2332 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT ArrayStringValidator :
2333  public ArrayValidator<StringValidator, std::string>{
2334 
2335 public:
2336 
2339 
2342  ArrayValidator<StringValidator, std::string>(prototypeValidator){}
2343 
2345 
2346 };
2347 
2348 
2357 class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT ArrayFileNameValidator : public ArrayValidator<FileNameValidator, std::string>{
2358 
2359 public:
2360 
2363 
2366  ArrayValidator<FileNameValidator, std::string>(prototypeValidator){}
2367 
2369 
2370 };
2371 
2372 
2380 template<class T>
2381 class ArrayNumberValidator : public ArrayValidator<EnhancedNumberValidator<T>, T>{
2382 public:
2385 
2388  RCP<const EnhancedNumberValidator<T> > prototypeValidator):
2389  ArrayValidator<EnhancedNumberValidator<T>, T>(prototypeValidator){}
2390 
2392 
2393 };
2394 
2395 
2396 
2397 // ///////////////////////////
2398 // Implementations
2399 
2400 
2401 //
2402 // StringToIntegralParameterEntryValidator
2403 //
2404 
2405 
2406 // Constructors
2407 
2408 
2409 template<class IntegralType>
2410 StringToIntegralParameterEntryValidator<IntegralType>::
2411 StringToIntegralParameterEntryValidator (ArrayView<const std::string> const& strings,
2412  std::string const& defaultParameterName,
2413  const bool caseSensitive) :
2415  defaultParameterName_ (defaultParameterName),
2416  caseSensitive_ (caseSensitive)
2417 {
2418  const int length = static_cast<int>(strings.size());
2419  Array<IntegralType> integralValues(length);
2420  for (int i = 0; i < length; ++i) integralValues[i] = static_cast<IntegralType>(i);
2421  init(strings, integralValues);
2422  setValidValues (strings);
2423 }
2424 
2425 
2426 template<class IntegralType>
2429  ArrayView<const IntegralType> const& integralValues,
2430  std::string const& defaultParameterName,
2431  const bool caseSensitive) :
2433  defaultParameterName_ (defaultParameterName),
2434  caseSensitive_ (caseSensitive)
2435 {
2436 #ifdef TEUCHOS_DEBUG
2437  TEUCHOS_ASSERT_EQUALITY( strings.size(), integralValues.size() );
2438 #endif
2439  init(strings, integralValues);
2440  setValidValues (strings);
2441 }
2442 
2443 template<class IntegralType>
2446  ArrayView<const std::string> const& stringsDocs,
2447  ArrayView<const IntegralType> const& integralValues,
2448  std::string const& defaultParameterName,
2449  const bool caseSensitive) :
2451  defaultParameterName_ (defaultParameterName),
2452  caseSensitive_ (caseSensitive)
2453 {
2454 #ifdef TEUCHOS_DEBUG
2455  TEUCHOS_ASSERT_EQUALITY( strings.size(), stringsDocs.size() );
2456 #endif
2457 
2459  strings.size() != stringsDocs.size(),
2460  std::logic_error,
2461  "The input arrays strings and stringsDocs must have the same length.");
2462 
2463  init(strings, integralValues);
2464  setValidValues(strings,&stringsDocs);
2465 }
2466 
2467 template <class IntegralType>
2469  ArrayView<const std::string> const &strings,
2470  ArrayView<const IntegralType> const &integralValues) {
2471 
2472 #ifdef TEUCHOS_DEBUG
2473  TEUCHOS_ASSERT_EQUALITY(strings.size(), integralValues.size());
2474 #endif
2475 
2477  strings.size() != integralValues.size(), std::logic_error,
2478  "The input arrays strings and integralValues must have the same length.");
2479 
2480  typedef typename map_t::value_type val_t;
2481  typedef typename inv_map_t::value_type inv_val_t;
2482  for (int i = 0; i < static_cast<int>(strings.size()); ++i) {
2483  const std::string name =
2484  caseSensitive_ ? strings[i] : upperCase(strings[i]);
2485  const bool unique = map_.insert(val_t(name, integralValues[i])).second;
2486  TEUCHOS_TEST_FOR_EXCEPTION(!unique, std::logic_error,
2487  "For parameter \"" << defaultParameterName_
2488  << "\": "
2489  "strings["
2490  << i << "] = \"" << strings[i]
2491  << "\" is a duplicate.");
2492  inv_map_.insert(inv_val_t(integralValues[i], name));
2493  }
2494 }
2495 
2496 // Lookup functions
2497 
2498 
2499 template<class IntegralType>
2500 IntegralType
2502  const std::string &str, const std::string &paramName
2503  ,const std::string &sublistName
2504  ) const
2505 {
2506  typename map_t::const_iterator itr = map_.find (caseSensitive_ ? str : upperCase (str));
2508  itr == map_.end(), Exceptions::InvalidParameterValue
2509  ,"Error, the value \"" << str << "\" is not recognized for the parameter \""
2510  << ( paramName.length() ? paramName : defaultParameterName_ ) << "\""
2511  << "\nin the sublist \"" << sublistName << "\"."
2512  << "\n\nValid values include:"
2513  << "\n {\n"
2514  << validValues_
2515  << " }"
2516  );
2517  return (*itr).second;
2518 }
2519 
2520 
2521 template<class IntegralType>
2522 IntegralType
2524  const ParameterEntry &entry, const std::string &paramName
2525  ,const std::string &sublistName, const bool activeQuery
2526  ) const
2527 {
2528  if (entry.isType<IntegralType>()){
2529  return any_cast<IntegralType>(entry.getAny(activeQuery));
2530  } else{
2531  const bool validType = ( entry.getAny(activeQuery).type() == typeid(std::string) );
2534  ,"Error, the parameter {paramName=\""<<(paramName.length()?paramName:defaultParameterName_)
2535  << "\",type=\""<<entry.getAny(activeQuery).typeName()<<"\"}"
2536  << "\nin the sublist \"" << sublistName << "\""
2537  << "\nhas the wrong type."
2538  << "\n\nThe correct type is \"string\"!"
2539  );
2540  const std::string
2541  &strValue = any_cast<std::string>(entry.getAny(activeQuery)); // This cast should not fail!
2542  return getIntegralValue(strValue,paramName,sublistName); // This will validate the value and throw!
2543  }
2544 }
2545 
2546 
2547 template<class IntegralType>
2548 std::string
2550  const ParameterEntry &entry, const std::string &paramName
2551  ,const std::string &sublistName, const bool activeQuery
2552  ) const
2553 {
2554  if (entry.isType<IntegralType>()){
2555  const IntegralType intVal = any_cast<IntegralType>(entry.getAny(activeQuery));
2556  typename inv_map_t::const_iterator itr = inv_map_.find(intVal);
2557  // typename inv_map_t::const_iterator itr = inv_map_.find(intVal);
2558  // TODO: Maybe do a test on intVal but it should be valid by construction
2559  return (*itr).second;
2560  } else{
2561  // Validate the parameter's type and value
2562  this->getIntegralValue(entry,paramName,sublistName,activeQuery);
2563  // Return the std::string value which is now validated!
2564  return any_cast<std::string>(entry.getAny(activeQuery)); // This cast should not fail!
2565  }
2566 }
2567 
2568 
2569 template<class IntegralType>
2570 IntegralType
2572  ParameterList &paramList, const std::string &paramName
2573  ,const std::string &defaultValue
2574  ) const
2575 {
2576  const std::string& strValue =
2577  paramList.get (paramName,
2578  caseSensitive_ ? defaultValue : upperCase (defaultValue));
2579  return getIntegralValue (strValue, paramName, paramList.name ());
2580 }
2581 
2582 
2583 template<class IntegralType>
2584 std::string
2586  ParameterList &paramList, const std::string &paramName
2587  ,const std::string &defaultValue
2588  ) const
2589 {
2590  const std::string& strValue =
2591  paramList.get (paramName,
2592  caseSensitive_ ? defaultValue : upperCase (defaultValue));
2593  getIntegralValue(strValue,paramName,paramList.name()); // Validate!
2594  return strValue;
2595 }
2596 
2597 template<class IntegralType>
2600 {
2601  return validStringValuesDocs_;
2602 }
2603 
2604 template<class IntegralType>
2605 const std::string&
2607 {
2608  return defaultParameterName_;
2609 }
2610 
2611 template<class IntegralType>
2612 std::string
2614  const std::string &str, const std::string &paramName
2615  ,const std::string &sublistName
2616  ) const
2617 {
2618  getIntegralValue (caseSensitive_ ? str : upperCase (str),
2619  paramName,
2620  sublistName); // Validate!
2621  return str;
2622 }
2623 
2624 
2625 // Overridden from ParameterEntryValidator
2626 
2627 template<class IntegralType>
2628 const std::string
2630  return "StringIntegralValidator(" + TypeNameTraits<IntegralType>::name () + ")";
2631 }
2632 
2633 template<class IntegralType>
2635  std::string const& docString
2636  ,std::ostream & out
2637  ) const
2638 {
2639  StrUtils::printLines(out,"# ",docString);
2640  out << "# Valid std::string values:\n";
2641  out << "# {\n";
2642  if(validStringValuesDocs_.get()) {
2643  for( int i = 0; i < static_cast<int>(validStringValues_->size()); ++i ) {
2644  out << "# \"" << (*validStringValues_)[i] << "\"\n";
2645  StrUtils::printLines(out,"# ",(*validStringValuesDocs_)[i] );
2646  }
2647  }
2648  else {
2649  StrUtils::printLines(out,"# ",validValues_);
2650  // Note: Above validValues_ has for initial spaces already so indent should
2651  // be correct!
2652  }
2653  out << "# }\n";
2654 }
2655 
2656 
2657 template<class IntegralType>
2660 {
2661  return validStringValues_;
2662 }
2663 
2664 
2665 template<class IntegralType>
2667  ParameterEntry const& entry
2668  ,std::string const& paramName
2669  ,std::string const& sublistName
2670  ) const
2671 {
2672  this->getIntegralValue (entry, paramName, sublistName, false);
2673 }
2674 
2675 
2676 #if defined(HAVE_TEUCHOS_MODIFY_DEFAULTS_DURING_VALIDATION)
2677 template<class IntegralType>
2679  std::string const& paramName,
2680  std::string const& sublistName,
2681  ParameterEntry * entry
2682  ) const
2683 {
2684  entry->setValue(this->getIntegralValue(*entry, paramName, sublistName, false));
2685 }
2686 #endif
2687 
2688 
2689 // private
2690 
2691 template<class IntegralType>
2692 void StringToIntegralParameterEntryValidator<IntegralType>::setValidValues(
2693  ArrayView<const std::string> const& strings
2694  ,ArrayView<const std::string> const* stringsDocs
2695  )
2696 {
2697  if (caseSensitive_) {
2698  validStringValues_ = rcp (new Array<std::string> (strings));
2699  }
2700  else {
2701  RCP<Array<std::string> > vals (new Array<std::string> (strings.size ()));
2702  for (Array<std::string>::size_type i = 0; i < strings.size (); ++i) {
2703  (*vals)[i] = upperCase (strings[i]);
2704  }
2705  validStringValues_ = rcp_const_cast<const Array<std::string> > (vals);
2706  }
2707 
2708  if (stringsDocs) {
2709  validStringValuesDocs_ = rcp (new Array<std::string> (*stringsDocs));
2710  }
2711  // Build the list of valid values in the same order as passed in by the client.
2712  std::ostringstream oss;
2713  for (int i = 0; i < static_cast<int> (strings.size()); ++i) {
2714  oss << " \"" << strings[i] << "\"\n";
2715  }
2716  // Note: Above four spaces is designed for the error output above.
2717  validValues_ = oss.str();
2718 }
2719 
2720 
2721 } // namespace Teuchos
2722 
2723 
2724 //
2725 // Nonmember function implementations for StringToIntegralParameterEntryValidator
2726 //
2727 
2728 
2729 template<class IntegralType>
2730 inline
2732 Teuchos::stringToIntegralParameterEntryValidator(
2733  ArrayView<const std::string> const& strings,
2734  std::string const& defaultParameterName
2735  )
2736 {
2737  return rcp(
2738  new StringToIntegralParameterEntryValidator<IntegralType>(
2739  strings, defaultParameterName
2740  )
2741  );
2742 }
2743 
2744 
2745 template<class IntegralType>
2746 inline
2748 Teuchos::stringToIntegralParameterEntryValidator(
2749  ArrayView<const std::string> const& strings,
2750  std::string const& defaultParameterName,
2751  const bool caseSensitive
2752  )
2753 {
2754  typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2755  return rcp (new ret_type (strings, defaultParameterName, caseSensitive));
2756 }
2757 
2758 
2759 
2760 template<class IntegralType>
2761 inline
2763 Teuchos::stringToIntegralParameterEntryValidator(
2764  ArrayView<const std::string> const& strings,
2765  ArrayView<const IntegralType> const& integralValues,
2766  std::string const& defaultParameterName
2767  )
2768 {
2769  return rcp(
2770  new StringToIntegralParameterEntryValidator<IntegralType>(
2771  strings, integralValues, defaultParameterName
2772  )
2773  );
2774 }
2775 
2776 
2777 template<class IntegralType>
2778 inline
2780 Teuchos::stringToIntegralParameterEntryValidator(
2781  ArrayView<const std::string> const& strings,
2782  ArrayView<const IntegralType> const& integralValues,
2783  std::string const& defaultParameterName,
2784  const bool caseSensitive)
2785 {
2786  typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2787  return rcp (new ret_type (strings, integralValues,
2788  defaultParameterName, caseSensitive));
2789 }
2790 
2791 
2792 template<class IntegralType>
2793 inline
2795 Teuchos::stringToIntegralParameterEntryValidator(
2796  ArrayView<const std::string> const& strings,
2797  ArrayView<const std::string> const& stringsDocs,
2798  ArrayView<const IntegralType> const& integralValues,
2799  std::string const& defaultParameterName
2800  )
2801 {
2802  return rcp(
2803  new StringToIntegralParameterEntryValidator<IntegralType>(
2804  strings, stringsDocs, integralValues, defaultParameterName
2805  )
2806  );
2807 }
2808 
2809 
2810 template<class IntegralType>
2811 inline
2813 Teuchos::stringToIntegralParameterEntryValidator(
2814  ArrayView<const std::string> const& strings,
2815  ArrayView<const std::string> const& stringsDocs,
2816  ArrayView<const IntegralType> const& integralValues,
2817  std::string const& defaultParameterName,
2818  const bool caseSensitive)
2819 {
2820  typedef StringToIntegralParameterEntryValidator<IntegralType> ret_type;
2821  return rcp (new ret_type (strings, stringsDocs, integralValues,
2822  defaultParameterName, caseSensitive));
2823 }
2824 
2825 
2826 template<class IntegralType>
2827 void Teuchos::setStringToIntegralParameter(
2828  std::string const& paramName,
2829  std::string const& defaultValue,
2830  std::string const& docString,
2831  ArrayView<const std::string> const& strings,
2832  ParameterList * paramList
2833  )
2834 {
2835  typedef ParameterEntryValidator PEV;
2836  TEUCHOS_TEST_FOR_EXCEPT(0==paramList);
2837  paramList->set(
2838  paramName, defaultValue, docString,
2839  rcp_implicit_cast<const PEV>(
2840  stringToIntegralParameterEntryValidator<IntegralType>(
2841  strings, paramName
2842  )
2843  )
2844  );
2845 }
2846 
2847 
2848 template<class IntegralType>
2849 void Teuchos::setStringToIntegralParameter(
2850  std::string const& paramName,
2851  std::string const& defaultValue,
2852  std::string const& docString,
2853  ArrayView<const std::string> const& strings,
2854  ArrayView<const IntegralType> const& integralValues,
2855  ParameterList * paramList
2856  )
2857 {
2858  typedef ParameterEntryValidator PEV;
2859  TEUCHOS_TEST_FOR_EXCEPT(0==paramList);
2860  paramList->set(
2861  paramName, defaultValue, docString,
2862  rcp_implicit_cast<const PEV>(
2863  stringToIntegralParameterEntryValidator<IntegralType>(
2864  strings, integralValues, paramName
2865  )
2866  )
2867  );
2868 }
2869 
2870 
2871 template<class IntegralType>
2872 void Teuchos::setStringToIntegralParameter(
2873  std::string const& paramName,
2874  std::string const& defaultValue,
2875  std::string const& docString,
2876  ArrayView<const std::string> const& strings,
2877  ArrayView<const std::string> const& stringsDocs,
2878  ArrayView<const IntegralType> const& integralValues,
2879  ParameterList * paramList
2880  )
2881 
2882 {
2883  typedef ParameterEntryValidator PEV;
2884  TEUCHOS_TEST_FOR_EXCEPT(0==paramList);
2885  paramList->set(
2886  paramName, defaultValue, docString,
2887  rcp_implicit_cast<const PEV>(
2888  stringToIntegralParameterEntryValidator<IntegralType>(
2889  strings, stringsDocs, integralValues, paramName
2890  )
2891  )
2892  );
2893 }
2894 
2895 
2896 template<class IntegralType>
2897 IntegralType Teuchos::getIntegralValue(
2898  ParameterList const& paramList, std::string const& paramName
2899  )
2900 {
2901  const ParameterEntry &entry = paramList.getEntry(paramName);
2902  if (entry.isType<IntegralType>()){
2903  return getValue<IntegralType>(entry);
2904  } else{
2905  RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
2906  integralValidator = getStringToIntegralParameterEntryValidator<IntegralType>(
2907  entry, paramList, paramName
2908  );
2909  return integralValidator->getIntegralValue(
2910  entry, paramName, paramList.name(), true );
2911  }
2912 }
2913 
2914 
2915 template<class IntegralType>
2916 std::string Teuchos::getStringValue(
2917  ParameterList const& paramList, std::string const& paramName
2918  )
2919 {
2920  const ParameterEntry &entry = paramList.getEntry(paramName);
2921  RCP<const StringToIntegralParameterEntryValidator<IntegralType> >
2922  integralValidator = getStringToIntegralParameterEntryValidator<IntegralType>(
2923  entry, paramList, paramName
2924  );
2925  return integralValidator->getStringValue(
2926  entry, paramName, paramList.name(), true
2927  );
2928 }
2929 
2930 
2931 template<class IntegralType>
2934  ParameterEntry const& entry, ParameterList const& paramList,
2935  std::string const& paramName
2936  )
2937 {
2938  const RCP<const ParameterEntryValidator> validator = entry.validator();
2940  is_null(validator), Exceptions::InvalidParameterType,
2941  "Error! The parameter \""<<paramName<<"\" exists\n"
2942  "in the parameter (sub)list \""<<paramList.name()<<"\"\n"
2943  "but it does not contain any validator needed to extract\n"
2944  "an integral value of type \""<<TypeNameTraits<IntegralType>::name()<<"\"!"
2945  );
2946  const RCP<const StringToIntegralParameterEntryValidator<IntegralType> > integralValidator =
2947  rcp_dynamic_cast<const StringToIntegralParameterEntryValidator<IntegralType> >(
2948  validator
2949  );
2951  is_null(integralValidator), Exceptions::InvalidParameterType,
2952  "Error! The parameter \""<<paramName<<"\" exists\n"
2953  "in the parameter (sub)list \""<<paramList.name()<<"\"\n"
2954  "but it contains the wrong type of validator. The expected validator type\n"
2955  "is \""<<TypeNameTraits<StringToIntegralParameterEntryValidator<IntegralType> >::name()<<"\"\n"
2956  "but the contained validator type is \""<<typeName(*validator)<<"\"!"
2957  );
2958  return integralValidator;
2959 }
2960 
2961 
2962 #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 &paramName="", 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 &paramList, std::string const &paramName)
Get a StringToIntegralParameterEntryValidator&lt;IntegralType&gt; 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.
Convience class for EnhancedNumberValidators that are to be applied to arrays.
void validateAndModify(std::string const &paramName, 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&#39;s value, or the default value if it is not there.
This object is held as the &quot;value&quot; in the Teuchos::ParameterList std::map.
virtual void validate(ParameterEntry const &entry, std::string const &paramName, 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.
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
Default structure used by EnhancedNumberTraits&lt;T&gt; 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 isType() const
Test the type of the data being contained.
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 &paramName, std::string const &sublistName, ParameterEntry *entry) const
Validate and perhaps modify a parameter entry&#39;s value.
A std::string utilities class for Teuchos.
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!
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.
static unsigned short defaultPrecision()
Gets the default precision with which the number type should be displayed.
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
Validate the given ParameterEntry.
Teuchos::any getNumberFromString(const ParameterEntry &entry, const bool activeQuery) const
std::string getStringValue(const ParameterEntry &entry, const std::string &paramName="", 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.
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.
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&#39;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 &paramName="", 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
Nonowning array view.
RCP< const Array< std::string > > ValidStringsList
Default traits class that just returns typeid(T).name().
Class for retrieving a dummy object of type T.
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 &paramName, 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...
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)