14 #ifndef smtk_attribute_ValueItemDefinitionTemplate_h
15 #define smtk_attribute_ValueItemDefinitionTemplate_h
17 #include "smtk/attribute/ValueItemDefinition.h"
18 #include "smtk/common/CompilerInformation.h"
27 template<
typename DataT>
31 typedef DataT DataType;
35 const DataT& defaultValue()
const;
36 const DataT& defaultValue(std::size_t element)
const;
37 const std::vector<DataT>& defaultValues()
const;
38 virtual bool setDefaultValue(
const DataT& val);
39 virtual bool setDefaultValue(
const std::vector<DataT>& val);
40 const DataT& discreteValue(std::size_t element)
const {
return m_discreteValues[element]; }
41 void addDiscreteValue(
const DataT& val);
42 void addDiscreteValue(
const DataT& val,
const std::string& discreteEnum);
43 void clearDiscreteValues();
44 bool hasRange()
const override {
return m_minRangeSet || m_maxRangeSet; }
45 bool hasMinRange()
const {
return m_minRangeSet; }
46 const DataT& minRange()
const {
return m_minRange; }
47 bool minRangeInclusive()
const {
return m_minRangeInclusive; }
48 bool setMinRange(
const DataT& minVal,
bool isInclusive);
49 bool hasMaxRange()
const {
return m_maxRangeSet; }
50 const DataT& maxRange()
const {
return m_maxRange; }
51 bool maxRangeInclusive()
const {
return m_maxRangeInclusive; }
52 bool setMaxRange(
const DataT& maxVal,
bool isInclusive);
54 int findDiscreteIndex(
const DataT& val)
const;
55 bool isValueValid(
const DataT& val)
const;
60 void updateDiscreteValue()
override;
61 std::vector<DataT> m_defaultValue;
64 bool m_minRangeInclusive;
67 bool m_maxRangeInclusive;
68 std::vector<DataT> m_discreteValues;
74 template<
typename DataT>
78 m_minRangeSet =
false;
79 m_minRangeInclusive =
false;
80 m_maxRangeSet =
false;
81 m_maxRangeInclusive =
false;
88 template<
typename DataT>
91 std::vector<DataT> defaultTuple(1, dvalue);
92 return this->setDefaultValue(defaultTuple);
95 template<
typename DataT>
98 assert(
static_cast<int>(m_discreteValues.size()) > m_defaultDiscreteIndex);
99 this->setDefaultValue(m_discreteValues[m_defaultDiscreteIndex]);
116 template<
typename DataT>
123 (this->isDiscrete() || this->isExtensible() ||
124 (dvalue.size() != this->numberOfRequiredValues())))
126 typename std::vector<DataT>::const_iterator it;
127 for (it = dvalue.begin(); it != dvalue.end(); ++it)
129 if (!this->isValueValid(*it))
134 m_defaultValue = dvalue;
139 template<
typename DataT>
143 std::ostringstream oss;
145 this->addDiscreteValue(dvalue, oss.str());
148 template<
typename DataT>
149 void ValueItemDefinitionTemplate<DataT>::addDiscreteValue(
151 const std::string& dlabel)
153 m_discreteValues.push_back(dvalue);
154 m_discreteValueEnums.push_back(dlabel);
157 template<
typename DataT>
158 void ValueItemDefinitionTemplate<DataT>::clearDiscreteValues()
160 m_discreteValues.clear();
161 m_discreteValueEnums.clear();
164 template<
typename DataT>
165 bool ValueItemDefinitionTemplate<DataT>::setMinRange(
const DataT& minVal,
bool isInclusive)
170 typename std::vector<DataT>::const_iterator it;
171 for (it = m_defaultValue.begin(); it != m_defaultValue.end(); ++it)
175 if ((!isInclusive) && (*it == minVal))
179 if ((!m_maxRangeSet) || (minVal < m_maxRange))
181 m_minRangeSet =
true;
183 m_minRangeInclusive = isInclusive;
189 template<
typename DataT>
190 bool ValueItemDefinitionTemplate<DataT>::setMaxRange(
const DataT& maxVal,
bool isInclusive)
195 typename std::vector<DataT>::const_iterator it;
196 for (it = m_defaultValue.begin(); it != m_defaultValue.end(); ++it)
200 if ((!isInclusive) && (*it == maxVal))
204 if ((!m_minRangeSet) || (maxVal > m_minRange))
206 m_maxRangeSet =
true;
208 m_maxRangeInclusive = isInclusive;
214 template<
typename DataT>
215 void ValueItemDefinitionTemplate<DataT>::clearRange()
217 m_minRangeSet =
false;
218 m_maxRangeSet =
false;
221 template<
typename DataT>
222 int ValueItemDefinitionTemplate<DataT>::findDiscreteIndex(
const DataT& val)
const
225 if (!this->isDiscrete())
229 std::size_t i, n = m_discreteValues.size();
230 for (i = 0; i < n; i++)
232 if (m_discreteValues[i] == val)
234 return static_cast<int>(i);
240 template<
typename DataT>
241 bool ValueItemDefinitionTemplate<DataT>::isValueValid(
const DataT& val)
const
244 if (this->isDiscrete())
246 return (this->findDiscreteIndex(val) != -1);
248 if (!this->hasRange())
252 if (m_minRangeSet && ((val < m_minRange) || ((!m_minRangeInclusive) && (val == m_minRange))))
256 if (m_maxRangeSet && ((val > m_maxRange) || ((!m_maxRangeInclusive) && (val == m_maxRange))))
263 template<
typename DataT>
264 const DataT& ValueItemDefinitionTemplate<DataT>::defaultValue()
const
266 return m_defaultValue.empty() ? m_dummy : m_defaultValue[0];
269 template<
typename DataT>
270 const DataT& ValueItemDefinitionTemplate<DataT>::defaultValue(std::size_t element)
const
272 bool vectorDefault = m_defaultValue.size() == this->numberOfRequiredValues();
273 assert(!vectorDefault || m_defaultValue.size() > element);
274 return m_defaultValue.empty() ? m_dummy : m_defaultValue[vectorDefault ? element : 0];
277 template<
typename DataT>
278 const std::vector<DataT>& ValueItemDefinitionTemplate<DataT>::defaultValues()
const
280 return m_defaultValue;
286 template<
typename DataT>
287 void ValueItemDefinitionTemplate<DataT>::copyTo(
292 ValueItemDefinition* rawDef = def.get();
293 ValueItemDefinitionTemplate<DataT>* vdef =
294 dynamic_cast<ValueItemDefinitionTemplate<DataT>*
>(rawDef);
296 if (this->hasDefault())
298 vdef->setDefaultValue(m_defaultValue);
303 vdef->setMinRange(m_minRange, m_minRangeInclusive);
308 vdef->setMaxRange(m_maxRange, m_maxRangeInclusive);
311 if (this->isDiscrete())
315 std::string labelStr;
316 assert(m_discreteValueEnums.size() >= m_discreteValues.size());
317 for (std::size_t i = 0; i < m_discreteValues.size(); ++i)
319 value = m_discreteValues[i];
320 labelStr = m_discreteValueEnums[i];
321 vdef->addDiscreteValue(value, labelStr);
323 if (this->hasDefault())
325 vdef->setDefaultDiscreteIndex(m_defaultDiscreteIndex);
330 ValueItemDefinition::copyTo(def, info);