source: src/Parameters/Value.hpp@ 15c75f8

SegFault_gcc4.6
Last change on this file since 15c75f8 was f8bccc, checked in by Frederik Heber <heber@…>, 11 years ago

FIX: QtQueryList now works with pointers, FileQtQuery gives name of file.

  • FileQtQuery always said "input-file:" which becomes ambigious when multiple files are queried in a single dialog.
  • Value_string was a specialization for string type. This was used to also specialize for element type (and also for atom and molecule type).
  • This automatically fixes problems where QtQueryList would show memory addresses in the list instead of e.g. element names. This occurs because toString() is used on the pointer, now getName() is called.
  • Property mode set to 100644
File size: 3.3 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 & get() const throw(ParameterValueException);
80 void set(const T & _value) throw(ParameterException);
81 bool isSet() const;
82
83 // string functions for ValueInterface
84 bool isValidAsString(const std::string &_value) const throw(ParameterValidatorException);
85 const std::string getAsString() const throw(ParameterValueException);
86 void setAsString(const std::string &_value) throw(ParameterException);
87
88 // comfortable setter
89 Value<T> &operator=(const T &_value)
90 { set(_value); return *this; }
91
92 // comparator
93 bool operator==(const Value<T> &_instance) const throw(ParameterValidatorException);
94 bool operator!=(const Value<T> &_instance) const throw(ParameterValidatorException)
95 { return !((*this)==(_instance)); }
96
97 const Validator<T> & getValidator() const;
98 Validator<T> & getValidator();
99
100 // comfortable validator functions
101 const range<T> & getValidRange() const throw(ParameterValidatorException);
102 void setValidRange(const range<T> &_range) throw(ParameterValueException);
103 void appendValidValue(const T &_value) throw(ParameterValidatorException);
104 const std::vector<T> &getValidValues() const throw(ParameterValidatorException);
105
106private:
107 //!> Internal converter from string to internal type
108 static ConvertTo<T> Converter;
109
110 //!> whether a value has been set or not
111 bool ValueSet;
112 //!> contained value
113 T value;
114
115 //!> the validator
116 Validator<T> *validator;
117};
118
119#include "Value_impl.hpp"
120
121#include "Specifics/Value_atom.hpp"
122#include "Specifics/Value_element.hpp"
123#include "Specifics/Value_molecule.hpp"
124#include "Specifics/Value_string.hpp"
125
126#endif /* VALUE_HPP_ */
Note: See TracBrowser for help on using the repository browser.