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 bool setDefaultValue(
const DataT& val);
39 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>
121 if (dvalue.size() > 1 && (this->isDiscrete() || this->isExtensible()))
123 typename std::vector<DataT>::const_iterator it;
124 for (it = dvalue.begin(); it != dvalue.end(); ++it)
126 if (!this->isValueValid(*it))
131 m_defaultValue = dvalue;
136 template<
typename DataT>
140 std::ostringstream oss;
142 this->addDiscreteValue(dvalue, oss.str());
145 template<
typename DataT>
146 void ValueItemDefinitionTemplate<DataT>::addDiscreteValue(
148 const std::string& dlabel)
150 m_discreteValues.push_back(dvalue);
151 m_discreteValueEnums.push_back(dlabel);
154 template<
typename DataT>
155 void ValueItemDefinitionTemplate<DataT>::clearDiscreteValues()
157 m_discreteValues.clear();
158 m_discreteValueEnums.clear();
161 template<
typename DataT>
162 bool ValueItemDefinitionTemplate<DataT>::setMinRange(
const DataT& minVal,
bool isInclusive)
167 typename std::vector<DataT>::const_iterator it;
168 for (it = m_defaultValue.begin(); it != m_defaultValue.end(); ++it)
172 if ((!isInclusive) && (*it == minVal))
176 if ((!m_maxRangeSet) || (minVal < m_maxRange))
178 m_minRangeSet =
true;
180 m_minRangeInclusive = isInclusive;
186 template<
typename DataT>
187 bool ValueItemDefinitionTemplate<DataT>::setMaxRange(
const DataT& maxVal,
bool isInclusive)
192 typename std::vector<DataT>::const_iterator it;
193 for (it = m_defaultValue.begin(); it != m_defaultValue.end(); ++it)
197 if ((!isInclusive) && (*it == maxVal))
201 if ((!m_minRangeSet) || (maxVal > m_minRange))
203 m_maxRangeSet =
true;
205 m_maxRangeInclusive = isInclusive;
211 template<
typename DataT>
212 void ValueItemDefinitionTemplate<DataT>::clearRange()
214 m_minRangeSet =
false;
215 m_maxRangeSet =
false;
218 template<
typename DataT>
219 int ValueItemDefinitionTemplate<DataT>::findDiscreteIndex(
const DataT& val)
const
222 if (!this->isDiscrete())
226 std::size_t i, n = m_discreteValues.size();
227 for (i = 0; i < n; i++)
229 if (m_discreteValues[i] == val)
231 return static_cast<int>(i);
237 template<
typename DataT>
238 bool ValueItemDefinitionTemplate<DataT>::isValueValid(
const DataT& val)
const
241 if (this->isDiscrete())
243 return (this->findDiscreteIndex(val) != -1);
245 if (!this->hasRange())
249 if (m_minRangeSet && ((val < m_minRange) || ((!m_minRangeInclusive) && (val == m_minRange))))
253 if (m_maxRangeSet && ((val > m_maxRange) || ((!m_maxRangeInclusive) && (val == m_maxRange))))
260 template<
typename DataT>
261 const DataT& ValueItemDefinitionTemplate<DataT>::defaultValue()
const
263 return m_defaultValue.empty() ? m_dummy : m_defaultValue[0];
266 template<
typename DataT>
267 const DataT& ValueItemDefinitionTemplate<DataT>::defaultValue(std::size_t element)
const
269 bool vectorDefault = m_defaultValue.size() == this->numberOfRequiredValues();
270 assert(!vectorDefault || m_defaultValue.size() > element);
271 return m_defaultValue.empty() ? m_dummy : m_defaultValue[vectorDefault ? element : 0];
274 template<
typename DataT>
275 const std::vector<DataT>& ValueItemDefinitionTemplate<DataT>::defaultValues()
const
277 return m_defaultValue;
283 template<
typename DataT>
284 void ValueItemDefinitionTemplate<DataT>::copyTo(
289 ValueItemDefinition* rawDef = def.get();
290 ValueItemDefinitionTemplate<DataT>* vdef =
291 dynamic_cast<ValueItemDefinitionTemplate<DataT>*
>(rawDef);
293 if (this->hasDefault())
295 vdef->setDefaultValue(m_defaultValue);
300 vdef->setMinRange(m_minRange, m_minRangeInclusive);
305 vdef->setMaxRange(m_maxRange, m_maxRangeInclusive);
308 if (this->isDiscrete())
312 std::string labelStr;
313 assert(m_discreteValueEnums.size() >= m_discreteValues.size());
314 for (std::size_t i = 0; i < m_discreteValues.size(); ++i)
316 value = m_discreteValues[i];
317 labelStr = m_discreteValueEnums[i];
318 vdef->addDiscreteValue(value, labelStr);
320 if (this->hasDefault())
322 vdef->setDefaultDiscreteIndex(m_defaultDiscreteIndex);
327 ValueItemDefinition::copyTo(def, info);