Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_StandardParameterEntryValidators.hpp
Go to the documentation of this file.
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 
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:
301  std::string validValues_;
304 
305  typedef std::map<std::string,IntegralType> map_t;
307  typedef std::map<IntegralType,std::string> inv_map_t;
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 
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 
685 boolParameterEntryValidator();
686 
687 
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_;
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 
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
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<>
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<>
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<>
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 
1553 
1557 
1561 
1565  unsigned short precision_;
1566 
1570 
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 
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 
1833 
1835 
1836 };
1837 
1843 template<>
1845 
1846 public:
1847 
1850 
1854  static RCP<FileNameValidator> getDummyObject();
1855 
1857 
1858 };
1859 
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<>
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 
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 
2144  public TwoDArrayValidator<StringValidator, std::string>{
2145 
2146 public:
2147 
2150 
2153  TwoDArrayValidator<StringValidator, std::string>(prototypeValidator){}
2154 
2156 
2157 };
2158 
2159 
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 
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>
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>
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.
EVerbosityLevel
Verbosity level.
EnhancedNumberValidator()
Constructs a EnhancedNumberValidator without an explicit minimum or maximum.
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
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.
T minVal
The minimum value accepted by the validator.
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.
void init(const ArrayView< const std::string > &strings, const ArrayView< const IntegralType > &integralValues)
Auxiliary method to simplify constructors.
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.
ValidStringsList validStrings_
An array containing a list of all the valid string values.
AbstractArrayValidator()
Hidden default constructor.
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!
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.
bool containsMax
Whetehr or not a maximum value has been specified for this validator.
Teuchos::any getNumberFromString(const ParameterEntry &entry, const bool activeQuery) const
std::string toString(const HashSet< Key > &h)
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.
bool mustAlreadyExist_
Whether or not the file specified in the parameter should already exist.
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.
#define TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT
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.
unsigned short precision_
The number of decimal places with which the nubmer will be displayed in a UI. This value is meaningle...
static const std::string & getPrefferedTypeString(EPreferredType enumValue)
Gets the string representation of a given preferred type enum.
static std::string upperCase(const std::string s)
Return an upper-case copy of the string s.
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.
void setValidValues(ArrayView< const std::string > const &strings, ArrayView< const std::string > const *stringsDocs=NULL)
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.
T step_
The increment to use when increaseing or decreaseing the value the validator is validating.
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.
bool containsMin
Whether or not a minimum value has been specified for this validator.
#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...
T maxVal
The maximum value accepted by the validator.
RCP< const ValidatorType > prototypeValidator_
The prototype validator to be applied to each entry in the Array.
#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)