17#ifndef SDF_ELEMENT_HH_
18#define SDF_ELEMENT_HH_
26#include <unordered_set>
33#include "sdf/config.hh"
41#pragma warning(disable: 4251)
49 inline namespace SDF_VERSION_NAMESPACE {
77 public std::enable_shared_from_this<Element>
114 public:
void SetName(
const std::string &_name);
171 const std::string &_prefix)
const;
193 bool _includeDefaultElements,
194 bool _includeDefaultAttributes,
204 const std::string &_prefix,
205 bool _includeDefaultElements,
206 bool _includeDefaultAttributes,
216 int _spacing,
int &_index)
const;
224 int _spacing,
int &_index)
const;
231 const std::string &_prefix,
241 const std::string &_prefix,
254 const std::string &_prefix,
255 bool _includeDefaultElements,
256 bool _includeDefaultAttributes,
271 const std::string &_prefix,
272 bool _includeDefaultElements,
273 bool _includeDefaultAttributes,
284 const std::string &_type,
285 const std::string &_defaultvalue,
287 const std::string &_description =
"");
298 const std::string &_type,
299 const std::string &_defaultvalue,
302 const std::string &_description =
"");
311 const std::string &_defaultValue,
bool _required,
312 const std::string &_description =
"");
322 const std::string &_defaultValue,
bool _required,
324 const std::string &_description =
"");
336 const std::string &_defaultValue,
bool _required,
337 const std::string &_minValue,
338 const std::string &_maxValue,
339 const std::string &_description =
"");
352 const std::string &_defaultValue,
bool _required,
353 const std::string &_minValue,
354 const std::string &_maxValue,
356 const std::string &_description =
"");
386 ElementPtr GetElementDescription(
unsigned int _index) const;
394 ElementPtr GetElementDescription(const std::
string &_key) const;
411 public:
ElementPtr MutableElementDescription(
unsigned int _index);
416 public:
ElementPtr MutableElementDescription(const std::
string &_key);
421 public:
bool HasElementDescription(const std::
string &_name) const;
426 public:
bool HasAttribute(const std::
string &_key) const;
431 public:
bool GetAttributeSet(const std::
string &_key) const;
435 public:
void RemoveAttribute(const std::
string &_key);
438 public:
void RemoveAllAttributes();
448 public: std::any GetAny(const std::
string &_key = "") const;
456 const std::
string &_key = "") const;
465 public: template<typename T>
467 const std::
string &_key = "") const;
475 public: template<typename T>
476 T Get(const std::
string &_key = "") const;
485 public: template<typename T>
486 std::pair<T,
bool> Get(
sdf::
Errors &_errors,
487 const std::
string &_key,
488 const T &_defaultValue) const;
495 public: template<typename T>
496 std::pair<T,
bool> Get(const std::
string &_key,
497 const T &_defaultValue) const;
505 public: template<typename T>
506 bool Get(const std::
string &_key,
508 const T &_defaultValue) const;
517 public: template<typename T>
519 const std::
string &_key,
521 const T &_defaultValue) const;
526 public: template<typename T>
527 bool Set(const T &_value);
533 public: template<typename T>
534 bool Set(
sdf::
Errors &_errors, const T &_value);
539 public:
bool HasElement(const std::
string &_name) const;
557 public:
ElementPtr GetNextElement(const std::
string &_name = "") const;
561 public: std::set<std::
string> GetElementTypeNames() const;
570 public:
bool HasUniqueChildNames(const std::
string &_type = "") const;
581 const std::
string &_type = "") const;
593 public:
bool HasUniqueChildNames(
594 const std::
string &_type,
595 const std::vector<std::
string> &_ignoreElements) const;
608 public:
bool HasUniqueChildNames(
610 const std::
string &_type,
611 const std::vector<std::
string> &_ignoreElements) const;
620 public: std::map<std::
string, std::
size_t>
621 CountNamedElements(const std::
string &_type = "") const;
631 public: std::map<std::
string, std::
size_t>
633 const std::
string &_type = "") const;
645 public: std::map<std::
string, std::
size_t> CountNamedElements(
646 const std::
string &_type,
647 const std::vector<std::
string> &_ignoreElements) const;
660 public: std::map<std::
string, std::
size_t> CountNamedElements(
662 const std::
string &_type,
663 const std::vector<std::
string> &_ignoreElements) const;
734 public:
void InsertElement(
ElementPtr _elem,
bool _setParentToSelf);
737 public:
void RemoveFromParent();
749 public:
void ClearElements();
753 public:
void Clear();
757 public:
void Update();
767 public:
void Reset();
784 public:
void SetFilePath(const std::
string &_path);
788 public: const std::
string &FilePath() const;
792 public:
void SetLineNumber(
int _lineNumber);
797 public: std::optional<
int> LineNumber() const;
813 public:
void SetXmlPath(const std::
string &_path);
817 public: const std::
string &XmlPath() const;
821 public:
void SetOriginalVersion(const std::
string &_version);
825 public: const std::
string &OriginalVersion() const;
829 public: std::
string GetDescription() const;
833 public:
void SetDescription(const std::
string &_desc);
842 public:
ElementPtr GetElementImpl(const std::
string &_name) const;
847 public: static std::vector<std::
string> NameUniquenessExceptions();
856 private:
void ToString(
sdf::
Errors &_errors,
857 std::ostringstream &_out,
858 const std::
string &_prefix,
859 bool _includeDefaultElements,
860 bool _includeDefaultAttributes,
870 private:
void PrintValuesImpl(
sdf::
Errors &_errors,
871 const std::
string &_prefix,
872 bool _includeDefaultElements,
873 bool _includeDefaultAttributes,
875 std::ostringstream &_out) const;
886 private:
ParamPtr CreateParam(const std::
string &_key,
887 const std::
string &_type,
888 const std::
string &_defaultValue,
891 const std::
string &_description = "");
978 std::ostringstream &_out)
const;
986 bool _includeDefaultAttributes,
988 std::ostringstream &_out)
const;
996 const std::string &_key);
1000 template<
typename T>
1005 std::pair<T, bool> ret = this->Get<T>(_errors, _key, result);
1011 template<
typename T>
1012 T Element::Get(
const std::string &_key)
const
1016 std::pair<T, bool> ret = this->Get<T>(_key, result);
1022 template<
typename T>
1024 const std::string &_key,
1026 const T &_defaultValue)
const
1028 std::pair<T, bool> ret = this->Get<T>(_errors, _key, _defaultValue);
1034 template<
typename T>
1035 bool Element::Get(
const std::string &_key,
1037 const T &_defaultValue)
const
1039 std::pair<T, bool> ret = this->Get<T>(_key, _defaultValue);
1045 template<
typename T>
1046 std::pair<T, bool> Element::Get(
const std::string &_key,
1047 const T &_defaultValue)
const
1050 std::pair<T, bool> result = this->Get<T>(errors, _key, _defaultValue);
1051 for(
auto& error : errors)
1053 internal::throwOrPrintError(
sdferr, error);
1059 template<
typename T>
1061 const std::string &_key,
1062 const T &_defaultValue)
const
1064 std::pair<T, bool> result(_defaultValue,
true);
1066 if (_key.empty() && this->dataPtr->value)
1068 this->dataPtr->value->Get<T>(result.first, _errors);
1070 else if (!_key.empty())
1072 ParamPtr param = this->GetAttribute(_key);
1075 param->Get(result.first, _errors);
1077 else if (this->HasElement(_key))
1079 result.first = this->GetElementImpl(_key)->Get<T>(_errors);
1081 else if (this->HasElementDescription(_key))
1083 result.first = this->ElementDescription(_key)->Get<T>(_errors);
1087 result.second =
false;
1092 result.second =
false;
1099 template<
typename T>
1100 bool Element::Set(
const T &_value)
1103 bool result = this->Set<T>(errors, _value);
1104 for(
auto& error : errors)
1106 internal::throwOrPrintError(
sdferr, error);
1112 template<
typename T>
1115 if (this->dataPtr->value)
1117 return this->dataPtr->value->Set(_value, _errors);
Definition Element.hh:900
bool explicitlySetInFile
True if the element was set in the SDF file.
Definition Element.hh:960
ElementWeakPtr parent
Element's parent.
Definition Element.hh:914
std::string description
Element description.
Definition Element.hh:908
void PrintAttributes(bool _includeDefaultAttributes, const PrintConfig &_config, std::ostringstream &_out) const
Generate the string (XML) for the attributes.
ElementPtr_V elements
Definition Element.hh:923
std::unordered_set< ElementConstPtr > clonedElementDescriptions
Used to keep track of which element descriptions we have cloned in order to provide a mutable pointer...
Definition Element.hh:970
std::string referenceSDF
Name of reference sdf.
Definition Element.hh:951
bool copyChildren
True if element's children should be copied.
Definition Element.hh:911
Param_V attributes
Definition Element.hh:917
std::string required
True if element is required.
Definition Element.hh:905
void PrintAttributes(sdf::Errors &_errors, bool _includeDefaultAttributes, const PrintConfig &_config, std::ostringstream &_out) const
Generate the string (XML) for the attributes.
ParamPtr value
Definition Element.hh:920
std::string name
Element name.
Definition Element.hh:902
std::optional< unsigned int > ElementDescriptionIndex(const std::string &_key)
Helper function to get the index of an element description identified by a given key.
ElementPtr_V elementDescriptions
Definition Element.hh:926
std::string originalVersion
Spec version that this was originally parsed from.
Definition Element.hh:957
std::string xmlPath
XML path of this element.
Definition Element.hh:966
std::string path
Path to file where this element came from.
Definition Element.hh:954
std::optional< int > lineNumber
Line number in file where this element came from.
Definition Element.hh:963
ElementPtr includeElement
The element that was used to load this entity.
Definition Element.hh:948
SDF Element class.
Definition Element.hh:78
void Copy(const ElementPtr _elem)
Copy values from an Element.
size_t GetAttributeCount() const
Get the number of attributes.
const std::string & GetRequired() const
Get the requirement string.
void PrintValues(sdf::Errors &_errors, std::string _prefix, const PrintConfig &_config=PrintConfig()) const
Output Element's values to stdout.
void PrintDescription(sdf::Errors &_errors, const std::string &_prefix) const
Output Element's description to stdout.
std::string ToString(sdf::Errors &_errors, const std::string &_prefix, const PrintConfig &_config=PrintConfig()) const
Convert the element values to a string representation.
std::string ReferenceSDF() const
Get the name of the reference SDF element.
void PrintValues(const std::string &_prefix, bool _includeDefaultElements, bool _includeDefaultAttributes, const PrintConfig &_config=PrintConfig()) const
Output Element's values to stdout.
void SetRequired(const std::string &_req)
Set the requirement type.
std::string ToString(const std::string &_prefix, bool _includeDefaultElements, bool _includeDefaultAttributes, const PrintConfig &_config=PrintConfig()) const
Convert the element values to a string representation.
void SetCopyChildren(bool _value)
Set whether this element should copy its child elements during parsing.
const std::string & GetName() const
Get the Element's name.
void Copy(const ElementPtr _elem, sdf::Errors &_errors)
Copy values from an Element.
void AddValue(const std::string &_type, const std::string &_defaultValue, bool _required, const std::string &_minValue, const std::string &_maxValue, const std::string &_description="")
Add a value to this Element.
void SetExplicitlySetInFile(const bool _value)
Set if the element and children where set or default in the original file.
void AddAttribute(const std::string &_key, const std::string &_type, const std::string &_defaultvalue, bool _required, sdf::Errors &_errors, const std::string &_description="")
Add an attribute value.
void SetParent(const ElementPtr _parent)
Set the parent of this Element.
void PrintDocRightPane(std::string &_html, int _spacing, int &_index) const
Helper function for SDF::PrintDoc.
GZ_DEPRECATED(16) ElementPtr GetElementDescription(unsigned int _index) const
Get an element description using an index.
ParamPtr GetAttribute(const std::string &_key) const
Get the param of an attribute.
bool GetCopyChildren() const
Return true if this Element's child elements should be copied during parsing.
bool GetExplicitlySetInFile() const
Return if the element was been explicitly set in the file.
void AddValue(const std::string &_type, const std::string &_defaultValue, bool _required, const std::string &_description="")
Add a value to this Element.
void PrintDescription(const std::string &_prefix) const
Output Element's description to stdout.
void PrintValues(std::string _prefix, const PrintConfig &_config=PrintConfig()) const
Output Element's values to stdout.
void AddAttribute(const std::string &_key, const std::string &_type, const std::string &_defaultvalue, bool _required, const std::string &_description="")
Add an attribute value.
void AddValue(const std::string &_type, const std::string &_defaultValue, bool _required, sdf::Errors &_errors, const std::string &_description="")
Add a value to this Element.
void PrintDocLeftPane(std::string &_html, int _spacing, int &_index) const
Helper function for SDF::PrintDoc.
ElementPtr Clone(sdf::Errors &_errors) const
Create a copy of this Element.
ParamPtr GetAttribute(unsigned int _index) const
Get an attribute using an index.
ElementPtr Clone() const
Create a copy of this Element.
std::string ToString(const std::string &_prefix, const PrintConfig &_config=PrintConfig()) const
Convert the element values to a string representation.
void SetReferenceSDF(const std::string &_value)
Set reference SDF element.
void PrintValues(sdf::Errors &_errors, const std::string &_prefix, bool _includeDefaultElements, bool _includeDefaultAttributes, const PrintConfig &_config=PrintConfig()) const
Output Element's values to stdout.
virtual ~Element()
Destructor.
size_t GetElementDescriptionCount() const
Get the number of element descriptions.
void AddValue(const std::string &_type, const std::string &_defaultValue, bool _required, const std::string &_minValue, const std::string &_maxValue, sdf::Errors &_errors, const std::string &_description="")
Add a value to this Element.
const Param_V & GetAttributes() const
Get all the attribute params.
ElementPtr GetParent() const
Get a pointer to this Element's parent.
void SetName(const std::string &_name)
Set the name of the Element.
std::string ToString(sdf::Errors &_errors, const std::string &_prefix, bool _includeDefaultElements, bool _includeDefaultAttributes, const PrintConfig &_config=PrintConfig()) const
Convert the element values to a string representation.
This class contains configuration options for printing elements.
Definition PrintConfig.hh:33
#define sdferr
Output an error message.
Definition Console.hh:57
std::shared_ptr< Param > ParamPtr
Definition Param.hh:70
std::vector< ParamPtr > Param_V
Definition Param.hh:74
std::vector< ElementPtr > ElementPtr_V
Definition Element.hh:69
std::shared_ptr< const Element > ElementConstPtr
Definition Element.hh:61
std::vector< Error > Errors
A vector of Error.
Definition Types.hh:80
std::weak_ptr< Element > ElementWeakPtr
Definition Element.hh:65
std::shared_ptr< Element > ElementPtr
Definition Element.hh:57
namespace for Simulation Description Format parser
Definition Actor.hh:35
#define SDFORMAT_VISIBLE
Use to represent "symbol visible" if supported.
Definition system_util.hh:25