X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLAPropertyDataElement.hxx;h=da21b2ab5c7176a59eba1500ff8a191aaecf67b0;hb=d4310a7f3b27b8403ba1ec030cfd3b4c6c565f24;hp=4441584e0fae3b9a4de9a44e50bff11bf15d4509;hpb=3a0fbae4d90187d96eb991a7d7dccc339a3bcb48;p=simgear.git diff --git a/simgear/hla/HLAPropertyDataElement.hxx b/simgear/hla/HLAPropertyDataElement.hxx index 4441584e..da21b2ab 100644 --- a/simgear/hla/HLAPropertyDataElement.hxx +++ b/simgear/hla/HLAPropertyDataElement.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de +// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public @@ -18,140 +18,21 @@ #ifndef HLAPropertyDataElement_hxx #define HLAPropertyDataElement_hxx -#include #include #include "HLADataElement.hxx" namespace simgear { -class HLAPropertyReference : public SGReferenced { -public: - HLAPropertyReference() - { } - HLAPropertyReference(const std::string& relativePath) : - _relativePath(relativePath) - { } - - void setIntValue(int value) - { - if (!_propertyNode.valid()) - return; - _propertyNode->setIntValue(value); - } - int getIntValue() const - { - if (!_propertyNode.valid()) - return 0; - return _propertyNode->getIntValue(); - } - - void setLongValue(long value) - { - if (!_propertyNode.valid()) - return; - _propertyNode->setLongValue(value); - } - long getLongValue() const - { - if (!_propertyNode.valid()) - return 0; - return _propertyNode->getLongValue(); - } - - void setFloatValue(float value) - { - if (!_propertyNode.valid()) - return; - _propertyNode->setFloatValue(value); - } - float getFloatValue() const - { - if (!_propertyNode.valid()) - return 0; - return _propertyNode->getFloatValue(); - } - - void setDoubleValue(double value) - { - if (!_propertyNode.valid()) - return; - _propertyNode->setDoubleValue(value); - } - double getDoubleValue() const - { - if (!_propertyNode.valid()) - return 0; - return _propertyNode->getDoubleValue(); - } - - void setStringValue(const std::string& value) - { - if (!_propertyNode.valid()) - return; - _propertyNode->setStringValue(value); - } - std::string getStringValue() const - { - if (!_propertyNode.valid()) - return std::string(); - return _propertyNode->getStringValue(); - } - - SGPropertyNode* getPropertyNode() - { return _propertyNode.get(); } - - void setRootNode(SGPropertyNode* rootNode) - { - if (!rootNode) - _propertyNode.clear(); - else - _propertyNode = rootNode->getNode(_relativePath, true); - } - -private: - std::string _relativePath; - SGSharedPtr _propertyNode; -}; - -class HLAPropertyReferenceSet : public SGReferenced { -public: - void insert(const SGSharedPtr& propertyReference) - { - _propertyReferenceSet.insert(propertyReference); - propertyReference->setRootNode(_rootNode.get()); - } - void remove(const SGSharedPtr& propertyReference) - { - PropertyReferenceSet::iterator i = _propertyReferenceSet.find(propertyReference); - if (i == _propertyReferenceSet.end()) - return; - _propertyReferenceSet.erase(i); - propertyReference->setRootNode(0); - } - - void setRootNode(SGPropertyNode* rootNode) - { - _rootNode = rootNode; - for (PropertyReferenceSet::iterator i = _propertyReferenceSet.begin(); - i != _propertyReferenceSet.end(); ++i) { - (*i)->setRootNode(_rootNode.get()); - } - } - SGPropertyNode* getRootNode() - { return _rootNode.get(); } - -private: - SGSharedPtr _rootNode; - - typedef std::set > PropertyReferenceSet; - PropertyReferenceSet _propertyReferenceSet; -}; - class HLAPropertyDataElement : public HLADataElement { public: - HLAPropertyDataElement(HLAPropertyReference* propertyReference); - HLAPropertyDataElement(const simgear::HLADataType* dataType, HLAPropertyReference* propertyReference); - ~HLAPropertyDataElement(); + HLAPropertyDataElement(); + HLAPropertyDataElement(SGPropertyNode* propertyNode); + HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode); + HLAPropertyDataElement(const HLADataType* dataType); + virtual ~HLAPropertyDataElement(); + + virtual void accept(HLADataElementVisitor& visitor); + virtual void accept(HLAConstDataElementVisitor& visitor) const; virtual bool encode(HLAEncodeStream& stream) const; virtual bool decode(HLADecodeStream& stream); @@ -159,12 +40,25 @@ public: virtual const HLADataType* getDataType() const; virtual bool setDataType(const HLADataType* dataType); + void setPropertyNode(SGPropertyNode* propertyNode); + SGPropertyNode* getPropertyNode(); + const SGPropertyNode* getPropertyNode() const; + private: - class DecodeVisitor; - class EncodeVisitor; + HLADataElement* + createDataElement(const SGSharedPtr& dataType, const SGSharedPtr& propertyNode); + + class ScalarDecodeVisitor; + class ScalarEncodeVisitor; + class ScalarDataElement; + class StringDecodeVisitor; + class StringEncodeVisitor; + class StringDataElement; + class DataElementFactoryVisitor; SGSharedPtr _dataType; - SGSharedPtr _propertyReference; + SGSharedPtr _dataElement; + SGSharedPtr _propertyNode; }; } // namespace simgear