source: src/Parameters/Value.hpp@ a443e1

ForceAnnealing_goodresults ForceAnnealing_tocheck
Last change on this file since a443e1 was a443e1, checked in by Frederik Heber <frederik.heber@…>, 8 years ago

Added specific Value and Parameter implemenations for Vector.

  • for the CommandLineParser the values are get parsed immediately (prior to executing any Action). Hence, names of geometry objects that first need to be created by an action cannot yet be present in the registry and thus the Action will fail.
  • we need to postpone the replacement of the geometry name by its stored vector components until the Parameter<>::get() call. This is possible as the value is validated only on get(), not on set(), i.e. giving illegal values is ok, only the Action will fail.
  • therefore, we override the specialize the template Value for Vector to allow storing of a string instead of a Vector and to allow putting the actual parsing of the string in front.
  • the Parameter overriding becomes necessary in order to override clone() and copy cstor(), there using string setters.
  • ContinuousValueTest now needs lib..Parameters, lib..Geometry.
  • static functions parseAsVector and setFromVector for convenience, e.g. QtUI needs to convert from string and to Vector.
  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 * Value.hpp
3 *
4 * Created on: Apr 13, 2012
5 * Author: ankele
6 */
7
8#ifndef VALUE_HPP_
9#define VALUE_HPP_
10
11
12// include config.h
13#ifdef HAVE_CONFIG_H
14#include <config.h>
15#endif
16
17#include <string>
18#include <vector>
19
20#include "ValueAsString.hpp"
21#include "ValueInterface.hpp"
22#include "Validators/Validator.hpp"
23
24#include "StreamOperators.hpp"
25
26#include "CodePatterns/Range.hpp"
27#include "CodePatterns/toString.hpp"
28
29class ValueTest;
30template <class T>
31class Parameter;
32class ParameterException;
33class ParameterValidatorException;
34class ParameterValueException;
35
36/** Converter for a string to a std::vector of any class
37 * We use default conversion via stringstream as suggested by [Stroustrup].
38 * \param _&_object reference to object to convert.
39 * \return converted \a _object of templated type
40 */
41template <class T>
42struct ConvertTo< std::vector<T> > {
43 std::vector<T> operator()(const std::string &_object) {
44 std::vector<T> returnobjects;
45 if (!_object.empty()) {
46 std::stringstream s;
47 T object;
48 s << _object;
49 while (s.good()) {
50 s >> object;
51 returnobjects.push_back(object);
52 }
53 }
54 return returnobjects;
55 }
56};
57
58/** This class represents a general value.
59 *
60 */
61template <class T>
62class Value :
63 public ValueAsString,
64 public ValueInterface<T>
65{
66 //!> unit test needs to have access to internal values
67 friend class ValueTest;
68 friend class ContinuousValueTest;
69// friend class Parameter<T>;
70public:
71 Value();
72 Value(const Validator<T> &_validator);
73 Value(const std::vector<T> &_ValidValues);
74 Value(const range<T> &_ValidRange);
75 virtual ~Value();
76
77 // functions for ValueInterface
78 bool isValid(const T &_value) const throw(ParameterValidatorException);
79 const T & getUnvalidated() const throw(ParameterValueException);
80 const T & get() const throw(ParameterValueException);
81 void set(const T & _value) throw(ParameterException);
82 bool isSet() const;
83
84 // string functions for ValueInterface
85 bool isValidAsString(const std::string &_value) const throw(ParameterValidatorException);
86 const std::string getAsString() const throw(ParameterValueException);
87 void setAsString(const std::string &_value) throw(ParameterException);
88
89 // comfortable setter
90 Value<T> &operator=(const T &_value)
91 { set(_value); return *this; }
92
93 // comparator
94 bool operator==(const Value<T> &_instance) const throw(ParameterValidatorException);
95 bool operator!=(const Value<T> &_instance) const throw(ParameterValidatorException)
96 { return !((*this)==(_instance)); }
97
98 const Validator<T> & getValidator() const;
99 Validator<T> & getValidator();
100
101 // comfortable validator functions
102 const range<T> & getValidRange() const throw(ParameterValidatorException);
103 void setValidRange(const range<T> &_range) throw(ParameterValueException);
104 void appendValidValue(const T &_value) throw(ParameterValidatorException);
105 const std::vector<T> &getValidValues() const throw(ParameterValidatorException);
106
107private:
108 //!> Internal converter from string to internal type
109 static ConvertTo<T> Converter;
110
111 //!> whether a value has been set or not
112 bool ValueSet;
113 //!> contained value
114 T value;
115
116 //!> the validator
117 Validator<T> *validator;
118};
119
120#include "Specifics/Value_atom.hpp"
121#include "Specifics/Value_element.hpp"
122#include "Specifics/Value_elements.hpp"
123#include "Specifics/Value_molecule.hpp"
124#include "Specifics/Value_string.hpp"
125#include "Specifics/Value_vector.hpp"
126
127#include "Value_impl.hpp"
128
129#endif /* VALUE_HPP_ */
Note: See TracBrowser for help on using the repository browser.