]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGWeakPtr.hxx
Fix #1783: repeated error message on console
[simgear.git] / simgear / structure / SGWeakPtr.hxx
index 78cfab4a2507d765d3af9329dc9042ac7eb6fa31..95e6792e1fed2878c35e39da7fdede1e6e314da0 100644 (file)
 
 #include "SGWeakReferenced.hxx"
 
+/**
+ * Class for handling weak references to classes derived from SGWeakReferenced
+ * or SGVirtualWeakReferenced.
+ */
 template<typename T>
 class SGWeakPtr {
 public:
+  typedef T element_type;
+
   SGWeakPtr(void)
   { }
   SGWeakPtr(const SGWeakPtr& p) : mWeakData(p.mWeakData)
@@ -31,7 +37,7 @@ public:
   { assign(ptr); }
   template<typename U>
   SGWeakPtr(const SGSharedPtr<U>& p)
-  { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); }
+  { assign(p.get()); }
   template<typename U>
   SGWeakPtr(const SGWeakPtr<U>& p)
   { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); }
@@ -40,13 +46,23 @@ public:
   
   template<typename U>
   SGWeakPtr& operator=(const SGSharedPtr<U>& p)
-  { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); return *this; }
+  { assign(p.get()); return *this; }
   template<typename U>
   SGWeakPtr& operator=(const SGWeakPtr<U>& p)
   { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); return *this; }
   SGWeakPtr& operator=(const SGWeakPtr& p)
   { mWeakData = p.mWeakData; return *this; }
 
+  template<typename U>
+  bool operator==(const SGWeakPtr<U>& rhs) const
+  { return mWeakData == rhs.mWeakData; }
+  template<typename U>
+  bool operator!=(const SGWeakPtr<U>& rhs) const
+  { return mWeakData != rhs.mWeakData; }
+  template<typename U>
+  bool operator<(const SGWeakPtr<U>& rhs) const
+  { return mWeakData < rhs.mWeakData; }
+
   SGSharedPtr<T> lock(void) const
   {
     if (!mWeakData)
@@ -56,8 +72,13 @@ public:
     return sharedPtr;
   }
 
+  bool expired() const
+  { return !mWeakData || mWeakData->mRefcount == 0; }
+
+  void reset()
+  { mWeakData.reset(); }
   void clear()
-  { mWeakData = 0; }
+  { mWeakData.reset(); }
   void swap(SGWeakPtr& weakPtr)
   { mWeakData.swap(weakPtr.mWeakData); }