From a516acbd44f02f3c6d5d60abead264e7f1038818 Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 29 Nov 2022 09:17:19 +0300 Subject: [PATCH] PIValueTree --- libs/main/types/pivaluetree.cpp | 35 ++++++++++++++++++++++++++++++++- libs/main/types/pivaluetree.h | 26 ++++++++++++++---------- libs/main/types/pivariant.cpp | 5 +++++ libs/main/types/pivariant.h | 2 +- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/libs/main/types/pivaluetree.cpp b/libs/main/types/pivaluetree.cpp index c1b2dbc1..20f31f6f 100644 --- a/libs/main/types/pivaluetree.cpp +++ b/libs/main/types/pivaluetree.cpp @@ -29,6 +29,16 @@ //! \~russian //! +const char PIValueTree::attributeArrayType [] = "arrayType" ; +const char PIValueTree::attributeArrayMinCount[] = "arrayMinCount"; +const char PIValueTree::attributeArrayMaxCount[] = "arrayMaxCount"; + +const char PIValueTree::attributeMinimum [] = "minimum" ; +const char PIValueTree::attributeMaximum [] = "maximum" ; +const char PIValueTree::attributeSingleStep [] = "singleStep" ; +const char PIValueTree::attributeDecimals [] = "decimals" ; +const char PIValueTree::attributePrefix [] = "prefix" ; +const char PIValueTree::attributeSuffix [] = "suffix" ; PIValueTree::PIValueTree() { @@ -40,9 +50,10 @@ PIValueTree::PIValueTree(const PIVariant & v) { } -PIValueTree::PIValueTree(const PIString & n, const PIVariant & v) { +PIValueTree::PIValueTree(const PIString & n, const PIVariant & v, const PIVariantMap & a) { setName(n); setValue(v); + _attributes = a; } @@ -64,6 +75,28 @@ void PIValueTree::setValue(const PIVariant & v) { } +void PIValueTree::setAttribute(const PIString & n, const PIVariant & a) { + if (_is_null) return; + _attributes[n] = a; +} + + +void PIValueTree::mergeAttributes(const PIVariantMap & a) { + if (_is_null) return; + auto it = a.makeIterator(); + while (it.next()) { + if (!_attributes.contains(it.key())) + _attributes.insert(it.key(), it.value()); + } +} + + +void PIValueTree::setStandardFlag(FlagStandard flag, bool on) { + if (on) _flags[Standard] |= flag; + else _flags[Standard] &= ~flag; +} + + bool PIValueTree::contains(const PIString & name) const { if (_is_null) return true; for (const auto & c: _children) diff --git a/libs/main/types/pivaluetree.h b/libs/main/types/pivaluetree.h index a4385594..49d93e45 100644 --- a/libs/main/types/pivaluetree.h +++ b/libs/main/types/pivaluetree.h @@ -35,7 +35,7 @@ class PIP_EXPORT PIValueTree { public: PIValueTree(); PIValueTree(const PIVariant & v); - PIValueTree(const PIString & n, const PIVariant & v); + PIValueTree(const PIString & n, const PIVariant & v, const PIVariantMap & a = PIVariantMap()); enum FlagsRole { Standard, @@ -51,20 +51,22 @@ public: ArrayResize = 0x1002, }; - static constexpr char attributeArrayType [] = "arrayType" ; - static constexpr char attributeArrayMinCount[] = "arrayMinCount"; - static constexpr char attributeArrayMaxCount[] = "arrayMaxCount"; + static const char attributeArrayType []; + static const char attributeArrayMinCount[]; + static const char attributeArrayMaxCount[]; - static constexpr char attributeMinimum [] = "minimum" ; - static constexpr char attributeMaximum [] = "maximum" ; - static constexpr char attributeSingleStep [] = "singleStep" ; - static constexpr char attributeDecimals [] = "decimals" ; - static constexpr char attributePrefix [] = "prefix" ; - static constexpr char attributeSuffix [] = "suffix" ; + static const char attributeMinimum []; + static const char attributeMaximum []; + static const char attributeSingleStep []; + static const char attributeDecimals []; + static const char attributePrefix []; + static const char attributeSuffix []; //static constexpr char attribute[] = ""; bool isNull() const {return _is_null;} bool isValid() const {return _value.isValid();} + bool isArray() const {return _attributes.contains(attributeArrayType);} + bool hasChildren() const {return _children.isNotEmpty();} const PIString & name() const {return _name;} void setName(const PIString & n); @@ -77,9 +79,13 @@ public: const PIVariantMap & attributes() const {return _attributes;} PIVariantMap & attributes() {return _attributes;} + void setAttribute(const PIString & n, const PIVariant & a); + void mergeAttributes(const PIVariantMap & a); PIFlags flagsStandard() {return _flags[Standard];} uint flags(FlagsRole role) {return _flags[role];} + void setStandardFlag(FlagStandard flag, bool on = true); + void setFlags(FlagsRole role, uint value) {_flags[role] = value;} const PIVector & children() const {return _children;} diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 466a1f27..98e0f7cd 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -235,6 +235,11 @@ PIVariant::Type PIVariant::typeFromID(uint type_id) { } +uint PIVariant::typeIDFromName(const PIString & tname) { + return tname.hash(); +} + + uint PIVariant::typeIDFromType(Type type) { switch (type) { case (PIVariant::pivBool ): return typeID(); diff --git a/libs/main/types/pivariant.h b/libs/main/types/pivariant.h index 119fd14d..61db6f15 100644 --- a/libs/main/types/pivariant.h +++ b/libs/main/types/pivariant.h @@ -739,7 +739,7 @@ public: //! \~english Returns type from its name. //! \~russian Возвращает тип из его названия. - static uint typeIDFromName(const PIString & tname) {return tname.hash();} + static uint typeIDFromName(const PIString & tname); //! \~english Returns type ID from standard type. //! \~russian Возвращает ID типа от стандатного типа.