X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLADataElement.hxx;h=7ee817ed6304b2f7c8cc3f1eec8cd7f5968fc1d2;hb=2c1fbd558b355cbe9f8902962cbeb492915236f3;hp=284422b8e6130b4bf55dd5a73788c508e1d94e5e;hpb=252a539e69bda7cf8cf0c5198f25f38b0a710ee2;p=simgear.git diff --git a/simgear/hla/HLADataElement.hxx b/simgear/hla/HLADataElement.hxx index 284422b8..7ee817ed 100644 --- a/simgear/hla/HLADataElement.hxx +++ b/simgear/hla/HLADataElement.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 @@ -25,193 +25,102 @@ #include #include "RTIData.hxx" #include "HLADataType.hxx" +#include "HLATypes.hxx" class SGTimeStamp; namespace simgear { +class HLADataElementVisitor; +class HLAConstDataElementVisitor; + class HLADataElement : public SGReferenced { public: virtual ~HLADataElement(); + virtual void accept(HLADataElementVisitor& visitor) = 0; + virtual void accept(HLAConstDataElementVisitor& visitor) const = 0; + virtual bool encode(HLAEncodeStream& stream) const = 0; virtual bool decode(HLADecodeStream& stream) = 0; virtual const HLADataType* getDataType() const = 0; virtual bool setDataType(const HLADataType* dataType) = 0; + bool setDataElement(const HLADataElementIndex& index, HLADataElement* dataElement) + { return setDataElement(index.begin(), index.end(), dataElement); } + HLADataElement* getDataElement(const HLADataElementIndex& index) + { return getDataElement(index.begin(), index.end()); } + const HLADataElement* getDataElement(const HLADataElementIndex& index) const + { return getDataElement(index.begin(), index.end()); } + + virtual bool setDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end, HLADataElement* dataElement); + virtual HLADataElement* getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end); + virtual const HLADataElement* getDataElement(HLADataElementIndex::const_iterator begin, HLADataElementIndex::const_iterator end) const; + + /// Returns the time stamp if this data element. + /// Do not access this getter if the getTimeStampValid() method returns false. + const SGTimeStamp& getTimeStamp() const + { return _stamp->getTimeStamp(); } + void setTimeStamp(const SGTimeStamp& timeStamp); + + bool getTimeStampValid() const + { if (!_stamp.valid()) return false; return _stamp->getTimeStampValid(); } + void setTimeStampValid(bool timeStampValid); + + /// Convenience function that gives the time difference in seconds to a given timestamp + /// This function returns 0 if the timestamp is not valid. + double getTimeDifference(const SGTimeStamp& timeStamp) const; + + /// Dirty tracking of the attribute/parameter that this data element belongs to + bool getDirty() const + { if (!_stamp.valid()) return true; return _stamp->getDirty(); } + void setDirty(bool dirty) + { if (!_stamp.valid()) return; _stamp->setDirty(dirty); } + + /// Stamp handling + void createStamp(); + void attachStamp(HLADataElement& dataElement); + void clearStamp(); + +protected: // Container for the timestamp the originating attribute was last updated for - // class TimeStamp : public SGReferenced { - // public: - // const SGTimeStamp& getTimeStamp() const - // { return _timeStamp; } - // void setTimeStamp(const SGTimeStamp& timeStamp) - // { _timeStamp = timeStamp; } - // private: - // SGTimeStamp _timeStamp; - // }; - - // const TimeStamp* getTimeStamp() const - // { return _timeStamp.get(); } - // void setTimeStamp(const TimeStamp* timeStamp) - // { _timeStamp = timeStamp; } - - // struct ChangeCount : public SGReferenced { - // ChangeCount() : _value(0) {} - // unsigned _value; - // }; - // SGSharedPtr _changeCount; - // unsigned getChangeCount() const - // { - // // If we don't have return allways the same - // if (!_changeCount.valid()) - // return 0; - // return _changeCount->_value; - // } - - /// HLADataElements could be identified by path - /// These paths are composed of structure field names and array indices in the - /// order they appear while walking to the data element. - /// So provide here some tool functions to access these elements - /// Note that these functions are relatively expensive in execution time. - /// So only use them once at object creation time and store direct references to the values - - class PathElement { + class Stamp : public SGReferenced { public: - PathElement(unsigned index) : _data(new IndexData(index)) {} - PathElement(const std::string& name) : _data(new FieldData(name)) {} - - bool isFieldValue() const - { return _data->toFieldData(); } - bool isIndexValue() const - { return _data->toIndexData(); } - - unsigned getIndexValue() const - { - const IndexData* indexData = _data->toIndexData(); - if (!indexData) - return ~unsigned(0); - return indexData->_index; - } - - std::string getFieldValue() const - { - const FieldData* fieldData = _data->toFieldData(); - if (!fieldData) - return std::string(); - return fieldData->_name; - } - - // Want to be able to use that in std::map and std::set - bool operator<(const PathElement& pathElement) const - { return _data->less(pathElement._data.get()); } - bool operator==(const PathElement& pathElement) const - { return _data->equal(pathElement._data.get()); } - - void append(std::string& s) const - { _data->append(s); } + Stamp() : _timeStampValid(false), _dirty(true) + { } - private: - struct FieldData; - struct IndexData; - struct Data : public SGReferenced { - virtual ~Data(); - virtual const FieldData* toFieldData() const; - virtual const IndexData* toIndexData() const; - virtual bool less(const Data*) const = 0; - virtual bool equal(const Data*) const = 0; - virtual void append(std::string&) const = 0; - }; - struct FieldData : public Data { - FieldData(const std::string& name); - virtual ~FieldData(); - virtual const FieldData* toFieldData() const; - virtual bool less(const Data* data) const; - virtual bool equal(const Data* data) const; - virtual void append(std::string& s) const; - std::string _name; - }; - struct IndexData : public Data { - IndexData(unsigned index); - virtual ~IndexData(); - virtual const IndexData* toIndexData() const; - virtual bool less(const Data* data) const; - virtual bool equal(const Data* data) const; - virtual void append(std::string& s) const; - unsigned _index; - }; - - SGSharedPtr _data; - }; - typedef std::list Path; - typedef std::pair AttributePathPair; - typedef std::pair IndexPathPair; + const SGTimeStamp& getTimeStamp() const + { return _timeStamp; } + void setTimeStamp(const SGTimeStamp& timeStamp) + { _timeStamp = timeStamp; } - static std::string toString(const Path& path); - static std::string toString(const AttributePathPair& path) - { return path.first + toString(path.second); } - static AttributePathPair toAttributePathPair(const std::string& s); - static Path toPath(const std::string& s) - { return toAttributePathPair(s).second; } + bool getTimeStampValid() const + { return _timeStampValid; } + void setTimeStampValid(bool timeStampValid) + { _timeStampValid = timeStampValid; } -private: - // SGSharedPtr _timeStamp; -}; + bool getDirty() const + { return _dirty; } + void setDirty(bool dirty) + { _dirty = dirty; } -class HLADataElementProvider { -public: - class AbstractProvider : public SGReferenced { - public: - virtual ~AbstractProvider() { } - virtual HLADataElement* getDataElement(const HLADataElement::Path& path) = 0; - // virtual HLADataElement* getDataElement(const HLADataElement::Path& path, const HLADataType* dataType) - // { - // SGSharedPtr dataElement = getDataElement(path); - // if (!dataElement.valid()) - // return 0; - // if (!dataElement->setDataType(dataType)) - // return 0; - // return dataElement.release(); - // } + private: + SGTimeStamp _timeStamp; + bool _timeStampValid; + bool _dirty; }; - HLADataElementProvider() - { } - HLADataElementProvider(HLADataElement* dataElement) : - _provider(new ConcreteProvider(dataElement)) - { } - HLADataElementProvider(const SGSharedPtr& dataElement) : - _provider(new ConcreteProvider(dataElement)) - { } - HLADataElementProvider(AbstractProvider* provider) : - _provider(provider) - { } - - HLADataElement* getDataElement(const HLADataElement::Path& path) const - { - if (!_provider.valid()) - return 0; - return _provider->getDataElement(path); - } + /// get the stamp + Stamp* _getStamp() const + { return _stamp.get(); } + /// Set the stamp + virtual void _setStamp(Stamp* stamp); private: - class ConcreteProvider : public AbstractProvider { - public: - ConcreteProvider(const SGSharedPtr& dataElement) : - _dataElement(dataElement) - { } - virtual HLADataElement* getDataElement(const HLADataElement::Path&) - { return _dataElement.get(); } - private: - SGSharedPtr _dataElement; - }; - - SGSharedPtr _provider; + SGSharedPtr _stamp; }; -typedef std::map HLAPathElementMap; -typedef std::map HLAAttributePathElementMap; - } #endif