hla: Provide a directly property based api for property data element.

This commit is contained in:
Mathias Froehlich 2011-10-03 11:21:27 +02:00
parent 8e92c5d985
commit bcb320b537
2 changed files with 81 additions and 101 deletions

View File

@ -23,70 +23,70 @@ namespace simgear {
class HLAPropertyDataElement::DecodeVisitor : public HLADataTypeDecodeVisitor { class HLAPropertyDataElement::DecodeVisitor : public HLADataTypeDecodeVisitor {
public: public:
DecodeVisitor(HLADecodeStream& stream, HLAPropertyReference& propertyReference) : DecodeVisitor(HLADecodeStream& stream, SGPropertyNode& propertyNode) :
HLADataTypeDecodeVisitor(stream), HLADataTypeDecodeVisitor(stream),
_propertyReference(propertyReference) _propertyNode(propertyNode)
{ } { }
virtual void apply(const HLAInt8DataType& dataType) virtual void apply(const HLAInt8DataType& dataType)
{ {
int8_t value = 0; int8_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAUInt8DataType& dataType) virtual void apply(const HLAUInt8DataType& dataType)
{ {
uint8_t value = 0; uint8_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAInt16DataType& dataType) virtual void apply(const HLAInt16DataType& dataType)
{ {
int16_t value = 0; int16_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAUInt16DataType& dataType) virtual void apply(const HLAUInt16DataType& dataType)
{ {
uint16_t value = 0; uint16_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAInt32DataType& dataType) virtual void apply(const HLAInt32DataType& dataType)
{ {
int32_t value = 0; int32_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAUInt32DataType& dataType) virtual void apply(const HLAUInt32DataType& dataType)
{ {
uint32_t value = 0; uint32_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setIntValue(value); _propertyNode.setIntValue(value);
} }
virtual void apply(const HLAInt64DataType& dataType) virtual void apply(const HLAInt64DataType& dataType)
{ {
int64_t value = 0; int64_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setLongValue(value); _propertyNode.setLongValue(value);
} }
virtual void apply(const HLAUInt64DataType& dataType) virtual void apply(const HLAUInt64DataType& dataType)
{ {
uint64_t value = 0; uint64_t value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setLongValue(value); _propertyNode.setLongValue(value);
} }
virtual void apply(const HLAFloat32DataType& dataType) virtual void apply(const HLAFloat32DataType& dataType)
{ {
float value = 0; float value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setFloatValue(value); _propertyNode.setFloatValue(value);
} }
virtual void apply(const HLAFloat64DataType& dataType) virtual void apply(const HLAFloat64DataType& dataType)
{ {
double value = 0; double value = 0;
dataType.decode(_stream, value); dataType.decode(_stream, value);
_propertyReference.setDoubleValue(value); _propertyNode.setDoubleValue(value);
} }
virtual void apply(const HLAFixedArrayDataType& dataType) virtual void apply(const HLAFixedArrayDataType& dataType)
@ -99,7 +99,7 @@ public:
dataType.getElementDataType()->accept(visitor); dataType.getElementDataType()->accept(visitor);
value.push_back(visitor.getValue()); value.push_back(visitor.getValue());
} }
_propertyReference.setStringValue(value); _propertyNode.setStringValue(value);
} }
virtual void apply(const HLAVariableArrayDataType& dataType) virtual void apply(const HLAVariableArrayDataType& dataType)
{ {
@ -113,65 +113,65 @@ public:
dataType.getElementDataType()->accept(visitor); dataType.getElementDataType()->accept(visitor);
value.push_back(visitor.getValue()); value.push_back(visitor.getValue());
} }
_propertyReference.setStringValue(value); _propertyNode.setStringValue(value);
} }
protected: protected:
HLAPropertyReference& _propertyReference; SGPropertyNode& _propertyNode;
}; };
class HLAPropertyDataElement::EncodeVisitor : public HLADataTypeEncodeVisitor { class HLAPropertyDataElement::EncodeVisitor : public HLADataTypeEncodeVisitor {
public: public:
EncodeVisitor(HLAEncodeStream& stream, const HLAPropertyReference& propertyReference) : EncodeVisitor(HLAEncodeStream& stream, const SGPropertyNode& propertyNode) :
HLADataTypeEncodeVisitor(stream), HLADataTypeEncodeVisitor(stream),
_propertyReference(propertyReference) _propertyNode(propertyNode)
{ } { }
virtual void apply(const HLAInt8DataType& dataType) virtual void apply(const HLAInt8DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAUInt8DataType& dataType) virtual void apply(const HLAUInt8DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAInt16DataType& dataType) virtual void apply(const HLAInt16DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAUInt16DataType& dataType) virtual void apply(const HLAUInt16DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAInt32DataType& dataType) virtual void apply(const HLAInt32DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAUInt32DataType& dataType) virtual void apply(const HLAUInt32DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getIntValue()); dataType.encode(_stream, _propertyNode.getIntValue());
} }
virtual void apply(const HLAInt64DataType& dataType) virtual void apply(const HLAInt64DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getLongValue()); dataType.encode(_stream, _propertyNode.getLongValue());
} }
virtual void apply(const HLAUInt64DataType& dataType) virtual void apply(const HLAUInt64DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getLongValue()); dataType.encode(_stream, _propertyNode.getLongValue());
} }
virtual void apply(const HLAFloat32DataType& dataType) virtual void apply(const HLAFloat32DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getFloatValue()); dataType.encode(_stream, _propertyNode.getFloatValue());
} }
virtual void apply(const HLAFloat64DataType& dataType) virtual void apply(const HLAFloat64DataType& dataType)
{ {
dataType.encode(_stream, _propertyReference.getDoubleValue()); dataType.encode(_stream, _propertyNode.getDoubleValue());
} }
virtual void apply(const HLAFixedArrayDataType& dataType) virtual void apply(const HLAFixedArrayDataType& dataType)
{ {
unsigned numElements = dataType.getNumElements(); unsigned numElements = dataType.getNumElements();
std::string value = _propertyReference.getStringValue(); std::string value = _propertyNode.getStringValue();
for (unsigned i = 0; i < numElements; ++i) { for (unsigned i = 0; i < numElements; ++i) {
if (i < value.size()) { if (i < value.size()) {
HLATemplateEncodeVisitor<char> visitor(_stream, value[i]); HLATemplateEncodeVisitor<char> visitor(_stream, value[i]);
@ -185,7 +185,7 @@ public:
virtual void apply(const HLAVariableArrayDataType& dataType) virtual void apply(const HLAVariableArrayDataType& dataType)
{ {
std::string value = _propertyReference.getStringValue(); std::string value = _propertyNode.getStringValue();
HLATemplateEncodeVisitor<std::string::size_type> numElementsVisitor(_stream, value.size()); HLATemplateEncodeVisitor<std::string::size_type> numElementsVisitor(_stream, value.size());
dataType.getSizeDataType()->accept(numElementsVisitor); dataType.getSizeDataType()->accept(numElementsVisitor);
for (unsigned i = 0; i < value.size(); ++i) { for (unsigned i = 0; i < value.size(); ++i) {
@ -195,7 +195,7 @@ public:
} }
protected: protected:
const HLAPropertyReference& _propertyReference; const SGPropertyNode& _propertyNode;
}; };
HLAPropertyDataElement::HLAPropertyDataElement(HLAPropertyReference* propertyReference) : HLAPropertyDataElement::HLAPropertyDataElement(HLAPropertyReference* propertyReference) :
@ -203,12 +203,27 @@ HLAPropertyDataElement::HLAPropertyDataElement(HLAPropertyReference* propertyRef
{ {
} }
HLAPropertyDataElement::HLAPropertyDataElement(const simgear::HLADataType* dataType, HLAPropertyReference* propertyReference) : HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType, HLAPropertyReference* propertyReference) :
_dataType(dataType), _dataType(dataType),
_propertyReference(propertyReference) _propertyReference(propertyReference)
{ {
} }
HLAPropertyDataElement::HLAPropertyDataElement()
{
}
HLAPropertyDataElement::HLAPropertyDataElement(SGPropertyNode* propertyNode)
{
setPropertyNode(propertyNode);
}
HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode) :
_dataType(dataType)
{
setPropertyNode(propertyNode);
}
HLAPropertyDataElement::~HLAPropertyDataElement() HLAPropertyDataElement::~HLAPropertyDataElement()
{ {
} }
@ -218,8 +233,8 @@ HLAPropertyDataElement::encode(HLAEncodeStream& stream) const
{ {
if (!_dataType.valid()) if (!_dataType.valid())
return false; return false;
if (_propertyReference.valid()) { if (const SGPropertyNode* propertyNode = getPropertyNode()) {
EncodeVisitor visitor(stream, *_propertyReference); EncodeVisitor visitor(stream, *propertyNode);
_dataType->accept(visitor); _dataType->accept(visitor);
} else { } else {
HLADataTypeEncodeVisitor visitor(stream); HLADataTypeEncodeVisitor visitor(stream);
@ -233,8 +248,8 @@ HLAPropertyDataElement::decode(HLADecodeStream& stream)
{ {
if (!_dataType.valid()) if (!_dataType.valid())
return false; return false;
if (_propertyReference.valid()) { if (SGPropertyNode* propertyNode = getPropertyNode()) {
DecodeVisitor visitor(stream, *_propertyReference); DecodeVisitor visitor(stream, *propertyNode);
_dataType->accept(visitor); _dataType->accept(visitor);
} else { } else {
HLADataTypeDecodeVisitor visitor(stream); HLADataTypeDecodeVisitor visitor(stream);
@ -266,4 +281,27 @@ HLAPropertyDataElement::setDataType(const HLADataType* dataType)
return false; return false;
} }
void
HLAPropertyDataElement::setPropertyNode(SGPropertyNode* propertyNode)
{
_propertyReference = new HLAPropertyReference;
_propertyReference->setRootNode(propertyNode);
}
SGPropertyNode*
HLAPropertyDataElement::getPropertyNode()
{
if (!_propertyReference.valid())
return 0;
return _propertyReference->getPropertyNode();
}
const SGPropertyNode*
HLAPropertyDataElement::getPropertyNode() const
{
if (!_propertyReference.valid())
return 0;
return _propertyReference->getPropertyNode();
}
} // namespace simgear } // namespace simgear

View File

@ -32,71 +32,6 @@ public:
_relativePath(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() SGPropertyNode* getPropertyNode()
{ return _propertyNode.get(); } { return _propertyNode.get(); }
@ -150,7 +85,10 @@ private:
class HLAPropertyDataElement : public HLADataElement { class HLAPropertyDataElement : public HLADataElement {
public: public:
HLAPropertyDataElement(HLAPropertyReference* propertyReference); HLAPropertyDataElement(HLAPropertyReference* propertyReference);
HLAPropertyDataElement(const simgear::HLADataType* dataType, HLAPropertyReference* propertyReference); HLAPropertyDataElement(const HLADataType* dataType, HLAPropertyReference* propertyReference);
HLAPropertyDataElement();
HLAPropertyDataElement(SGPropertyNode* propertyNode);
HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode);
virtual ~HLAPropertyDataElement(); virtual ~HLAPropertyDataElement();
virtual bool encode(HLAEncodeStream& stream) const; virtual bool encode(HLAEncodeStream& stream) const;
@ -159,6 +97,10 @@ public:
virtual const HLADataType* getDataType() const; virtual const HLADataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType); virtual bool setDataType(const HLADataType* dataType);
void setPropertyNode(SGPropertyNode* propertyNode);
SGPropertyNode* getPropertyNode();
const SGPropertyNode* getPropertyNode() const;
private: private:
class DecodeVisitor; class DecodeVisitor;
class EncodeVisitor; class EncodeVisitor;