]> git.mxchange.org Git - simgear.git/blobdiff - simgear/hla/HLADataElement.hxx
hla: Fixes for the data element index implementation.
[simgear.git] / simgear / hla / HLADataElement.hxx
index 35613d069b0784982912b84bb29deb0effbd20fd..ffbaf5df8dade297be8249e6bd569358d9a29cfd 100644 (file)
@@ -25,6 +25,7 @@
 #include <simgear/timing/timestamp.hxx>
 #include "RTIData.hxx"
 #include "HLADataType.hxx"
+#include "HLATypes.hxx"
 
 class SGTimeStamp;
 
@@ -46,34 +47,41 @@ public:
     virtual const HLADataType* getDataType() const = 0;
     virtual bool setDataType(const HLADataType* dataType) = 0;
 
-    // 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> _changeCount;
-    // unsigned getChangeCount() const
-    // {
-    //     // If we don't have return allways the same
-    //     if (!_changeCount.valid())
-    //         return 0;
-    //     return _changeCount->_value;
-    // }
+    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();
 
     /// HLADataElements could be identified by path
     /// These paths are composed of structure field names and array indices in the
@@ -151,20 +159,51 @@ public:
     };
     typedef std::list<PathElement> Path;
     typedef std::pair<std::string, Path> StringPathPair;
-    typedef StringPathPair AttributePathPair; // deprecated
     typedef std::pair<unsigned, Path> 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 {
+    public:
+        Stamp() : _timeStampValid(false), _dirty(true)
+        { }
+
+        const SGTimeStamp& getTimeStamp() const
+        { return _timeStamp; }
+        void setTimeStamp(const SGTimeStamp& timeStamp)
+        { _timeStamp = timeStamp; }
+
+        bool getTimeStampValid() const
+        { return _timeStampValid; }
+        void setTimeStampValid(bool timeStampValid)
+        { _timeStampValid = timeStampValid; }
+
+        bool getDirty() const
+        { return _dirty; }
+        void setDirty(bool dirty)
+        { _dirty = dirty; }
+
+    private:
+        SGTimeStamp _timeStamp;
+        bool _timeStampValid;
+        bool _dirty;
+    };
+
+    /// get the stamp
+    Stamp* _getStamp() const
+    { return _stamp.get(); }
+    /// Set the stamp
+    virtual void _setStamp(Stamp* stamp);
+
 private:
-    // SGSharedPtr<const TimeStamp> _timeStamp;
+    SGSharedPtr<Stamp> _stamp;
 };
 
 class HLADataElementProvider {