HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Element.h
Go to the documentation of this file.
1 //
2 // Copyright Contributors to the MaterialX Project
3 // SPDX-License-Identifier: Apache-2.0
4 //
5 
6 #ifndef MATERIALX_ELEMENT_H
7 #define MATERIALX_ELEMENT_H
8 
9 /// @file
10 /// Base and generic element classes
11 
12 #include <MaterialXCore/Export.h>
13 
15 #include <MaterialXCore/Util.h>
16 #include <MaterialXCore/Value.h>
17 
19 
20 class Element;
21 class TypedElement;
22 class ValueElement;
23 class Token;
24 class CommentElement;
25 class NewlineElement;
26 class GenericElement;
27 class StringResolver;
28 class Document;
29 
30 /// A shared pointer to an Element
31 using ElementPtr = shared_ptr<Element>;
32 /// A shared pointer to a const Element
33 using ConstElementPtr = shared_ptr<const Element>;
34 
35 /// A shared pointer to a TypedElement
36 using TypedElementPtr = shared_ptr<TypedElement>;
37 /// A shared pointer to a const TypedElement
38 using ConstTypedElementPtr = shared_ptr<const TypedElement>;
39 
40 /// A shared pointer to a ValueElement
41 using ValueElementPtr = shared_ptr<ValueElement>;
42 /// A shared pointer to a const ValueElement
43 using ConstValueElementPtr = shared_ptr<const ValueElement>;
44 
45 /// A shared pointer to a Token
46 using TokenPtr = shared_ptr<Token>;
47 /// A shared pointer to a const Token
48 using ConstTokenPtr = shared_ptr<const Token>;
49 
50 /// A shared pointer to a CommentElement
51 using CommentElementPtr = shared_ptr<CommentElement>;
52 /// A shared pointer to a const CommentElement
53 using ConstCommentElementPtr = shared_ptr<const CommentElement>;
54 
55 /// A shared pointer to a NewlineElement
56 using NewlineElementPtr = shared_ptr<NewlineElement>;
57 /// A shared pointer to a const NewlineElement
58 using ConstNewlineElementPtr = shared_ptr<const NewlineElement>;
59 
60 /// A shared pointer to a GenericElement
61 using GenericElementPtr = shared_ptr<GenericElement>;
62 /// A shared pointer to a const GenericElement
63 using ConstGenericElementPtr = shared_ptr<const GenericElement>;
64 
65 /// A shared pointer to a StringResolver
66 using StringResolverPtr = shared_ptr<StringResolver>;
67 
68 /// A vector of elements.
69 using ElementVec = vector<ElementPtr>;
70 
71 /// A hash map from strings to elements
72 using ElementMap = std::unordered_map<string, ElementPtr>;
73 
74 /// A standard function taking an ElementPtr and returning a boolean.
75 using ElementPredicate = std::function<bool(ConstElementPtr)>;
76 
78 
79 /// @class Element
80 /// The base class for MaterialX elements.
81 ///
82 /// An Element is a named object within a Document, which may possess any
83 /// number of child elements and attributes.
84 class MX_CORE_API Element : public std::enable_shared_from_this<Element>
85 {
86  protected:
87  Element(ElementPtr parent, const string& category, const string& name) :
88  _category(category),
89  _name(name),
90  _parent(parent),
91  _root(parent ? parent->getRoot() : nullptr)
92  {
93  }
94 
95  public:
96  virtual ~Element() { }
97  Element(const Element&) = delete;
98  Element& operator=(const Element&) = delete;
99 
100  protected:
101  using DocumentPtr = shared_ptr<Document>;
102  using ConstDocumentPtr = shared_ptr<const Document>;
103 
104  template <class T> friend class ElementRegistry;
105 
106  public:
107  /// Return true if the given element tree, including all descendants,
108  /// is identical to this one.
109  bool operator==(const Element& rhs) const;
110 
111  /// Return true if the given element tree, including all descendants,
112  /// differs from this one.
113  bool operator!=(const Element& rhs) const;
114 
115  /// @name Category
116  /// @{
117 
118  /// Set the element's category string.
119  void setCategory(const string& category)
120  {
121  _category = category;
122  }
123 
124  /// Return the element's category string. The category of a MaterialX
125  /// element represents its role within the document, with common examples
126  /// being "material", "nodegraph", and "image".
127  const string& getCategory() const
128  {
129  return _category;
130  }
131 
132  /// @}
133  /// @name Name
134  /// @{
135 
136  /// Set the element's name string. The name of a MaterialX element must be
137  /// unique among all elements at the same scope.
138  /// @throws Exception if an element at the same scope already possesses the
139  /// given name.
140  void setName(const string& name);
141 
142  /// Return the element's name string.
143  const string& getName() const
144  {
145  return _name;
146  }
147 
148  /// Return the element's hierarchical name path, relative to the root
149  /// document. The name of each ancestor will be prepended in turn,
150  /// separated by forward slashes.
151  /// @param relativeTo If a valid ancestor element is specified, then
152  /// the returned path will be relative to this ancestor.
153  string getNamePath(ConstElementPtr relativeTo = nullptr) const;
154 
155  /// Return the element specified by the given hierarchical name path,
156  /// relative to the current element. If the name path is empty then the
157  /// current element is returned. If no element is found at the given path,
158  /// then an empty shared pointer is returned.
159  /// @param namePath The relative name path of the specified element.
160  ElementPtr getDescendant(const string& namePath) const;
161 
162  /// @}
163  /// @name File Prefix
164  /// @{
165 
166  /// Set the element's file prefix string.
167  void setFilePrefix(const string& prefix)
168  {
169  setAttribute(FILE_PREFIX_ATTRIBUTE, prefix);
170  }
171 
172  /// Return true if the given element has a file prefix string.
173  bool hasFilePrefix() const
174  {
175  return hasAttribute(FILE_PREFIX_ATTRIBUTE);
176  }
177 
178  /// Return the element's file prefix string.
179  const string& getFilePrefix() const
180  {
181  return getAttribute(FILE_PREFIX_ATTRIBUTE);
182  }
183 
184  /// Return the file prefix string that is active at the scope of this
185  /// element, taking all ancestor elements into account.
186  const string& getActiveFilePrefix() const
187  {
188  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
189  {
190  if (elem->hasFilePrefix())
191  {
192  return elem->getFilePrefix();
193  }
194  }
195  return EMPTY_STRING;
196  }
197 
198  /// @}
199  /// @name Geom Prefix
200  /// @{
201 
202  /// Set the element's geom prefix string.
203  void setGeomPrefix(const string& prefix)
204  {
205  setAttribute(GEOM_PREFIX_ATTRIBUTE, prefix);
206  }
207 
208  /// Return true if the given element has a geom prefix string.
209  bool hasGeomPrefix() const
210  {
211  return hasAttribute(GEOM_PREFIX_ATTRIBUTE);
212  }
213 
214  /// Return the element's geom prefix string.
215  const string& getGeomPrefix() const
216  {
217  return getAttribute(GEOM_PREFIX_ATTRIBUTE);
218  }
219 
220  /// Return the geom prefix string that is active at the scope of this
221  /// element, taking all ancestor elements into account.
222  const string& getActiveGeomPrefix() const
223  {
224  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
225  {
226  if (elem->hasGeomPrefix())
227  {
228  return elem->getGeomPrefix();
229  }
230  }
231  return EMPTY_STRING;
232  }
233 
234  /// @}
235  /// @name Color Space
236  /// @{
237 
238  /// Set the element's color space string.
239  void setColorSpace(const string& colorSpace)
240  {
241  setAttribute(COLOR_SPACE_ATTRIBUTE, colorSpace);
242  }
243 
244  /// Return true if the given element has a color space string.
245  bool hasColorSpace() const
246  {
247  return hasAttribute(COLOR_SPACE_ATTRIBUTE);
248  }
249 
250  /// Return the element's color space string.
251  const string& getColorSpace() const
252  {
253  return getAttribute(COLOR_SPACE_ATTRIBUTE);
254  }
255 
256  /// Return the color space string that is active at the scope of this
257  /// element, taking all ancestor elements into account.
258  const string& getActiveColorSpace() const
259  {
260  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
261  {
262  if (elem->hasColorSpace())
263  {
264  return elem->getColorSpace();
265  }
266  }
267  return EMPTY_STRING;
268  }
269 
270  /// @}
271  /// @name Inheritance
272  /// @{
273 
274  /// Set the inherit string of this element.
275  void setInheritString(const string& inherit)
276  {
277  setAttribute(INHERIT_ATTRIBUTE, inherit);
278  }
279 
280  /// Return true if this element has an inherit string.
281  bool hasInheritString() const
282  {
283  return hasAttribute(INHERIT_ATTRIBUTE);
284  }
285 
286  /// Return the inherit string of this element.
287  const string& getInheritString() const
288  {
289  return getAttribute(INHERIT_ATTRIBUTE);
290  }
291 
292  /// Set the element that this one directly inherits from.
294  {
295  if (super)
296  {
297  setInheritString(super->getName());
298  }
299  else
300  {
301  removeAttribute(INHERIT_ATTRIBUTE);
302  }
303  }
304 
305  /// Return the element, if any, that this one directly inherits from.
307  {
308  return hasInheritString() ? resolveNameReference<Element>(getInheritString()) : nullptr;
309  }
310 
311  /// Return true if this element has the given element as an inherited base,
312  /// taking the full inheritance chain into account.
313  bool hasInheritedBase(ConstElementPtr base) const;
314 
315  /// Return true if the inheritance chain for this element contains a cycle.
316  bool hasInheritanceCycle() const;
317 
318  /// @}
319  /// @name Namespace
320  /// @{
321 
322  /// Set the namespace string of this element.
323  void setNamespace(const string& space)
324  {
325  setAttribute(NAMESPACE_ATTRIBUTE, space);
326  }
327 
328  /// Return true if this element has a namespace string.
329  bool hasNamespace() const
330  {
331  return hasAttribute(NAMESPACE_ATTRIBUTE);
332  }
333 
334  /// Return the namespace string of this element.
335  const string& getNamespace() const
336  {
337  return getAttribute(NAMESPACE_ATTRIBUTE);
338  }
339 
340  /// Return a qualified version of the given name, taking the namespace at the
341  /// scope of this element into account.
342  string getQualifiedName(const string& name) const
343  {
344  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
345  {
346  const string& namespaceStr = elem->getNamespace();
347  if (!namespaceStr.empty())
348  {
349  // Check if the name is qualified already.
350  const size_t i = name.find_first_of(NAME_PREFIX_SEPARATOR);
351  if (i != string::npos && name.substr(0, i) == namespaceStr)
352  {
353  // The name is already qualified with this namespace,
354  // so just return it as is.
355  return name;
356  }
357  return namespaceStr + NAME_PREFIX_SEPARATOR + name;
358  }
359  }
360  return name;
361  }
362 
363  /// @}
364  /// @name Documentation String
365  /// @{
366 
367  /// Set the documentation string of this element.
368  void setDocString(const string& doc)
369  {
370  setAttribute(DOC_ATTRIBUTE, doc);
371  }
372 
373  /// Return the documentation string of this element
374  string getDocString() const
375  {
376  return getAttribute(DOC_ATTRIBUTE);
377  }
378 
379  /// @}
380  /// @name Subclass
381  /// @{
382 
383  /// Return true if this element belongs to the given subclass.
384  /// If a category string is specified, then both subclass and category
385  /// matches are required.
386  template <class T> bool isA(const string& category = EMPTY_STRING) const
387  {
388  if (!asA<T>())
389  return false;
390  if (!category.empty() && getCategory() != category)
391  return false;
392  return true;
393  }
394 
395  /// Dynamic cast to an instance of the given subclass.
396  template <class T> shared_ptr<T> asA();
397 
398  /// Dynamic cast to a const instance of the given subclass.
399  template <class T> shared_ptr<const T> asA() const;
400 
401  /// @}
402  /// @name Child Elements
403  /// @{
404 
405  /// Add a child element of the given subclass and name.
406  /// @param name The name of the new child element.
407  /// If no name is specified, then a unique name will automatically be
408  /// generated.
409  /// @throws Exception if a child of this element already possesses the
410  /// given name.
411  /// @return A shared pointer to the new child element.
412  template <class T> shared_ptr<T> addChild(const string& name = EMPTY_STRING);
413 
414  /// Add a child element of the given category and name.
415  /// @param category The category string of the new child element.
416  /// If the category string is recognized, then the corresponding Element
417  /// subclass is generated; otherwise, a GenericElement is generated.
418  /// @param name The name of the new child element.
419  /// If no name is specified, then a unique name will automatically be
420  /// generated.
421  /// @throws Exception if a child of this element already possesses the
422  /// given name.
423  /// @return A shared pointer to the new child element.
424  ElementPtr addChildOfCategory(const string& category, string name = EMPTY_STRING);
425 
426  /// Change the category of the given child element.
427  /// @param child The child element that will be modified.
428  /// @param category The new category string for the child element.
429  /// @return A shared pointer to a new child element, containing the contents
430  /// of the original child but with a new category and subclass.
431  ElementPtr changeChildCategory(ElementPtr child, const string& category);
432 
433  /// Return the child element, if any, with the given name.
434  /// For a Document with an attached data library, this also searches
435  /// the data library when no local child is found, keeping behavior
436  /// consistent with getChildOfType and getChildrenOfType.
437  ElementPtr getChild(const string& name) const;
438 
439  /// Return the child element, if any, with the given name and subclass.
440  /// If a child with the given name exists, but belongs to a different
441  /// subclass, then an empty shared pointer is returned.
442  template <class T> shared_ptr<T> getChildOfType(const string& name) const;
443 
444  /// Return a constant vector of all child elements.
445  /// The returned vector maintains the order in which children were added.
446  const ElementVec& getChildren() const
447  {
448  return _childOrder;
449  }
450 
451  /// Return a vector of all child elements that are instances of the given
452  /// subclass, optionally filtered by the given category string. The returned
453  /// vector maintains the order in which children were added.
454  template <class T> vector<shared_ptr<T>> getChildrenOfType(const string& category = EMPTY_STRING) const;
455 
456  /// Set the index of the child, if any, with the given name.
457  /// If the given index is out of bounds, then an exception is thrown.
458  void setChildIndex(const string& name, int index);
459 
460  /// Return the index of the child, if any, with the given name.
461  /// If no child with the given name is found, then -1 is returned.
462  int getChildIndex(const string& name) const;
463 
464  /// Remove the child element, if any, with the given name.
465  void removeChild(const string& name);
466 
467  /// Remove the child element, if any, with the given name and subclass.
468  /// If a child with the given name exists, but belongs to a different
469  /// subclass, then this method has no effect.
470  template <class T> void removeChildOfType(const string& name)
471  {
472  if (getChildOfType<T>(name))
473  removeChild(name);
474  }
475 
476  /// @}
477  /// @name Attributes
478  /// @{
479 
480  /// Set the value string of the given attribute.
481  void setAttribute(const string& attrib, const string& value);
482 
483  /// Return true if the given attribute is present.
484  bool hasAttribute(const string& attrib) const
485  {
486  return _attributeMap.count(attrib) != 0;
487  }
488 
489  /// Return the value string of the given attribute. If the given attribute
490  /// is not present, then an empty string is returned.
491  const string& getAttribute(const string& attrib) const
492  {
493  StringMap::const_iterator it = _attributeMap.find(attrib);
494  return (it != _attributeMap.end()) ? it->second : EMPTY_STRING;
495  }
496 
497  /// Return a vector of stored attribute names, in the order they were set.
499  {
500  return _attributeOrder;
501  }
502 
503  /// Set the value of an implicitly typed attribute. Since an attribute
504  /// stores no explicit type, the same type argument must be used in
505  /// corresponding calls to getTypedAttribute.
506  template <class T> void setTypedAttribute(const string& attrib, const T& data)
507  {
508  setAttribute(attrib, toValueString(data));
509  }
510 
511  /// Return the value of an implicitly typed attribute. If the given
512  /// attribute is not present, or cannot be converted to the given data
513  /// type, then the zero value for the data type is returned.
514  template <class T> T getTypedAttribute(const string& attrib) const
515  {
516  if (hasAttribute(attrib))
517  {
518  try
519  {
520  return fromValueString<T>(getAttribute(attrib));
521  }
522  catch (ExceptionTypeError&)
523  {
524  }
525  }
526  return {};
527  }
528 
529  /// Remove the given attribute, if present.
530  void removeAttribute(const string& attrib);
531 
532  /// @}
533  /// @name Self And Ancestor Elements
534  /// @{
535 
536  /// Return our self pointer.
538  {
539  return shared_from_this();
540  }
541 
542  /// Return our self pointer.
544  {
545  return shared_from_this();
546  }
547 
548  /// Return our parent element.
550  {
551  return _parent.lock();
552  }
553 
554  /// Return our parent element.
556  {
557  return _parent.lock();
558  }
559 
560  /// Return the root element of our tree.
561  ElementPtr getRoot();
562 
563  /// Return the root element of our tree.
564  ConstElementPtr getRoot() const;
565 
566  /// Return the root document of our tree.
567  DocumentPtr getDocument();
568 
569  /// Return the root document of our tree.
570  ConstDocumentPtr getDocument() const;
571 
572  /// Return the first ancestor of the given subclass, or an empty shared
573  /// pointer if no ancestor of this subclass is found.
574  template <class T> shared_ptr<T> getAncestorOfType()
575  {
576  for (ElementPtr elem = getSelf(); elem; elem = elem->getParent())
577  {
578  shared_ptr<T> typedElem = elem->asA<T>();
579  if (typedElem)
580  {
581  return typedElem;
582  }
583  }
584  return nullptr;
585  }
586 
587  /// Return the first ancestor of the given subclass, or an empty shared
588  /// pointer if no ancestor of this subclass is found.
589  template <class T> shared_ptr<const T> getAncestorOfType() const
590  {
591  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
592  {
593  shared_ptr<const T> typedElem = elem->asA<T>();
594  if (typedElem)
595  {
596  return typedElem;
597  }
598  }
599  return nullptr;
600  }
601 
602  /// @}
603  /// @name Functional Equivalence
604  /// @{
605 
606  /// Return true if the given element tree, including all descendents,
607  /// is considered to be equivalent to this one based on the equivalence
608  /// criteria provided.
609  /// @param rhs Element to compare against
610  /// @param options Equivalence criteria
611  /// @param message Optional text description of differences
612  /// @return True if the elements are equivalent. False otherwise.
613  bool isEquivalent(ConstElementPtr rhs, const ElementEquivalenceOptions& options,
614  string* message = nullptr) const;
615 
616  /// Return true if the attribute on a given element is equivalent
617  /// based on the equivalence criteria provided.
618  /// @param rhs Element to compare against
619  /// @param attributeName Name of attribute to compare
620  /// @param options Equivalence criteria
621  /// @param message Optional text description of differences
622  /// @return True if the attribute on the elements are equivalent. False otherwise.
623  virtual bool isAttributeEquivalent(ConstElementPtr rhs, const string& attributeName,
624  const ElementEquivalenceOptions& options,
625  string* message = nullptr) const;
626 
627  /// @}
628  /// @name Traversal
629  /// @{
630 
631  /// Traverse the tree from the given element to each of its descendants in
632  /// depth-first order, using pre-order visitation.
633  /// @return A TreeIterator object.
634  /// @details Example usage with an implicit iterator:
635  /// @code
636  /// for (ElementPtr elem : inputElem->traverseTree())
637  /// {
638  /// cout << elem->asString() << endl;
639  /// }
640  /// @endcode
641  /// Example usage with an explicit iterator:
642  /// @code
643  /// for (mx::TreeIterator it = inputElem->traverseTree().begin(); it != mx::TreeIterator::end(); ++it)
644  /// {
645  /// mx::ElementPtr elem = it.getElement();
646  /// cout << elem->asString() << " at depth " << it.getElementDepth() << endl;
647  /// }
648  /// @endcode
649  TreeIterator traverseTree() const;
650 
651  /// Traverse the dataflow graph from the given element to each of its
652  /// upstream sources in depth-first order, using pre-order visitation.
653  /// @throws ExceptionFoundCycle if a cycle is encountered.
654  /// @return A GraphIterator object.
655  /// @details Example usage with an implicit iterator:
656  /// @code
657  /// for (Edge edge : inputElem->traverseGraph())
658  /// {
659  /// ElementPtr upElem = edge.getUpstreamElement();
660  /// ElementPtr downElem = edge.getDownstreamElement();
661  /// cout << upElem->asString() << " lies upstream from " << downElem->asString() << endl;
662  /// }
663  /// @endcode
664  /// Example usage with an explicit iterator:
665  /// @code
666  /// for (mx::GraphIterator it = inputElem->traverseGraph().begin(); it != mx::GraphIterator::end(); ++it)
667  /// {
668  /// mx::ElementPtr elem = it.getUpstreamElement();
669  /// cout << elem->asString() << " at depth " << it.getElementDepth() << endl;
670  /// }
671  /// @endcode
672  /// @sa getUpstreamEdge
673  /// @sa getUpstreamElement
674  GraphIterator traverseGraph() const;
675 
676  /// Return the Edge with the given index that lies directly upstream from
677  /// this element in the dataflow graph.
678  /// @param index An optional index of the edge to be returned, where the
679  /// valid index range may be determined with getUpstreamEdgeCount.
680  /// @return The upstream Edge, if valid, or an empty Edge object.
681  virtual Edge getUpstreamEdge(size_t index = 0) const;
682 
683  /// Return the number of queryable upstream edges for this element.
684  virtual size_t getUpstreamEdgeCount() const
685  {
686  return 0;
687  }
688 
689  /// Return the Element with the given index that lies directly upstream
690  /// from this one in the dataflow graph.
691  /// @param index An optional index of the element to be returned, where the
692  /// valid index range may be determined with getUpstreamEdgeCount.
693  /// @return The upstream Element, if valid, or an empty ElementPtr.
694  ElementPtr getUpstreamElement(size_t index = 0) const;
695 
696  /// Traverse the inheritance chain from the given element to each element
697  /// from which it inherits.
698  /// @throws ExceptionFoundCycle if a cycle is encountered.
699  /// @return An InheritanceIterator object.
700  /// @details Example usage:
701  /// @code
702  /// ConstElementPtr derivedElem;
703  /// for (ConstElementPtr elem : inputElem->traverseInheritance())
704  /// {
705  /// if (derivedElem)
706  /// cout << derivedElem->asString() << " inherits from " << elem->asString() << endl;
707  /// derivedElem = elem;
708  /// }
709  /// @endcode
710  InheritanceIterator traverseInheritance() const;
711 
712  /// @}
713  /// @name Source URI
714  /// @{
715 
716  /// Set the element's source URI.
717  /// @param sourceUri A URI string representing the resource from which
718  /// this element originates. This string may be used by serialization
719  /// and deserialization routines to maintain hierarchies of include
720  /// references.
721  void setSourceUri(const string& sourceUri)
722  {
723  _sourceUri = sourceUri;
724  }
725 
726  /// Return true if this element has a source URI.
727  bool hasSourceUri() const
728  {
729  return !_sourceUri.empty();
730  }
731 
732  /// Return the element's source URI.
733  const string& getSourceUri() const
734  {
735  return _sourceUri;
736  }
737 
738  /// Return the source URI that is active at the scope of this
739  /// element, taking all ancestor elements into account.
740  const string& getActiveSourceUri() const
741  {
742  for (ConstElementPtr elem = getSelf(); elem; elem = elem->getParent())
743  {
744  if (elem->hasSourceUri())
745  {
746  return elem->getSourceUri();
747  }
748  }
749  return EMPTY_STRING;
750  }
751 
752  /// @}
753  /// @name Validation
754  /// @{
755 
756  /// Validate that the given element tree, including all descendants, is
757  /// consistent with the MaterialX specification.
758  virtual bool validate(string* message = nullptr) const;
759 
760  /// @}
761  /// @name Utility
762  /// @{
763 
764  /// Copy all attributes and descendants from the given element to this one.
765  /// @param source The element from which content is copied.
766  void copyContentFrom(const ConstElementPtr& source);
767 
768  /// Clear all attributes and descendants from this element.
769  virtual void clearContent();
770 
771  /// Using the input name as a starting point, modify it to create a valid,
772  /// unique name for a child element.
773  string createValidChildName(string name) const
774  {
775  name = name.empty() ? "_" : createValidName(name);
776  while (getChild(name))
777  {
778  name = incrementName(name);
779  }
780  return name;
781  }
782 
783  /// Construct a StringResolver at the scope of this element. The returned
784  /// object may be used to apply substring modifiers to data values in the
785  /// context of a specific element, geometry, and material.
786  /// @param geom An optional geometry name, which will be used to select the
787  /// applicable set of geometry token substitutions. By default, no
788  /// geometry token substitutions are applied. If the universal geometry
789  /// name "/" is given, then all geometry token substitutions are applied,
790  /// @return A shared pointer to a StringResolver.
791  StringResolverPtr createStringResolver(const string& geom = EMPTY_STRING) const;
792 
793  /// Return a single-line description of this element, including its category,
794  /// name, and attributes.
795  string asString() const;
796 
797  /// @}
798 
799  protected:
800  // Resolve a reference to a named element at the scope of the given parent,
801  // taking the namespace at the scope of this element into account. If no parent
802  // is provided, then the root scope of the document is used.
803  template <class T> shared_ptr<T> resolveNameReference(const string& name, ConstElementPtr parent = nullptr) const
804  {
805  ConstElementPtr scope = parent ? parent : getRoot();
806  shared_ptr<T> child = scope->getChildOfType<T>(getQualifiedName(name));
807  return child ? child : scope->getChildOfType<T>(name);
808  }
809 
810  // Enforce a requirement within a validate method, updating the validation
811  // state and optional output text if the requirement is not met.
812  void validateRequire(bool expression, bool& res, string* message, const string& errorDesc) const;
813 
814  public:
815  static const string NAME_ATTRIBUTE;
816  static const string FILE_PREFIX_ATTRIBUTE;
817  static const string GEOM_PREFIX_ATTRIBUTE;
818  static const string COLOR_SPACE_ATTRIBUTE;
819  static const string INHERIT_ATTRIBUTE;
820  static const string NAMESPACE_ATTRIBUTE;
821  static const string DOC_ATTRIBUTE;
822  static const string XPOS_ATTRIBUTE;
823  static const string YPOS_ATTRIBUTE;
824 
825  protected:
826  virtual void registerChildElement(ElementPtr child);
827  virtual void unregisterChildElement(ElementPtr child);
828 
829  // Return a non-const copy of our self pointer, for use in constructing
830  // graph traversal objects that require non-const storage.
832  {
833  return std::const_pointer_cast<Element>(shared_from_this());
834  }
835 
836  protected:
837  string _category;
838  string _name;
839  string _sourceUri;
840 
843 
846 
847  weak_ptr<Element> _parent;
848  weak_ptr<Element> _root;
849 
850  private:
851  template <class T> static ElementPtr createElement(ElementPtr parent, const string& name)
852  {
853  return std::make_shared<T>(parent, name);
854  }
855 
856  private:
857  using CreatorFunction = ElementPtr (*)(ElementPtr, const string&);
858  using CreatorMap = std::unordered_map<string, CreatorFunction>;
859 
860  static CreatorMap _creatorMap;
861 };
862 
863 /// @class TypedElement
864 /// The base class for typed elements.
866 {
867  protected:
868  TypedElement(ElementPtr parent, const string& category, const string& name) :
869  Element(parent, category, name)
870  {
871  }
872 
873  public:
874  virtual ~TypedElement() { }
875 
876  protected:
877  using TypeDefPtr = shared_ptr<class TypeDef>;
878 
879  public:
880  /// @name Type String
881  /// @{
882 
883  /// Set the element's type string.
884  void setType(const string& type)
885  {
886  setAttribute(TYPE_ATTRIBUTE, type);
887  }
888 
889  /// Return true if the given element has a type string.
890  bool hasType() const
891  {
892  return hasAttribute(TYPE_ATTRIBUTE);
893  }
894 
895  /// Return the element's type string.
896  virtual const string& getType() const
897  {
898  return getAttribute(TYPE_ATTRIBUTE);
899  }
900 
901  /// Return true if the element is of color type.
902  bool isColorType() const
903  {
904  return getType() == "color3" || getType() == "color4";
905  }
906 
907  /// Return true if the element is of multi-output type.
908  bool isMultiOutputType() const
909  {
910  return getType() == MULTI_OUTPUT_TYPE_STRING;
911  }
912 
913  /// @}
914  /// @name TypeDef References
915  /// @{
916 
917  /// Return the TypeDef declaring the type string of this element. If no
918  /// matching TypeDef is found, then an empty shared pointer is returned.
919  TypeDefPtr getTypeDef() const;
920 
921  /// @}
922 
923  public:
924  static const string TYPE_ATTRIBUTE;
925 };
926 
927 /// @class ValueElement
928 /// The base class for elements that support typed values.
930 {
931  protected:
932  ValueElement(ElementPtr parent, const string& category, const string& name) :
933  TypedElement(parent, category, name)
934  {
935  }
936 
937  public:
938  virtual ~ValueElement() { }
939 
940  /// @name Value String
941  /// @{
942 
943  /// Set the value string of an element.
944  void setValueString(const string& value)
945  {
946  setAttribute(VALUE_ATTRIBUTE, value);
947  }
948 
949  /// Return true if the given element has a value string.
950  bool hasValueString() const
951  {
952  return hasAttribute(VALUE_ATTRIBUTE);
953  }
954 
955  /// Get the value string of a element.
956  const string& getValueString() const
957  {
958  return getAttribute(VALUE_ATTRIBUTE);
959  }
960 
961  /// Return the resolved value string of an element, applying any string
962  /// substitutions that are defined at the element's scope.
963  /// @param resolver An optional string resolver, which will be used to
964  /// apply string substitutions. By default, a new string resolver
965  /// will be created at this scope and applied to the return value.
966  string getResolvedValueString(StringResolverPtr resolver = nullptr) const;
967 
968  /// @}
969  /// @name Interface Names
970  /// @{
971 
972  /// Set the interface name of an element.
973  void setInterfaceName(const string& name)
974  {
975  setAttribute(INTERFACE_NAME_ATTRIBUTE, name);
976  }
977 
978  /// Return true if the given element has an interface name.
979  bool hasInterfaceName() const
980  {
981  return hasAttribute(INTERFACE_NAME_ATTRIBUTE);
982  }
983 
984  /// Return the interface name of an element.
985  const string& getInterfaceName() const
986  {
987  return getAttribute(INTERFACE_NAME_ATTRIBUTE);
988  }
989 
990  /// @}
991  /// @name Implementation Names
992  /// @{
993 
994  /// Set the implementation name of an element.
995  void setImplementationName(const string& name)
996  {
997  setAttribute(IMPLEMENTATION_NAME_ATTRIBUTE, name);
998  }
999 
1000  /// Return true if the given element has an implementation name.
1002  {
1003  return hasAttribute(IMPLEMENTATION_NAME_ATTRIBUTE);
1004  }
1005 
1006  /// Return the implementation name of an element.
1007  const string& getImplementationName() const
1008  {
1009  return getAttribute(IMPLEMENTATION_NAME_ATTRIBUTE);
1010  }
1011 
1012  /// @}
1013  /// @name Typed Value
1014  /// @{
1015 
1016  /// Set the typed value of an element.
1017  template <class T> void setValue(const T& value, const string& type = EMPTY_STRING)
1018  {
1019  setType(!type.empty() ? type : getTypeString<T>());
1020  setValueString(toValueString(value));
1021  }
1022 
1023  /// Set the typed value of an element from a C-style string.
1024  void setValue(const char* value, const string& type = EMPTY_STRING)
1025  {
1026  setValue(value ? string(value) : EMPTY_STRING, type);
1027  }
1028 
1029  /// Return true if the element possesses a typed value.
1030  bool hasValue() const
1031  {
1032  return hasAttribute(VALUE_ATTRIBUTE);
1033  }
1034 
1035  /// Return the typed value of an element as a generic value object, which
1036  /// may be queried to access its data.
1037  ///
1038  /// @return A shared pointer to the typed value of this element, or an
1039  /// empty shared pointer if no value is present.
1040  ValuePtr getValue() const;
1041 
1042  /// Return the resolved value of an element as a generic value object, which
1043  /// may be queried to access its data.
1044  ///
1045  /// @param resolver An optional string resolver, which will be used to
1046  /// apply string substitutions. By default, a new string resolver
1047  /// will be created at this scope and applied to the return value.
1048  /// @return A shared pointer to the typed value of this element, or an
1049  /// empty shared pointer if no value is present.
1050  ValuePtr getResolvedValue(StringResolverPtr resolver = nullptr) const;
1051 
1052  /// Return the default value for this element as a generic value object, which
1053  /// may be queried to access its data.
1054  ///
1055  /// @return A shared pointer to a typed value, or an empty shared pointer if
1056  /// no default value was found.
1057  ValuePtr getDefaultValue() const;
1058 
1059  /// @}
1060  /// @name Units
1061  /// @{
1062 
1063  /// Set the unit string of an element.
1064  void setUnit(const string& unit)
1065  {
1066  setAttribute(UNIT_ATTRIBUTE, unit);
1067  }
1068 
1069  /// Return true if the given element has a unit string.
1070  bool hasUnit() const
1071  {
1072  return hasAttribute(UNIT_ATTRIBUTE);
1073  }
1074 
1075  /// Return the unit string of an element.
1076  const string& getUnit() const
1077  {
1078  return getAttribute(UNIT_ATTRIBUTE);
1079  }
1080 
1081  /// Return the unit defined by the associated NodeDef if this element
1082  /// is a child of a Node.
1083  const string& getActiveUnit() const;
1084 
1085  /// Set the unit type of an element.
1086  void setUnitType(const string& unit)
1087  {
1088  setAttribute(UNITTYPE_ATTRIBUTE, unit);
1089  }
1090 
1091  /// Return true if the given element has a unit type.
1092  bool hasUnitType() const
1093  {
1094  return hasAttribute(UNITTYPE_ATTRIBUTE);
1095  }
1096 
1097  /// Return the unit type of an element.
1098  const string& getUnitType() const
1099  {
1100  return getAttribute(UNITTYPE_ATTRIBUTE);
1101  }
1102 
1103  /// @}
1104  /// @name Uniform attribute
1105  /// @{
1106 
1107  /// Set the uniform attribute flag on this element.
1108  void setIsUniform(bool value)
1109  {
1110  setTypedAttribute<bool>(UNIFORM_ATTRIBUTE, value);
1111  }
1112 
1113  /// The the uniform attribute flag for this element.
1114  bool getIsUniform() const
1115  {
1116  return getTypedAttribute<bool>(UNIFORM_ATTRIBUTE);
1117  }
1118 
1119  /// @}
1120  /// @name Functional Equivalence
1121  /// @{
1122 
1123  /// Return true if the attribute on a given element is equivalent
1124  /// based on the equivalence criteria provided.
1125  /// @param rhs Element to compare against
1126  /// @param attributeName Name of attribute to compare
1127  /// @param options Equivalence criteria
1128  /// @param message Optional text description of differences
1129  /// @return True if the attribute on the elements are equivalent. False otherwise.
1130  bool isAttributeEquivalent(ConstElementPtr rhs, const string& attributeName,
1131  const ElementEquivalenceOptions& options,
1132  string* message = nullptr) const override;
1133 
1134  /// @}
1135  /// @name Validation
1136  /// @{
1137 
1138  /// Validate that the given element tree, including all descendants, is
1139  /// consistent with the MaterialX specification.
1140  bool validate(string* message = nullptr) const override;
1141 
1142  /// @}
1143 
1144  public:
1145  static const string VALUE_ATTRIBUTE;
1146  static const string INTERFACE_NAME_ATTRIBUTE;
1147  static const string IMPLEMENTATION_NAME_ATTRIBUTE;
1148  static const string IMPLEMENTATION_TYPE_ATTRIBUTE;
1149  static const string ENUM_ATTRIBUTE;
1150  static const string ENUM_VALUES_ATTRIBUTE;
1151  static const string UI_NAME_ATTRIBUTE;
1152  static const string UI_FOLDER_ATTRIBUTE;
1153  static const string UI_MIN_ATTRIBUTE;
1154  static const string UI_MAX_ATTRIBUTE;
1155  static const string UI_SOFT_MIN_ATTRIBUTE;
1156  static const string UI_SOFT_MAX_ATTRIBUTE;
1157  static const string UI_STEP_ATTRIBUTE;
1158  static const string UI_ADVANCED_ATTRIBUTE;
1159  static const string UNIT_ATTRIBUTE;
1160  static const string UNITTYPE_ATTRIBUTE;
1161  static const string UNIFORM_ATTRIBUTE;
1162 };
1163 
1164 /// @class Token
1165 /// A token element representing a string value.
1166 ///
1167 /// Token elements are used to define input and output values for string
1168 /// substitutions in image filenames.
1170 {
1171  public:
1172  Token(ElementPtr parent, const string& name) :
1173  ValueElement(parent, CATEGORY, name)
1174  {
1175  }
1176  virtual ~Token() { }
1177 
1178  public:
1179  static const string CATEGORY;
1180 };
1181 
1182 /// @class CommentElement
1183 /// An element representing a block of descriptive text within a document, which will
1184 /// be stored a comment when the document is written out.
1185 ///
1186 /// The comment text may be accessed with the methods Element::setDocString and
1187 /// Element::getDocString.
1188 ///
1190 {
1191  public:
1192  CommentElement(ElementPtr parent, const string& name) :
1193  Element(parent, CATEGORY, name)
1194  {
1195  }
1196  virtual ~CommentElement() { }
1197 
1198  public:
1199  static const string CATEGORY;
1200 };
1201 
1202 /// @class NewlineElement
1203 /// An element representing a newline within a document.
1205 {
1206  public:
1207  NewlineElement(ElementPtr parent, const string& name) :
1208  Element(parent, CATEGORY, name)
1209  {
1210  }
1211  virtual ~NewlineElement() { }
1212 
1213  public:
1214  static const string CATEGORY;
1215 };
1216 
1217 /// @class GenericElement
1218 /// A generic element subclass, for instantiating elements with unrecognized categories.
1220 {
1221  public:
1222  GenericElement(ElementPtr parent, const string& name) :
1223  Element(parent, CATEGORY, name)
1224  {
1225  }
1226  virtual ~GenericElement() { }
1227 
1228  public:
1229  static const string CATEGORY;
1230 };
1231 
1232 /// @class StringResolver
1233 /// A helper object for applying string modifiers to data values in the context
1234 /// of a specific element and geometry.
1235 ///
1236 /// A StringResolver may be constructed through the Element::createStringResolver
1237 /// method, which initializes it in the context of a specific element, geometry,
1238 /// and material.
1239 ///
1240 /// Calling the StringResolver::resolve method applies all modifiers to a
1241 /// particular string value.
1242 ///
1243 /// Methods such as StringResolver::setFilePrefix may be used to edit the
1244 /// stored string modifiers before calling StringResolver::resolve.
1246 {
1247  public:
1248  /// Create a new string resolver.
1250  {
1251  return StringResolverPtr(new StringResolver());
1252  }
1253 
1254  virtual ~StringResolver() { }
1255 
1256  /// @name File Prefix
1257  /// @{
1258 
1259  /// Set the file prefix for this context.
1260  void setFilePrefix(const string& filePrefix)
1261  {
1262  _filePrefix = filePrefix;
1263  }
1264 
1265  /// Return the file prefix for this context.
1266  const string& getFilePrefix() const
1267  {
1268  return _filePrefix;
1269  }
1270 
1271  /// @}
1272  /// @name Geom Prefix
1273  /// @{
1274 
1275  /// Set the geom prefix for this context.
1276  void setGeomPrefix(const string& geomPrefix)
1277  {
1278  _geomPrefix = geomPrefix;
1279  }
1280 
1281  /// Return the geom prefix for this context.
1282  const string& getGeomPrefix() const
1283  {
1284  return _geomPrefix;
1285  }
1286 
1287  /// @}
1288  /// @name Filename Substitutions
1289  /// @{
1290 
1291  /// Set the UDIM substring substitution for filename data values.
1292  /// This string will be used to replace the standard <UDIM> token.
1293  void setUdimString(const string& udim);
1294 
1295  /// Set the UV-tile substring substitution for filename data values.
1296  /// This string will be used to replace the standard <UVTILE> token.
1297  void setUvTileString(const string& uvTile);
1298 
1299  /// Set an arbitrary substring substitution for filename data values.
1300  void setFilenameSubstitution(const string& key, const string& value)
1301  {
1302  _filenameMap[key] = value;
1303  }
1304 
1305  /// Add filename token substitutions for a given element
1306  void addTokenSubstitutions(ConstElementPtr element);
1307 
1308  /// Return the map of filename substring substitutions.
1310  {
1311  return _filenameMap;
1312  }
1313 
1314  /// @}
1315  /// @name Geometry Name Substitutions
1316  /// @{
1317 
1318  /// Set an arbitrary substring substitution for geometry name data values.
1319  void setGeomNameSubstitution(const string& key, const string& value)
1320  {
1321  _geomNameMap[key] = value;
1322  }
1323 
1324  /// Return the map of geometry name substring substitutions.
1326  {
1327  return _geomNameMap;
1328  }
1329 
1330  /// @}
1331  /// @name Resolution
1332  /// @{
1333 
1334  /// Given an input string and type, apply all appropriate modifiers and
1335  /// return the resulting string.
1336  virtual string resolve(const string& str, const string& type) const;
1337 
1338  /// Return true if the given type may be resolved by this class.
1339  static bool isResolvedType(const string& type)
1340  {
1341  return type == FILENAME_TYPE_STRING || type == GEOMNAME_TYPE_STRING;
1342  }
1343 
1344  /// @}
1345 
1346  protected:
1348 
1349  protected:
1350  string _filePrefix;
1351  string _geomPrefix;
1354 };
1355 
1356 /// @class ElementEquivalenceOptions
1357 /// A set of options for comparing the functional equivalence of elements.
1359 {
1360  public:
1362  {
1363  performValueComparisons = true;
1364  floatFormat = Value::getFloatFormat();
1365  floatPrecision = Value::getFloatPrecision();
1366  attributeExclusionList = {};
1367  };
1368  ~ElementEquivalenceOptions() = default;
1369 
1370  /// Perform value comparisons as opposed to literal string comparisons.
1371  /// Default is true.
1373 
1374  /// Floating point format to use for floating point value comparisons
1376 
1377  /// Floating point precision to use for floating point value comparisons
1379 
1380  /// Specifies the set of attributes that should be excluded when performing a comparison.
1381  /// By default all attributes are considered. Name and category attributes cannot be excluded.
1382  ///
1383  /// For example, to exclude UI and documentation attributes from consideration the follow may be set:
1384  /// attributeExclusionList = {
1385  /// ValueElement::UI_MIN_ATTRIBUTE, ValueElement::UI_MAX_ATTRIBUTE,
1386  /// ValueElement::UI_SOFT_MIN_ATTRIBUTE, ValueElement::UI_SOFT_MAX_ATTRIBUTE,
1387  /// ValueElement::UI_STEP_ATTRIBUTE, Element::XPOS_ATTRIBUTE,
1388  /// Element::YPOS_ATTRIBUTE, Element::DOC_ATTRIBUTE };
1390 };
1391 
1392 /// @class ExceptionOrphanedElement
1393 /// An exception that is thrown when an ElementPtr is used after its owning
1394 /// Document has gone out of scope.
1396 {
1397  public:
1398  using Exception::Exception;
1399 };
1400 
1401 template <class T> shared_ptr<T> Element::addChild(const string& name)
1402 {
1403  string childName = name;
1404  if (childName.empty())
1405  {
1406  childName = createValidChildName(T::CATEGORY + "1");
1407  }
1408 
1409  if (_childMap.count(childName))
1410  throw Exception("Child name is not unique: " + childName);
1411 
1412  shared_ptr<T> child = std::make_shared<T>(getSelf(), childName);
1413  registerChildElement(child);
1414 
1415  return child;
1416 }
1417 
1418 /// Given two target strings, each containing a string array of target names,
1419 /// return true if they have any targets in common. An empty target string
1420 /// matches all targets.
1421 MX_CORE_API bool targetStringsMatch(const string& target1, const string& target2);
1422 
1423 /// Pretty print the given element tree, calling asString recursively on each
1424 /// element in depth-first order.
1426 
1428 
1429 #endif
static const string UI_ADVANCED_ATTRIBUTE
Definition: Element.h:1158
GLuint GLsizei const GLchar * message
Definition: glcorearb.h:2543
ValueElement(ElementPtr parent, const string &category, const string &name)
Definition: Element.h:932
const string & getFilePrefix() const
Return the element's file prefix string.
Definition: Element.h:179
const string & getNamespace() const
Return the namespace string of this element.
Definition: Element.h:335
string _geomPrefix
Definition: Element.h:1351
virtual const string & getType() const
Return the element's type string.
Definition: Element.h:896
shared_ptr< const Element > ConstElementPtr
A shared pointer to a const Element.
Definition: Element.h:33
void setType(const string &type)
Set the element's type string.
Definition: Element.h:884
void setGeomPrefix(const string &prefix)
Set the element's geom prefix string.
Definition: Element.h:203
string _sourceUri
Definition: Element.h:839
weak_ptr< Element > _parent
Definition: Element.h:847
bool hasValue() const
Return true if the element possesses a typed value.
Definition: Element.h:1030
bool hasInterfaceName() const
Return true if the given element has an interface name.
Definition: Element.h:979
TypedElement(ElementPtr parent, const string &category, const string &name)
Definition: Element.h:868
shared_ptr< TypeDef > TypeDefPtr
A shared pointer to a TypeDef.
Definition: Definition.h:42
shared_ptr< const T > getAncestorOfType() const
Definition: Element.h:589
string _filePrefix
Definition: Element.h:1350
static const string IMPLEMENTATION_NAME_ATTRIBUTE
Definition: Element.h:1147
shared_ptr< T > addChild(const string &name=EMPTY_STRING)
Definition: Element.h:1401
static const string ENUM_ATTRIBUTE
Definition: Element.h:1149
const string & getFilePrefix() const
Return the file prefix for this context.
Definition: Element.h:1266
void setDocString(const string &doc)
Set the documentation string of this element.
Definition: Element.h:368
ElementPtr getSelf()
Return our self pointer.
Definition: Element.h:537
static const string UI_NAME_ATTRIBUTE
Definition: Element.h:1151
std::function< bool(ConstElementPtr)> ElementPredicate
A standard function taking an ElementPtr and returning a boolean.
Definition: Element.h:75
bool isColorType() const
Return true if the element is of color type.
Definition: Element.h:902
#define MATERIALX_NAMESPACE_BEGIN
Definition: Generated.h:25
StringMap _attributeMap
Definition: Element.h:844
virtual ~GenericElement()
Definition: Element.h:1226
vector< string > StringVec
A vector of strings.
Definition: Library.h:61
shared_ptr< NewlineElement > NewlineElementPtr
A shared pointer to a NewlineElement.
Definition: Element.h:56
bool hasImplementationName() const
Return true if the given element has an implementation name.
Definition: Element.h:1001
std::unordered_map< string, ElementPtr > ElementMap
A hash map from strings to elements.
Definition: Element.h:72
GLsizei const GLfloat * value
Definition: glcorearb.h:824
static FloatFormat getFloatFormat()
Return the current float format.
MX_CORE_API const string FILENAME_TYPE_STRING
static const string CATEGORY
Definition: Element.h:1199
void setIsUniform(bool value)
Set the uniform attribute flag on this element.
Definition: Element.h:1108
shared_ptr< TypedElement > TypedElementPtr
A shared pointer to a TypedElement.
Definition: Element.h:36
MATERIALX_NAMESPACE_BEGIN MX_CORE_API const string EMPTY_STRING
static const string CATEGORY
Definition: Element.h:1214
static StringResolverPtr create()
Create a new string resolver.
Definition: Element.h:1249
static const string UNIFORM_ATTRIBUTE
Definition: Element.h:1161
const string & getAttribute(const string &attrib) const
Definition: Element.h:491
static const string UI_MIN_ATTRIBUTE
Definition: Element.h:1153
void setValue(const T &value, const string &type=EMPTY_STRING)
Set the typed value of an element.
Definition: Element.h:1017
StringMap _geomNameMap
Definition: Element.h:1353
static const string IMPLEMENTATION_TYPE_ATTRIBUTE
Definition: Element.h:1148
virtual ~CommentElement()
Definition: Element.h:1196
void setValueString(const string &value)
Set the value string of an element.
Definition: Element.h:944
void setFilenameSubstitution(const string &key, const string &value)
Set an arbitrary substring substitution for filename data values.
Definition: Element.h:1300
string createValidChildName(string name) const
Definition: Element.h:773
bool hasUnit() const
Return true if the given element has a unit string.
Definition: Element.h:1070
shared_ptr< Token > TokenPtr
A shared pointer to a Token.
Definition: Element.h:46
class OCIOEXPORT Exception
static const string GEOM_PREFIX_ATTRIBUTE
Definition: Element.h:817
const string & getImplementationName() const
Return the implementation name of an element.
Definition: Element.h:1007
#define MX_CORE_API
Definition: Export.h:18
StringSet attributeExclusionList
Definition: Element.h:1389
MX_CORE_API string prettyPrint(ConstElementPtr elem)
bool hasValueString() const
Return true if the given element has a value string.
Definition: Element.h:950
virtual ~StringResolver()
Definition: Element.h:1254
void setImplementationName(const string &name)
Set the implementation name of an element.
Definition: Element.h:995
const string & getInterfaceName() const
Return the interface name of an element.
Definition: Element.h:985
shared_ptr< GenericElement > GenericElementPtr
A shared pointer to a GenericElement.
Definition: Element.h:61
bool hasColorSpace() const
Return true if the given element has a color space string.
Definition: Element.h:245
shared_ptr< const GenericElement > ConstGenericElementPtr
A shared pointer to a const GenericElement.
Definition: Element.h:63
const string & getActiveColorSpace() const
Definition: Element.h:258
__hostdev__ float getValue(uint32_t i) const
Definition: NanoVDB.h:5578
MX_CORE_API string incrementName(const string &name)
Increment the numeric suffix of a name.
Definition: Traversal.h:29
static const string INTERFACE_NAME_ATTRIBUTE
Definition: Element.h:1146
NewlineElement(ElementPtr parent, const string &name)
Definition: Element.h:1207
void setInheritsFrom(ConstElementPtr super)
Set the element that this one directly inherits from.
Definition: Element.h:293
string getDocString() const
Return the documentation string of this element.
Definition: Element.h:374
weak_ptr< Element > _root
Definition: Element.h:848
bool operator==(const BaseDimensions< T > &a, const BaseDimensions< Y > &b)
Definition: Dimensions.h:137
static const string NAME_ATTRIBUTE
Definition: Element.h:815
ElementPtr getParent()
Return our parent element.
Definition: Element.h:549
const string & getActiveFilePrefix() const
Definition: Element.h:186
vector< ElementPtr > ElementVec
A vector of elements.
Definition: Element.h:69
const string & getName() const
Return the element's name string.
Definition: Element.h:143
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
shared_ptr< const TypedElement > ConstTypedElementPtr
A shared pointer to a const TypedElement.
Definition: Element.h:38
shared_ptr< const Document > ConstDocumentPtr
Definition: Element.h:102
virtual ~Element()
Definition: Element.h:96
void setInterfaceName(const string &name)
Set the interface name of an element.
Definition: Element.h:973
void setValue(const char *value, const string &type=EMPTY_STRING)
Set the typed value of an element from a C-style string.
Definition: Element.h:1024
virtual bool validate(string *message=nullptr) const
shared_ptr< T > resolveNameReference(const string &name, ConstElementPtr parent=nullptr) const
Definition: Element.h:803
static const string CATEGORY
Definition: Element.h:1179
bool hasType() const
Return true if the given element has a type string.
Definition: Element.h:890
const string & getUnitType() const
Return the unit type of an element.
Definition: Element.h:1098
bool hasNamespace() const
Return true if this element has a namespace string.
Definition: Element.h:329
MX_CORE_API const string GEOMNAME_TYPE_STRING
static bool isResolvedType(const string &type)
Return true if the given type may be resolved by this class.
Definition: Element.h:1339
void setSourceUri(const string &sourceUri)
Definition: Element.h:721
GenericElement(ElementPtr parent, const string &name)
Definition: Element.h:1222
void setUnit(const string &unit)
Set the unit string of an element.
Definition: Element.h:1064
GLsizei GLsizei GLchar * source
Definition: glcorearb.h:803
void setUnitType(const string &unit)
Set the unit type of an element.
Definition: Element.h:1086
MX_CORE_API const string MULTI_OUTPUT_TYPE_STRING
shared_ptr< const ValueElement > ConstValueElementPtr
A shared pointer to a const ValueElement.
Definition: Element.h:43
virtual ~ValueElement()
Definition: Element.h:938
shared_ptr< Document > DocumentPtr
A shared pointer to a Document.
Definition: Document.h:22
T getTypedAttribute(const string &attrib) const
Definition: Element.h:514
void setColorSpace(const string &colorSpace)
Set the element's color space string.
Definition: Element.h:239
static const string UI_MAX_ATTRIBUTE
Definition: Element.h:1154
const string & getSourceUri() const
Return the element's source URI.
Definition: Element.h:733
MX_CORE_API const string NAME_PREFIX_SEPARATOR
MX_CORE_API bool targetStringsMatch(const string &target1, const string &target2)
static const string ENUM_VALUES_ATTRIBUTE
Definition: Element.h:1150
png_const_structrp png_const_inforp int * unit
Definition: png.h:2161
void setTypedAttribute(const string &attrib, const T &data)
Definition: Element.h:506
ElementPtr getInheritsFrom() const
Return the element, if any, that this one directly inherits from.
Definition: Element.h:306
GLuint const GLchar * name
Definition: glcorearb.h:786
static const string VALUE_ATTRIBUTE
Definition: Element.h:1145
ElementPtr getSelfNonConst() const
Definition: Element.h:831
virtual ~NewlineElement()
Definition: Element.h:1211
const string & getCategory() const
Definition: Element.h:127
static const string UI_SOFT_MAX_ATTRIBUTE
Definition: Element.h:1156
bool isMultiOutputType() const
Return true if the element is of multi-output type.
Definition: Element.h:908
void setFilePrefix(const string &filePrefix)
Set the file prefix for this context.
Definition: Element.h:1260
Element(ElementPtr parent, const string &category, const string &name)
Definition: Element.h:87
ConstElementPtr getParent() const
Return our parent element.
Definition: Element.h:555
bool hasUnitType() const
Return true if the given element has a unit type.
Definition: Element.h:1092
const StringMap & getGeomNameSubstitutions() const
Return the map of geometry name substring substitutions.
Definition: Element.h:1325
const string & getValueString() const
Get the value string of a element.
Definition: Element.h:956
const string & getActiveSourceUri() const
Definition: Element.h:740
void setNamespace(const string &space)
Set the namespace string of this element.
Definition: Element.h:323
shared_ptr< const NewlineElement > ConstNewlineElementPtr
A shared pointer to a const NewlineElement.
Definition: Element.h:58
shared_ptr< const Token > ConstTokenPtr
A shared pointer to a const Token.
Definition: Element.h:48
static int getFloatPrecision()
Return the current float precision.
virtual ~Token()
Definition: Element.h:1176
static const string UNITTYPE_ATTRIBUTE
Definition: Element.h:1160
shared_ptr< StringResolver > StringResolverPtr
A shared pointer to a StringResolver.
Definition: Element.h:66
string _category
Definition: Element.h:837
void setAttribute(const string &attrib, const string &value)
Set the value string of the given attribute.
shared_ptr< Document > DocumentPtr
Definition: Element.h:101
static const string YPOS_ATTRIBUTE
Definition: Element.h:823
bool hasInheritString() const
Return true if this element has an inherit string.
Definition: Element.h:281
const StringVec & getAttributeNames() const
Return a vector of stored attribute names, in the order they were set.
Definition: Element.h:498
void setFilePrefix(const string &prefix)
Set the element's file prefix string.
Definition: Element.h:167
Exception(const string &msg)
Definition: Exception.h:24
shared_ptr< const CommentElement > ConstCommentElementPtr
A shared pointer to a const CommentElement.
Definition: Element.h:53
const string & getActiveGeomPrefix() const
Definition: Element.h:222
bool hasFilePrefix() const
Return true if the given element has a file prefix string.
Definition: Element.h:173
string getQualifiedName(const string &name) const
Definition: Element.h:342
void setInheritString(const string &inherit)
Set the inherit string of this element.
Definition: Element.h:275
static const string COLOR_SPACE_ATTRIBUTE
Definition: Element.h:818
bool hasAttribute(const string &attrib) const
Return true if the given attribute is present.
Definition: Element.h:484
MX_CORE_API string createValidName(string name, char replaceChar= '_')
Create a valid MaterialX name from the given string.
shared_ptr< CommentElement > CommentElementPtr
A shared pointer to a CommentElement.
Definition: Element.h:51
const StringMap & getFilenameSubstitutions() const
Return the map of filename substring substitutions.
Definition: Element.h:1309
LeafData & operator=(const LeafData &)=delete
GLuint index
Definition: glcorearb.h:786
static const string UI_STEP_ATTRIBUTE
Definition: Element.h:1157
shared_ptr< T > getAncestorOfType()
Definition: Element.h:574
bool isA(const string &category=EMPTY_STRING) const
Definition: Element.h:386
const string & getUnit() const
Return the unit string of an element.
Definition: Element.h:1076
static const string TYPE_ATTRIBUTE
Definition: Element.h:924
std::unordered_map< string, string > StringMap
An unordered map with strings as both keys and values.
Definition: Library.h:63
static const string CATEGORY
Definition: Element.h:1229
void setGeomPrefix(const string &geomPrefix)
Set the geom prefix for this context.
Definition: Element.h:1276
static const string UI_FOLDER_ATTRIBUTE
Definition: Element.h:1152
bool hasGeomPrefix() const
Return true if the given element has a geom prefix string.
Definition: Element.h:209
static const string INHERIT_ATTRIBUTE
Definition: Element.h:819
virtual void registerChildElement(ElementPtr child)
bool getIsUniform() const
The the uniform attribute flag for this element.
Definition: Element.h:1114
std::set< string > StringSet
A set of strings.
Definition: Library.h:65
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
const string & getGeomPrefix() const
Return the element's geom prefix string.
Definition: Element.h:215
ConstElementPtr getSelf() const
Return our self pointer.
Definition: Element.h:543
shared_ptr< ValueElement > ValueElementPtr
A shared pointer to a ValueElement.
Definition: Element.h:41
#define MATERIALX_NAMESPACE_END
Definition: Generated.h:26
static const string FILE_PREFIX_ATTRIBUTE
Definition: Element.h:816
static const string DOC_ATTRIBUTE
Definition: Element.h:821
const string & getGeomPrefix() const
Return the geom prefix for this context.
Definition: Element.h:1282
bool operator!=(const BaseDimensions< T > &a, const BaseDimensions< Y > &b)
Definition: Dimensions.h:165
virtual size_t getUpstreamEdgeCount() const
Return the number of queryable upstream edges for this element.
Definition: Element.h:684
const string & getColorSpace() const
Return the element's color space string.
Definition: Element.h:251
bool hasSourceUri() const
Return true if this element has a source URI.
Definition: Element.h:727
Token(ElementPtr parent, const string &name)
Definition: Element.h:1172
Value::FloatFormat floatFormat
Floating point format to use for floating point value comparisons.
Definition: Element.h:1375
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:30
static const string UI_SOFT_MIN_ATTRIBUTE
Definition: Element.h:1155
virtual ~TypedElement()
Definition: Element.h:874
static const string NAMESPACE_ATTRIBUTE
Definition: Element.h:820
shared_ptr< T >(*)( CreatorFunction)
Definition: Library.h:43
int floatPrecision
Floating point precision to use for floating point value comparisons.
Definition: Element.h:1378
string _name
Definition: Element.h:838
shared_ptr< const Document > ConstDocumentPtr
A shared pointer to a const Document.
Definition: Document.h:24
void setGeomNameSubstitution(const string &key, const string &value)
Set an arbitrary substring substitution for geometry name data values.
Definition: Element.h:1319
ElementMap _childMap
Definition: Element.h:841
shared_ptr< class TypeDef > TypeDefPtr
Definition: Element.h:877
FloatFormat
Float formats to use when converting values to strings.
Definition: Value.h:49
void setCategory(const string &category)
Set the element's category string.
Definition: Element.h:119
static const string UNIT_ATTRIBUTE
Definition: Element.h:1159
StringVec _attributeOrder
Definition: Element.h:845
MX_CORE_API string toValueString(const T &data)
Convert the given data value to a value string.
void removeChildOfType(const string &name)
Definition: Element.h:470
const string & getInheritString() const
Return the inherit string of this element.
Definition: Element.h:287
StringMap _filenameMap
Definition: Element.h:1352
const ElementVec & getChildren() const
Definition: Element.h:446
Definition: format.h:1821
CommentElement(ElementPtr parent, const string &name)
Definition: Element.h:1192
static const string XPOS_ATTRIBUTE
Definition: Element.h:822
virtual bool isAttributeEquivalent(ConstElementPtr rhs, const string &attributeName, const ElementEquivalenceOptions &options, string *message=nullptr) const
ElementVec _childOrder
Definition: Element.h:842