Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
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
30namespace Teuchos {
31
59template<class IntegralType>
61public:
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
205 const std::string &paramName = "",
206 const std::string &sublistName = "",
207 const bool activeQuery = true) const;
208
215 IntegralType
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
274 std::string const& docString,
275 std::ostream & out
276 ) const;
277
281
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)
291 std::string const& paramName,
292 std::string const& sublistName,
293 ParameterEntry * entry
294 ) const;
295#endif
296
298
299private:
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
347template<class IntegralType>
348RCP<StringToIntegralParameterEntryValidator<IntegralType> >
350 ArrayView<const std::string> const& strings,
351 std::string const& defaultParameterName
352 );
353
354
359template<class IntegralType>
362 ArrayView<const std::string> const& strings,
363 std::string const& defaultParameterName,
364 const bool caseSensitive
365 );
366
367
372template<class IntegralType>
375 ArrayView<const std::string> const& strings,
376 ArrayView<const IntegralType> const& integralValues,
377 std::string const& defaultParameterName
378 );
379
380
385template<class IntegralType>
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
399template<class IntegralType>
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
413template<class IntegralType>
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
434template<class IntegralType>
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
455template<class IntegralType>
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
477template<class IntegralType>
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
499template<class IntegralType>
500IntegralType getIntegralValue(
501 ParameterList const& paramList, std::string const& paramName
502 );
503
504
516template<class IntegralType>
517std::string getStringValue(
518 ParameterList const& paramList, std::string const& paramName
519 );
520
521
527template<class IntegralType>
530 ParameterEntry const& entry, ParameterList const& paramList,
531 std::string const& paramName
532 );
533
534
540std::string getVerbosityLevelParameterValueName(
541 const EVerbosityLevel verbLevel
542 );
543
544
550verbosityLevelParameterEntryValidator(std::string const& defaultParameterName);
551
557template<class IntegralType>
573
574template<class IntegralType>
582
595class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT BoolParameterEntryValidator
597{
598public:
599
602
603 BoolParameterEntryValidator();
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
651 std::string const& paramName,
652 std::string const& sublistName,
653 ParameterEntry * entry
654 ) const;
655
657
658private:
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
684TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<BoolParameterEntryValidator>
686
687
701class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT AnyNumberParameterEntryValidator
703{
704public:
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 {}
723
724 AcceptedTypes& allowInt( bool _allowInt )
725 { allowInt_ = _allowInt; return *this; }
726
727 AcceptedTypes& allowLongLong( bool _allowLongLong )
728 { allowLongLong_ = _allowLongLong; return *this; }
729
730 AcceptedTypes& allowDouble( bool _allowDouble )
731 { allowDouble_ = _allowDouble; return *this; }
732
733 AcceptedTypes& allowString( bool _allowString )
734 { allowString_ = _allowString; return *this; }
735
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
939private:
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
1003TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1005
1006
1011TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP<AnyNumberParameterEntryValidator>
1015 );
1016
1022TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setIntParameter(
1023 std::string const& paramName,
1024 int const value, std::string const& docString,
1025 ParameterList *paramList,
1028 );
1029
1030
1036TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setLongLongParameter(
1037 std::string const& paramName,
1038 long long const value, std::string const& docString,
1039 ParameterList *paramList,
1042 );
1043
1049TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setDoubleParameter(
1050 std::string const& paramName,
1051 double const& value, std::string const& docString,
1052 ParameterList *paramList,
1055 );
1056
1057
1063TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setNumericStringParameter(
1064 std::string const& paramName,
1065 std::string const& value, std::string const& docString,
1066 ParameterList *paramList,
1069 );
1070
1071
1086TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT int getIntParameter(
1087 ParameterList const& paramList, std::string const& paramName
1088 );
1089
1090
1105TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT long long getLongLongParameter(
1106 ParameterList const& paramList, std::string const& paramName
1107 );
1108
1123TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT double getDoubleParameter(
1124 ParameterList const& paramList,
1125 std::string const& paramName
1126 );
1127
1128
1144TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT std::string getNumericStringParameter(
1145 ParameterList const& paramList,
1146 std::string const& paramName
1147 );
1148
1154template<>
1155class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<AnyNumberParameterEntryValidator>{
1156
1157public:
1158
1161
1166
1168
1169};
1170
1171
1176template <class T>
1179 static inline T notDefined() {
1180 return T::this_type_is_missing_a_specialization();
1181 }
1182};
1183
1184
1205template <class T>
1207public:
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
1230template<>
1231class EnhancedNumberTraits<short int>{
1232public:
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
1240template<>
1241class EnhancedNumberTraits<short unsigned int>{
1242public:
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
1250template<>
1251class EnhancedNumberTraits<int>{
1252public:
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
1260template<>
1261class EnhancedNumberTraits<unsigned int>{
1262public:
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
1270template<>
1271class EnhancedNumberTraits<long int>{
1272public:
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
1280template<>
1281class EnhancedNumberTraits<long unsigned int>{
1282public:
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
1290template<>
1291class EnhancedNumberTraits<long long int>{
1292public:
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
1300template<>
1301class EnhancedNumberTraits<long long unsigned int>{
1302public:
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
1311template<>
1312class EnhancedNumberTraits<__float128>{
1313public:
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
1321template<>
1322class EnhancedNumberTraits<double>{
1323public:
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
1331template<>
1332class EnhancedNumberTraits<long double>{
1333public:
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
1341template<>
1342class EnhancedNumberTraits<float>{
1343public:
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
1355template <class T>
1357
1358public:
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
1535private:
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
1579template<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
1604template<class T>
1605bool EnhancedNumberValidator<T>::useIntConversions() const
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
1629template<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
1647template<class T>
1648void 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
1695template<class T>
1697
1698public:
1699
1702
1707
1709};
1710
1711template<class T>
1717
1726class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT FileNameValidator : public ParameterEntryValidator {
1727
1728public:
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
1823private:
1824
1827
1831 bool mustAlreadyExist_;
1832 bool EmptyNameOK_;
1833
1835
1836};
1837
1843template<>
1844class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<FileNameValidator>{
1845
1846public:
1847
1850
1855
1857
1858};
1859
1867class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT StringValidator : public ParameterEntryValidator {
1868
1869public:
1870
1873
1877
1882 StringValidator(const Teuchos::Array<std::string> &validStrings);
1883
1885
1887
1888
1897 const Teuchos::Array<std::string> &validStrings);
1898
1900
1903
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
1919private:
1920
1923
1926 ValidStringsList validStrings_;
1927
1929
1930};
1931
1937template<>
1938class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT DummyObjectGetter<StringValidator>{
1939
1940public:
1941
1944
1949
1951
1952};
1953
1954
1958template<class ValidatorType, class EntryType>
1960
1961public:
1962
1965
1974 prototypeValidator_(prototypeValidator){}
1975
1977
1980
1983 return prototypeValidator_;
1984 }
1985
1987
1990
1993 return prototypeValidator_->validStringValues();
1994 }
1995
1997
1998private:
1999
2002
2005 RCP<const ValidatorType> prototypeValidator_;
2006
2009
2011
2012};
2013
2026template<class ValidatorType, class EntryType>
2027class TwoDArrayValidator : public AbstractArrayValidator<ValidatorType, EntryType>{
2028public:
2031
2037
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
2071template<class ValidatorType, class EntryType>
2072void 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 =
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
2115template<class ValidatorType, class EntryType>
2116class DummyObjectGetter<TwoDArrayValidator<ValidatorType, EntryType> >{
2117
2118public:
2119
2122
2127
2129
2130};
2131
2132template<class ValidatorType, class EntryType>
2139
2143class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT TwoDArrayStringValidator :
2144 public TwoDArrayValidator<StringValidator, std::string>{
2145
2146public:
2147
2150
2153 TwoDArrayValidator<StringValidator, std::string>(prototypeValidator){}
2154
2156
2157};
2158
2159
2164class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT TwoDArrayFileNameValidator :
2165 public TwoDArrayValidator<FileNameValidator, std::string>{
2166
2167public:
2168
2171
2174 TwoDArrayValidator<FileNameValidator, std::string>(prototypeValidator){}
2175
2177
2178};
2179
2180
2184template<class T>
2185class TwoDArrayNumberValidator : public TwoDArrayValidator<EnhancedNumberValidator<T>, T>{
2186public:
2189
2192 RCP<const EnhancedNumberValidator<T> > prototypeValidator):
2193 TwoDArrayValidator<EnhancedNumberValidator<T>, T>(prototypeValidator){}
2194
2196
2197};
2198
2199
2211template<class ValidatorType, class EntryType>
2212class ArrayValidator : public AbstractArrayValidator<ValidatorType, EntryType>{
2213
2214public:
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
2257template<class ValidatorType, class EntryType>
2258void 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 =
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
2298template<class ValidatorType, class EntryType>
2299class DummyObjectGetter<ArrayValidator<ValidatorType, EntryType> >{
2300
2301public:
2302
2305
2310
2312
2313};
2314
2315template<class ValidatorType, class EntryType>
2322
2323
2332class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT ArrayStringValidator :
2333 public ArrayValidator<StringValidator, std::string>{
2334
2335public:
2336
2339
2342 ArrayValidator<StringValidator, std::string>(prototypeValidator){}
2343
2345
2346};
2347
2348
2357class TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT ArrayFileNameValidator : public ArrayValidator<FileNameValidator, std::string>{
2358
2359public:
2360
2363
2366 ArrayValidator<FileNameValidator, std::string>(prototypeValidator){}
2367
2369
2370};
2371
2372
2380template<class T>
2381class ArrayNumberValidator : public ArrayValidator<EnhancedNumberValidator<T>, T>{
2382public:
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
2409template<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
2426template<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
2443template<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
2467template <class IntegralType>
2468void StringToIntegralParameterEntryValidator<IntegralType>::init(
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
2499template<class IntegralType>
2500IntegralType
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
2521template<class IntegralType>
2522IntegralType
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
2547template<class IntegralType>
2548std::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
2569template<class IntegralType>
2570IntegralType
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
2583template<class IntegralType>
2584std::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
2597template<class IntegralType>
2600{
2601 return validStringValuesDocs_;
2602}
2603
2604template<class IntegralType>
2605const std::string&
2607{
2608 return defaultParameterName_;
2609}
2610
2611template<class IntegralType>
2612std::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
2627template<class IntegralType>
2628const std::string
2632
2633template<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
2657template<class IntegralType>
2660{
2661 return validStringValues_;
2662}
2663
2664
2665template<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)
2677template<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
2691template<class IntegralType>
2692void 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
2729template<class IntegralType>
2730inline
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
2745template<class IntegralType>
2746inline
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
2760template<class IntegralType>
2761inline
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
2777template<class IntegralType>
2778inline
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
2792template<class IntegralType>
2793inline
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
2810template<class IntegralType>
2811inline
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
2826template<class IntegralType>
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,
2841 strings, paramName
2842 )
2843 )
2844 );
2845}
2846
2847
2848template<class IntegralType>
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,
2864 strings, integralValues, paramName
2865 )
2866 )
2867 );
2868}
2869
2870
2871template<class IntegralType>
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,
2889 strings, stringsDocs, integralValues, paramName
2890 )
2891 )
2892 );
2893}
2894
2895
2896template<class IntegralType>
2898 ParameterList const& paramList, std::string const& paramName
2899 )
2900{
2901 const ParameterEntry &entry = paramList.getEntry(paramName);
2902 if (entry.isType<IntegralType>()){
2904 } else{
2907 entry, paramList, paramName
2908 );
2909 return integralValidator->getIntegralValue(
2910 entry, paramName, paramList.name(), true );
2911 }
2912}
2913
2914
2915template<class IntegralType>
2917 ParameterList const& paramList, std::string const& paramName
2918 )
2919{
2920 const ParameterEntry &entry = paramList.getEntry(paramName);
2923 entry, paramList, paramName
2924 );
2925 return integralValidator->getStringValue(
2926 entry, paramName, paramList.name(), true
2927 );
2928}
2929
2930
2931template<class IntegralType>
2934 ParameterEntry const& entry, ParameterList const& paramList,
2935 std::string const& paramName
2936 )
2937{
2938 const RCP<const ParameterEntryValidator> validator = entry.validator();
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 );
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"
2956 "but the contained validator type is \""<<typeName(*validator)<<"\"!"
2957 );
2958 return integralValidator;
2959}
2960
2961
2962#endif // TEUCHOS_STANDARD_PARAMETER_ENTRY_VALIDATORS_H
Templated Parameter List class.
A std::string utilities class for Teuchos.
A thin wrapper around the Teuchos Array class that allows for 2 dimensional arrays.
Defines basic traits returning the name of a type in a portable and readable way.
RCP< const ValidatorType > getPrototype() const
Returns the prototype validator for this Array Validator.
AbstractArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs an AbstractArrayValidator.
AcceptedTypes & allowInt(bool _allowInt)
Set allow an int value or not.
AcceptedTypes & allowDouble(bool _allowDouble)
Set allow a double value or not.
AcceptedTypes & allowLongLong(bool _allowLongLong)
Set allow an long long value or not.
AcceptedTypes & allowString(bool _allowString)
Set allow an std::string value or not.
AcceptedTypes(bool allowAllTypesByDefault=true)
Allow all types or not on construction.
Standard implementation of a ParameterEntryValidator that accepts numbers from a number of different ...
static EPreferredType getPrefferedTypeStringEnum(const std::string &enumString)
Gets the preferred type enum associated with a give string.
static const std::string & getPrefferedTypeString(EPreferredType enumValue)
Gets the string representation of a given preferred type enum.
AnyNumberParameterEntryValidator()
Construct with a preferrded type of double and accept all types.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP< AnyNumberParameterEntryValidator > anyNumberParameterEntryValidator()
Nonmember constructor AnyNumberParameterEntryValidator.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP< AnyNumberParameterEntryValidator > anyNumberParameterEntryValidator(AnyNumberParameterEntryValidator::EPreferredType const preferredType, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes)
Nonmember constructor AnyNumberParameterEntryValidator.
ArrayFileNameValidator(RCP< const FileNameValidator > prototypeValidator)
ArrayNumberValidator(RCP< const EnhancedNumberValidator< T > > prototypeValidator)
ArrayStringValidator(RCP< const StringValidator > prototypeValidator)
Takes a validator, wraps it, and applies it to an array.
ArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs a ArrayValidator.
virtual void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
virtual void printDoc(std::string const &docString, std::ostream &out) const
Nonowning array view.
size_type size() const
The total number of items in the managed array.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes.
size_type size() const
Ordinal size_type
The type of Array sizes and capacities.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT RCP< BoolParameterEntryValidator > boolParameterEntryValidator()
Nonmember constructor BoolParameterEntryValidator.
void validateAndModify(std::string const &paramName, std::string const &sublistName, ParameterEntry *entry) const
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
bool getBool(const ParameterEntry &entry, const std::string &paramName="", const std::string &sublistName="", const bool activeQuery=true) const
Get bool value from a parameter entry.
void printDoc(std::string const &docString, std::ostream &out) const
static RCP< AnyNumberParameterEntryValidator > getDummyObject()
Retrieves a dummy object of type AnyNumberParameterEntryValidator.
static RCP< ArrayValidator< ValidatorType, EntryType > > getDummyObject()
Retrieves a dummy object of type ArrayValidator<ValidatorType, EntryType>.
static RCP< EnhancedNumberValidator< T > > getDummyObject()
Retrieves a dummy object of type EnhancedNumberValidator<T>.
static RCP< FileNameValidator > getDummyObject()
Retrieves a dummy object of type FileNameValidator.
static RCP< StringToIntegralParameterEntryValidator< IntegralType > > getDummyObject()
Retrieves a dummy object of type StringToIntegralParameterEntryValidator<IntegralType>.
static RCP< StringValidator > getDummyObject()
Retrieves a dummy object of type StringValidator.
static RCP< TwoDArrayValidator< ValidatorType, EntryType > > getDummyObject()
Retrieves a dummy object of type TwoDArrayValidator<ValidatorType, EntryType>.
Class for retrieving a dummy object of type T.
static RCP< T > getDummyObject()
Retrieves a dummy object of type T.
Class defining the traits of the number type being used in an EnhancedNumberValidator.
static T max()
Gets the maximum possible value the number type can take on.
static unsigned short defaultPrecision()
Gets the default precision with which the number type should be displayed.
static T defaultStep()
gets default amount a value of the number type should be incremented by when being utilizied in a UI.
static T min()
Gets the minimum possible value the number type can take on.
Class uesd to validate a particular type of number.
T getMax() const
Gets the maximum acceptable value for the validator.
Teuchos::any getNumberFromString(const ParameterEntry &entry, const bool activeQuery) const
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.
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
void setMax(T max)
Sets the maximum acceptable value for the validator.
void validateAndModify(std::string const &paramName, std::string const &sublistName, ParameterEntry *entry) const
T getStep() const
Gets the step being used for the validator.
unsigned short getPrecision() const
Gets the precision specified for the validator.
void setStep(T step)
Sets the step being used for the validator.
bool hasMax() const
Determines whether or not the validator has a maximum value.
T getMin() const
Gets the minimum acceptable value for the validator.
void setPrecision(unsigned short precision)
Sets the precision specified for the validator.
void printDoc(std::string const &docString, std::ostream &out) const
EnhancedNumberValidator()
Constructs a EnhancedNumberValidator without an explicit minimum or maximum.
bool hasMin() const
Determines whether or not the validator has a minimum value.
static bool mustAlreadyExistDefault()
The default value of the mustAlreadyExist parameter in the constructor.
FileNameValidator(bool mustAlreadyExist=mustAlreadyExistDefault())
Constructs a FileNameValidator.
Abstract interface for an object that can validate a ParameterEntry's value.
virtual void validateAndModify(std::string const &paramName, std::string const &sublistName, ParameterEntry *entry) const
Validate and perhaps modify a parameter entry's value.
RCP< const Array< std::string > > ValidStringsList
This object is held as the "value" in the Teuchos::ParameterList std::map.
bool isType() const
Test the type of the data being contained.
any & getAny(bool activeQry=true)
Direct access to the Teuchos::any data value underlying this object. The bool argument activeQry (def...
RCP< const ParameterEntryValidator > validator() const
Return the (optional) validator 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.
T & getValue(const ParameterEntry &entry)
A templated helper function for returning the value of type T held in the ParameterEntry object,...
A list of parameters of arbitrary type.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT std::string getNumericStringParameter(ParameterList const &paramList, std::string const &paramName)
Get std::string numeric parameter.
std::string getStringValue(ParameterList const &paramList, std::string const &paramName)
Get a std::string value for a parameter that is assumed to already be set.
const ParameterEntry & entry(ConstIterator i) const
Access to ParameterEntry (i.e., returns i->second).
IntegralType getIntegralValue(ParameterList const &paramList, std::string const &paramName)
Get an integral value for a parameter that is assumed to already be set.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setDoubleParameter(std::string const &paramName, double const &value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an double parameter that allows for (nearly) any input parameter type that is convertible to a do...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setLongLongParameter(std::string const &paramName, long long const value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an integer parameter that allows for (nearly) any input parameter type that is convertible to an ...
const std::string & name() const
The name of this ParameterList.
ParameterList()=default
Constructor.
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
Templated set method.
ParameterEntry & getEntry(const std::string &name)
Retrieves an entry with the name name.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT double getDoubleParameter(ParameterList const &paramList, std::string const &paramName)
Get double integer parameter.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setIntParameter(std::string const &paramName, int const value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an integer parameter that allows for (nearly) any input parameter type that is convertible to an ...
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
void setStringToIntegralParameter(std::string const &paramName, std::string const &defaultValue, std::string const &docString, ArrayView< const std::string > const &strings, ParameterList *paramList)
Set up a std::string parameter that will use an embedded validator to allow the extraction of an inte...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void setNumericStringParameter(std::string const &paramName, std::string const &value, std::string const &docString, ParameterList *paramList, AnyNumberParameterEntryValidator::AcceptedTypes const &acceptedTypes=AnyNumberParameterEntryValidator::AcceptedTypes())
Set an numeric parameter preferred as a std::string that allows for (nearly) any input parameter type...
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT long long getLongLongParameter(ParameterList const &paramList, std::string const &paramName)
Get a long long parameter.
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT int getIntParameter(ParameterList const &paramList, std::string const &paramName)
Get an integer parameter.
Smart reference counting pointer class for automatic garbage collection.
RCP< T2 > rcp_dynamic_cast(const RCP< T1 > &p1, bool throw_on_fail=false)
Dynamic cast of underlying RCP type from T1* to T2*.
RCP< T2 > rcp_implicit_cast(const RCP< T1 > &p1)
Implicit cast of underlying RCP type from T1* to T2*.
RCP< T2 > rcp_const_cast(const RCP< T1 > &p1)
Constant cast of underlying RCP type from T1* to T2*.
static std::ostream & printLines(std::ostream &os, const std::string &linePrefix, const std::string &lines)
Print lines with prefix first.
Standard implementation of a ParameterEntryValidator that maps from a list of strings to an enum or i...
StringToIntegralParameterEntryValidator(const ArrayView< const std::string > &strings, const std::string &defaultParameterName, const bool caseSensitive=true)
Construct with a mapping from strings to the enum or integer values .
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.
ValidStringsList getStringDocs() const
Get a pointer to the array containing all the documentation strings.
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, std::string const &defaultParameterName, const bool caseSensitive)
Nonmember constructor (see implementation).
std::string validateString(const std::string &str, const std::string &paramName="", const std::string &sublistName="") const
Validate the std::string and pass it on.
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.
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, std::string const &defaultParameterName)
Nonmember constructor (see implementation).
bool isCaseSensitive() const
Whether this validator is case sensitive.
void printDoc(std::string const &docString, std::ostream &out) const
Print documentation to the given output string.
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, ArrayView< const IntegralType > const &integralValues, std::string const &defaultParameterName)
Nonmember constructor (see implementation).
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, ArrayView< const std::string > const &stringsDocs, ArrayView< const IntegralType > const &integralValues, std::string const &defaultParameterName, const bool caseSensitive)
Nonmember constructor (see implementation).
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, ArrayView< const std::string > const &stringsDocs, ArrayView< const IntegralType > const &integralValues, std::string const &defaultParameterName)
Nonmember constructor (see implementation).
RCP< StringToIntegralParameterEntryValidator< IntegralType > > stringToIntegralParameterEntryValidator(ArrayView< const std::string > const &strings, ArrayView< const IntegralType > const &integralValues, std::string const &defaultParameterName, const bool caseSensitive)
Nonmember constructor (see implementation).
const std::string & getDefaultParameterName() const
Get the name of the default parameter for the validator.
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
Validate the given ParameterEntry.
A simple validator that only allows certain string values to be choosen or simply enforces that a par...
void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
void printDoc(std::string const &docString, std::ostream &out) const
ValidStringsList setValidStrings(const Teuchos::Array< std::string > &validStrings)
Sets the Array of valid strings and returns what the current array of valid string now is.
Tuple< T, 1 > tuple(const T &a)
Create a Tuple<T,1>.
TwoDArrayFileNameValidator(RCP< const FileNameValidator > prototypeValidator)
TwoDArrayNumberValidator(RCP< const EnhancedNumberValidator< T > > prototypeValidator)
TwoDArrayStringValidator(RCP< const StringValidator > prototypeValidator)
Takes a validator, wraps it, and applies it to a TwoDArray.
virtual void validate(ParameterEntry const &entry, std::string const &paramName, std::string const &sublistName) const
TwoDArrayValidator(RCP< const ValidatorType > prototypeValidator)
Constructs a ArrayValidator.
virtual void printDoc(std::string const &docString, std::ostream &out) const
A thin wrapper around the Array class which causes it to be interpreted as a 2D Array.
size_type getNumCols() const
returns the number of columns in the TwoDArray.
size_type getNumRows() const
returns the number of rows in the TwoDArray.
Default traits class that just returns typeid(T).name().
Modified boost::any class, which is a container for a templated value.
ValueType & any_cast(any &operand)
Used to extract the templated value held in Teuchos::any to a given value type.
std::string typeName() const
Return the name of the type.
const std::type_info & type() const
Return the type of value being stored.
#define TEUCHOS_TEST_FOR_EXCEPTION_PURE_MSG(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#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.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#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 ...
bool is_null(const std::shared_ptr< T > &p)
Returns true if p.get()==NULL.
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
EVerbosityLevel
Verbosity level.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
RCP< const StringToIntegralParameterEntryValidator< IntegralType > > getStringToIntegralParameterEntryValidator(ParameterEntry const &entry, ParameterList const &paramList, std::string const &paramName)
Get a StringToIntegralParameterEntryValidator<IntegralType> object out of a ParameterEntry object.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
Default structure used by EnhancedNumberTraits<T> to produce a compile time error when the specializa...
static T notDefined()
This function should not compile if there is an attempt to instantiate!