]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGWeakPtr.hxx
canvas::Layout: support for contents margins.
[simgear.git] / simgear / structure / SGWeakPtr.hxx
index c84ae371d59d5b2123908d00bcf2124b0ca018e5..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)
   { }
+  SGWeakPtr(T* ptr)
+  { 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()); }
@@ -38,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)
@@ -54,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); }