SMTK  @SMTK_VERSION@
Simulation Modeling Tool Kit
ValueItemDefinition.h
1 //=========================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //=========================================================================
10 // .NAME ValueItemDefinition.h -
11 // .SECTION Description
12 // The base class for attribute items that have an input value.
13 // It can have a specified number of values (m_numberOfRequiredValues > 0)
14 // or an unbounded number of values (m_numberOfRequredValues == 0).
15 // m_valueLabels is used to store labels for individual component values
16 // but can hold a common label that should be used for all components.
17 // m_valueLabels should only be used if m_numberOfRequiredValues is not 1.
18 // .SECTION See Also
19 
20 #ifndef smtk_attribute_ValueItemDefinition_h
21 #define smtk_attribute_ValueItemDefinition_h
22 
23 #include <cassert>
24 #include <map>
25 #include <set>
26 #include <string>
27 #include <vector>
28 
29 #include "smtk/CoreExports.h"
30 #include "smtk/PublicPointerDefs.h"
31 #include "smtk/attribute/ItemDefinition.h"
32 #include "smtk/attribute/VoidItemDefinition.h"
33 
34 namespace smtk
35 {
36 namespace attribute
37 {
38 class Attribute;
39 class Cluster;
40 class ValueItem;
42 {
43 public:
45  ValueItemDefinition(const std::string& myname);
46  ~ValueItemDefinition() override;
47 
49  typedef std::function<bool(
50  const Item*,
51  int enumIndex,
52  bool includeCatagories,
53  const std::set<std::string>& testCategories,
54  bool includeReadAccess,
55  unsigned int readAccessLevel)>
57 
63  const std::string& units() const { return m_units; }
64  virtual bool setUnits(const std::string& newUnits);
66 
69  bool hasSupportedUnits() const;
70 
75  std::string supportedUnits() const;
76 
78  bool isDiscrete() const { return !m_discreteValueEnums.empty(); }
80  std::size_t numberOfDiscreteValues() const { return m_discreteValueEnums.size(); }
82  const std::string& discreteEnum(std::size_t ith) const
83  {
84  assert(m_discreteValueEnums.size() > ith);
85  return m_discreteValueEnums[ith];
86  }
90  bool getEnumIndex(const std::string& enumVal, std::size_t& index) const;
93  int defaultDiscreteIndex() const { return m_defaultDiscreteIndex; }
94  void setDefaultDiscreteIndex(int discreteIndex);
96 
98  bool allowsExpressions() const;
101  bool isValidExpression(const smtk::attribute::AttributePtr& exp) const;
105  {
106  return m_expressionInformation;
107  }
115  std::string expressionType() const;
123  void setExpressionType(const std::string& etype);
131  void setExpressionDefinition(const smtk::attribute::DefinitionPtr& exp);
139  smtk::attribute::DefinitionPtr expressionDefinition(
140  const smtk::attribute::ResourcePtr& attResource) const;
141  // Should only be called internally by the ValueItem
142  void buildExpressionItem(ValueItem* vitem) const;
143  void buildChildrenItems(ValueItem* vitem) const;
144 
145  bool hasDefault() const { return m_hasDefault; }
146 
147  virtual bool hasRange() const = 0;
148 
149  // Returns or Sets the minimum number of values that items from this def can have
150  // Default value is 1
151  std::size_t numberOfRequiredValues() const { return m_numberOfRequiredValues; }
152 
153  // Returns false if esize is greater than max number of values (and max number > 0)
154  bool setNumberOfRequiredValues(std::size_t esize);
155 
156  // Returns or Sets the maximum number of values that items from this def can have.
157  // if 0 is returned then there is no max limit. Default value is 0
158  // Note that this is used only when the def is extensible
159  std::size_t maxNumberOfValues() const { return m_maxNumberOfValues; }
160 
161  // Returns false if esize is less than number of required values (and esize > 0)
162  bool setMaxNumberOfValues(std::size_t esize);
163 
164  // Returns or Sets the def's extensiblity property. If true then items from this def
165  // can have a variable number of values. The number of values is always <= to number of
166  // required values and max number of values (provided max number of values > 0)
167  // Default value is false.
168  bool isExtensible() const { return m_isExtensible; }
169  void setIsExtensible(bool mode);
170 
171  // Description:
172  // Return whether or not there are labels for components.
173  // There should only be labels if there is more than a single
174  // component (i.e. m_numberOfRequiredValues != 1).
175  bool hasValueLabels() const { return !m_valueLabels.empty(); }
176 
177  // Description:
178  // Specify whether the components label is coming from a common
179  // label that is repeated.
180  bool usingCommonLabel() const { return m_useCommonLabel; }
181  void setValueLabel(std::size_t element, const std::string& elabel);
182  void setCommonValueLabel(const std::string& elabel);
183  // Description:
184  // Get the component label for specified element component. This
185  // takes into account whether to use the common label or specific
186  // component label.
187  std::string valueLabel(std::size_t element) const;
188  bool isDiscreteIndexValid(int index) const;
189  bool isDiscreteIndexValid(int index, const std::set<std::string>& categories) const;
190 
192  std::size_t numberOfChildrenItemDefinitions() const { return m_itemDefs.size(); }
193 
194  const std::map<std::string, smtk::attribute::ItemDefinitionPtr>& childrenItemDefinitions() const
195  {
196  return m_itemDefs;
197  }
198 
199  // returns true if this item has a child item definition of itemName
200  bool hasChildItemDefinition(const std::string& itemName) const
201  {
202  return (m_itemDefs.find(itemName) != m_itemDefs.end());
203  }
204 
205  // returns true if valueName has a child item definition of itemName
206  bool hasChildItemDefinition(const std::string& valueName, const std::string& itemName);
207 
208  bool addChildItemDefinition(smtk::attribute::ItemDefinitionPtr cdef);
209 
212  void setEnumCategories(
213  const std::string& enumValue,
215  void addEnumCategory(const std::string& enumValue, const std::string& cat);
216  const smtk::common::Categories::Expression& enumCategories(const std::string& enumValue) const;
218 
221  void setEnumAdvanceLevel(const std::string& enumValue, unsigned int level);
222  void unsetEnumAdvanceLevel(const std::string& enumValue);
223  unsigned int enumAdvanceLevel(const std::string& enumValue) const;
224  bool hasEnumAdvanceLevel(const std::string& enumValue) const;
225  const std::map<std::string, unsigned int> enumAdvanceLevelInfo() const
226  {
227  return m_valueToAdvanceLevelAssociations;
228  }
230 
231  // Description:
232  // Create an item definition based on a given idName. If an item
233  // with that name already exists then return a shared_pointer
234  // that points to nullptr.
235  bool addItemDefinition(smtk::attribute::ItemDefinitionPtr cdef);
236  template<typename T>
237  typename smtk::internal::shared_ptr_type<T>::SharedPointerType addItemDefinition(
238  const std::string& idName)
239  {
240  typedef smtk::internal::shared_ptr_type<T> SharedTypes;
241  typename SharedTypes::SharedPointerType item;
242 
243  // First see if there is a item by the same name
244  if (this->hasChildItemDefinition(idName))
245  {
246  // Already has an item of this name - do nothing
247  return item;
248  }
249  item = SharedTypes::RawPointerType::New(idName);
250  m_itemDefs[item->name()] = item;
251  // We need to get a pointer to the base Item class to set the unitsSystem
252  static_cast<ItemDefinition*>(item.get())->setUnitsSystem(m_unitsSystem);
253  return item;
254  }
255 
256  bool addConditionalItem(const std::string& enumValue, const std::string& itemName);
257  std::vector<std::string> conditionalItems(const std::string& enumValue) const;
258 
261  void setCustomEnumIsRelevant(EnumRelevanceFunc func) { m_customEnumIsRelevant = func; }
262  EnumRelevanceFunc customEnumIsRelevant() const { return m_customEnumIsRelevant; }
264 
266  std::vector<std::string> relevantEnums(
267  bool includeCategories,
268  const std::set<std::string>& testCategories,
269  bool includeReadAccess,
270  unsigned int readAccessLevel) const;
271 
277  virtual bool defaultIsEnumRelevant(
278  int enumIndex,
279  bool includeCatagories,
280  const std::set<std::string>& testCategories,
281  bool includeReadAccess,
282  unsigned int readAccessLevel) const;
283 
284 protected:
286  void applyCategories(
287  const smtk::common::Categories::Stack& inheritedFromParent,
288  smtk::common::Categories& inheritedToParent) override;
289  void applyAdvanceLevels(
290  const unsigned int& readLevelFromParent,
291  const unsigned int& writeLevelFromParent) override;
292 
293  void setUnitsSystem(const shared_ptr<units::System>& unitsSystem) override;
294 
295  virtual void updateDiscreteValue() = 0;
296  bool m_hasDefault;
297  bool m_useCommonLabel;
298  std::vector<std::string> m_valueLabels;
299  std::vector<std::string> m_discreteValueEnums;
300  int m_defaultDiscreteIndex;
301  std::size_t m_numberOfRequiredValues;
302  std::size_t m_maxNumberOfValues;
303  bool m_isExtensible;
304  std::string m_units;
305  std::string m_expressionType;
306  smtk::attribute::ComponentItemDefinitionPtr m_expressionInformation;
307  std::map<std::string, smtk::attribute::ItemDefinitionPtr> m_itemDefs;
308  std::map<std::string, std::set<std::string>> m_itemToValueAssociations;
309  std::map<std::string, std::vector<std::string>> m_valueToItemAssociations;
310  std::map<std::string, smtk::common::Categories::Expression> m_valueToCategoryAssociations;
311  std::map<std::string, unsigned int> m_valueToAdvanceLevelAssociations;
312  EnumRelevanceFunc m_customEnumIsRelevant = nullptr;
313 
314 private:
315 };
316 } // namespace attribute
317 } // namespace smtk
318 
319 // returns true if valueName has a child item definition of itemName
321  const std::string& valueName,
322  const std::string& itemName)
323 {
324  // First we need to check to see if we have this child item
325  if (!this->hasChildItemDefinition(itemName))
326  {
327  return false;
328  }
329  return (
330  m_itemToValueAssociations[itemName].find(valueName) !=
331  m_itemToValueAssociations[itemName].end());
332 }
333 
334 #endif /* smtk_attribute_ValueItemDefinition_h */
smtk
The main namespace for the Simulation Modeling Tool Kit (SMTK).
Definition: doc.h:33
PublicPointerDefs.h
smtk::attribute::ValueItemDefinition::units
const std::string & units() const
Set/Get the units string associated with the definition.
Definition: ValueItemDefinition.h:63
smtk::attribute::DefinitionPtr
smtk::shared_ptr< smtk::attribute::Definition > DefinitionPtr
Definition: PublicPointerDefs.h:457
smtk::attribute::ValueItemDefinition::numberOfChildrenItemDefinitions
std::size_t numberOfChildrenItemDefinitions() const
For conditional children items based on the item's current discrete value.
Definition: ValueItemDefinition.h:192
smtk::attribute::ValueItemDefinition::isExtensible
bool isExtensible() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:168
smtk::attribute::ValueItemDefinition::usingCommonLabel
bool usingCommonLabel() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:180
smtk::attribute::ValueItemDefinition::numberOfRequiredValues
std::size_t numberOfRequiredValues() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:151
smtk::common::Categories::Expression
Definition: Categories.h:166
smtk::attribute::ItemDefinition
Definition: ItemDefinition.h:42
smtk::attribute::ValueItemDefinition::customEnumIsRelevant
EnumRelevanceFunc customEnumIsRelevant() const
Set and Get Methods for specifying a custom isEnumRelevant function.
Definition: ValueItemDefinition.h:262
smtk::internal::shared_ptr_type
Definition: PublicPointerDefs.h:756
smtk::attribute::ValueItemDefinition::isDiscrete
bool isDiscrete() const
Returns true if the definition is discrete in nature.
Definition: ValueItemDefinition.h:78
smtk::attribute::ValueItemDefinition::expressionInformation
smtk::attribute::ComponentItemDefinitionPtr & expressionInformation()
Return the component item which is used to represent the definition's expression constraints.
Definition: ValueItemDefinition.h:104
smtk::attribute::ValueItemDefinition::hasDefault
bool hasDefault() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:145
smtk::attribute::ValueItemDefinition::setCustomEnumIsRelevant
void setCustomEnumIsRelevant(EnumRelevanceFunc func)
Set and Get Methods for specifying a custom isEnumRelevant function.
Definition: ValueItemDefinition.h:261
smtk::attribute::ValueItemDefinition::EnumRelevanceFunc
std::function< bool(const Item *, int enumIndex, bool includeCatagories, const std::set< std::string > &testCategories, bool includeReadAccess, unsigned int readAccessLevel)> EnumRelevanceFunc
Typedef for custom relevance functions.
Definition: ValueItemDefinition.h:56
smtk::attribute::ItemDefinition::CopyInfo
Definition: ItemDefinition.h:52
smtk::attribute::Item
The base class for items that hold information inside an attribute.
Definition: Item.h:47
smtkTypeMacro
#define smtkTypeMacro(...)
Add typedefs to a class for identifcation.
Definition: SharedFromThis.h:148
smtk::attribute::ValueItemDefinition::enumAdvanceLevelInfo
const std::map< std::string, unsigned int > enumAdvanceLevelInfo() const
Set/Get advance level associated with associated with a value Enum.
Definition: ValueItemDefinition.h:225
smtk::attribute::ValueItemDefinition::hasChildItemDefinition
bool hasChildItemDefinition(const std::string &itemName) const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:200
smtk::attribute::AttributePtr
smtk::shared_ptr< smtk::attribute::Attribute > AttributePtr
Definition: PublicPointerDefs.h:463
smtk::attribute::ComponentItemDefinitionPtr
smtk::shared_ptr< smtk::attribute::ComponentItemDefinition > ComponentItemDefinitionPtr
Definition: PublicPointerDefs.h:548
smtk::attribute::ValueItemDefinition::defaultDiscreteIndex
int defaultDiscreteIndex() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:93
smtk::attribute::ValueItemDefinition
Definition: ValueItemDefinition.h:41
smtk::attribute::ValueItemDefinition::hasValueLabels
bool hasValueLabels() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:175
smtk::attribute::ValueItemDefinition::maxNumberOfValues
std::size_t maxNumberOfValues() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:159
smtk::attribute::ValueItem
A concrete base class for items that store a vector of plain-old-data (POD) as values.
Definition: ValueItem.h:37
smtk::attribute::ValueItemDefinition::discreteEnum
const std::string & discreteEnum(std::size_t ith) const
Returns the ith enumeration string.
Definition: ValueItemDefinition.h:82
smtk::attribute::ValueItemDefinition::childrenItemDefinitions
const std::map< std::string, smtk::attribute::ItemDefinitionPtr > & childrenItemDefinitions() const
Get/Set the default discrete value via its index location.
Definition: ValueItemDefinition.h:194
smtk::attribute::ValueItemDefinition::numberOfDiscreteValues
std::size_t numberOfDiscreteValues() const
Returns the number of discrete values defined in definition.
Definition: ValueItemDefinition.h:80
smtk::common::Categories
Represents the category constraints associated with smtk objects such as Attributes,...
Definition: Categories.h:33
smtk::attribute::ValueItemDefinitionPtr
smtk::shared_ptr< smtk::attribute::ValueItemDefinition > ValueItemDefinitionPtr
Definition: PublicPointerDefs.h:491
smtk::common::Categories::Stack
Definition: Categories.h:225
smtk::attribute::ItemDefinitionPtr
smtk::shared_ptr< smtk::attribute::ItemDefinition > ItemDefinitionPtr
Definition: PublicPointerDefs.h:480
smtk::attribute::ResourcePtr
smtk::shared_ptr< smtk::attribute::Resource > ResourcePtr
Definition: PublicPointerDefs.h:611