MeVisLab Toolbox Reference
mlListField.h
Go to the documentation of this file.
1 /*************************************************************************************
2 **
3 ** Copyright 2018, MeVis Medical Solutions AG
4 **
5 ** The user may use this file in accordance with the license agreement provided with
6 ** the Software or, alternatively, in accordance with the terms contained in a
7 ** written agreement between the user and MeVis Medical Solutions AG.
8 **
9 ** For further information use the contact form at https://www.mevislab.de/contact
10 **
11 **************************************************************************************/
12 
13 
15 
16 #pragma once
17 
18 #include "mlField.h"
19 #include "mlValuePersistence.h"
20 
21 #include <vector>
22 
23 ML_START_NAMESPACE
24 
25 template<class T>
26 class ListField : public Field
27 {
28 public:
30  ListField() = default;
31 
33  ListField(const std::string& name) { setName(name); }
34 
36  size_t size() const { return _values.size(); }
37 
39  void clear() { _values.clear(); }
40 
42  void setValues(const std::vector<T>& values) {
43  _values = values;
44  touch();
45  }
46 
49  void updateValues(const std::vector<T>& values) {
50  if (values != _values) {
51  setValues(values);
52  }
53  }
54 
56  std::vector<T> getValues() const { return _values; }
57 
60  void setValueAt(size_t index, T value) {
61  if (index >= _values.size()) {
62  _values.resize(index+1);
63  }
64  _values[index] = value;
65  touch();
66  }
67 
70  void updateValueAt(size_t index, T value) {
71  if ((index >= _values.size()) || (_values[index] != value)) {
72  setValueAt(index, value);
73  }
74  }
75 
77  T getValueAt(size_t index) const {
78  return _values[index];
79  }
80 
82  std::string getStringValue() const override
83  {
84  std::string result;
85  if (_values.size() != 1) {
86  result.append("[ ");
87  }
88  bool first = true;
89  for (const T& value : _values) {
90  if (!first) {
91  result.append(", ");
92  } else {
93  first = false;
94  }
95  result.append(ValuePersistence::valueToString(value));
96  }
97  if (_values.size() != 1) {
98  result.append(" ]");
99  }
100  return result;
101  }
102 
104  void setStringValue(const std::string& value) override
105  {
106  size_t endPos = std::min(value.find("]"), value.length());
107  _values.clear();
108  if (endPos > 1 && value[0] == '[') {
109  size_t pos = 1;
110  if (!isWhitespace(value, pos, endPos)) {
111  while (pos < endPos) {
112  size_t commaPos = std::min(value.find(",", pos), endPos);
113  T comp;
114  ValuePersistence::stringToValue(value.substr(pos, commaPos-pos), comp);
115  _values.push_back(comp);
116  pos = commaPos+1;
117  }
118  }
119  }
120  else {
121  T comp;
122  ValuePersistence::stringToValue(value, comp);
123  _values.push_back(comp);
124  }
125  touch();
126  }
127 
128 private:
129  static bool isWhitespace(const std::string& s, size_t start, size_t end)
130  {
131  for (size_t i = start; i < end; i++) {
132  if (!::isspace(static_cast<int>(s[i]))) {
133  return false;
134  }
135  }
136  return true;
137  }
138 
139  std::vector<T> _values;
140 };
141 
142 ML_END_NAMESPACE
@ T
Definition: SoKeyGrabber.h:71
Base class for all fields used in the ML.
Definition: mlField.h:73
void setValueAt(size_t index, T value)
Sets the field value at index index to value.
Definition: mlListField.h:60
void setStringValue(const std::string &value) override
Sets the value of the field to value.
Definition: mlListField.h:104
std::string getStringValue() const override
Returns the value of the field as string value.
Definition: mlListField.h:82
void clear()
Clear value of field.
Definition: mlListField.h:39
size_t size() const
Return number of elements of this fields value.
Definition: mlListField.h:36
void setValues(const std::vector< T > &values)
Sets the field value to values.
Definition: mlListField.h:42
void updateValueAt(size_t index, T value)
Sets the field value at index index to value, but only touch field if the new value is different from...
Definition: mlListField.h:70
ListField(const std::string &name)
Constructor, creates a list field with a name.
Definition: mlListField.h:33
ListField()=default
Default constructor, do not use it.
T getValueAt(size_t index) const
Get component value at index index. index must be in range.
Definition: mlListField.h:77
std::vector< T > getValues() const
Returns the value of the field as a Boolean.
Definition: mlListField.h:56
void updateValues(const std::vector< T > &values)
Sets the field value to values, but only touch field if the new values are different from the old val...
Definition: mlListField.h:49
MLEXPORT std::string valueToString(MLint value)
MLEXPORT void stringToValue(const std::string &s, MLint &value)