X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fhla%2FHLADataElement.hxx;h=7ee817ed6304b2f7c8cc3f1eec8cd7f5968fc1d2;hb=2c1fbd558b355cbe9f8902962cbeb492915236f3;hp=0cb14e615991ac785fae8def5dc4f864059d50ff;hpb=a07ca86207108af66ca3335e4fcc11935c5ef079;p=simgear.git diff --git a/simgear/hla/HLADataElement.hxx b/simgear/hla/HLADataElement.hxx index 0cb14e61..7ee817ed 100644 --- a/simgear/hla/HLADataElement.hxx +++ b/simgear/hla/HLADataElement.hxx @@ -25,6 +25,7 @@ #include #include "RTIData.hxx" #include "HLADataType.hxx" +#include "HLATypes.hxx" class SGTimeStamp; @@ -46,6 +47,17 @@ public: 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 @@ -71,94 +83,6 @@ public: void attachStamp(HLADataElement& dataElement); void clearStamp(); - /// 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 { - 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); } - - 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 StringPathPair; - typedef StringPathPair AttributePathPair; // deprecated - typedef std::pair IndexPathPair; - - static std::string toString(const Path& path); - static std::string toString(const StringPathPair& path) - { return path.first + toString(path.second); } - static StringPathPair toStringPathPair(const std::string& s); - static AttributePathPair toAttributePathPair(const std::string& s) // deprecated - { return toStringPathPair(s); } - static Path toPath(const std::string& s) - { return toStringPathPair(s).second; } - protected: // Container for the timestamp the originating attribute was last updated for class Stamp : public SGReferenced { @@ -197,60 +121,6 @@ private: SGSharedPtr _stamp; }; -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(); - // } - }; - - 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); - } - -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; -}; - -typedef std::map HLAPathElementMap; -typedef std::map HLAAttributePathElementMap; - } #endif