Fix RW_pointer comparison with underlying smart pointer type.
authorMichael Andres <ma@suse.de>
Tue, 15 Nov 2011 12:36:17 +0000 (13:36 +0100)
committerMichael Andres <ma@suse.de>
Tue, 15 Nov 2011 12:36:17 +0000 (13:36 +0100)
tests/zypp/CMakeLists.txt
tests/zypp/PtrTypes_test.cc
zypp/base/PtrTypes.h

index 2154389..99dc71e 100644 (file)
@@ -24,6 +24,7 @@ ADD_TESTS(
   PluginFrame
   PoolQuery
   ProgressData
+  PtrTypes
   PublicKey
   RWPtr
   RepoInfo
index a2d9427..3a6d12e 100644 (file)
@@ -50,6 +50,7 @@ namespace zypp
     { return new Intrusive( *rhs ); }
 
 }
+
 /******************************************************************
 **
 */
@@ -57,8 +58,9 @@ namespace zypp
 #define T_NOT_NULL   assert( ptr )
 #define T_UNIQUE     assert( ptr.unique() ); assert( ptr.use_count() < 2 )
 #define T_NOT_UNIQUE assert( !ptr.unique() ); assert( ptr.use_count() >= 2 )
-#define T_EQ(a,b)   assert( a == b )
-#define T_NE(a,b)   assert( a != b )
+// Also comapre with underlying shared ptr type.
+#define T_EQ(a,b)   assert( a == b ); assert( a == b.cgetPtr() ); assert( a.cgetPtr() == b ); assert( a.cgetPtr() == b.cgetPtr() );
+#define T_NE(a,b)   assert( a != b ); assert( a != b.cgetPtr() ); assert( a.cgetPtr() != b ); assert( a.cgetPtr() != b.cgetPtr() );
 
 template<class _RW>
   void test()
index 8af6174..452c483 100644 (file)
@@ -324,6 +324,9 @@ namespace zypp
         _Ptr getPtr()
         { return _dptr; }
 
+        _constPtr cgetPtr()
+        { return _dptr; }
+
       private:
         _Ptr _dptr;
       };
@@ -335,8 +338,7 @@ namespace zypp
      * if the pointer is \c NULL.
     */
     template<class _D, class _Ptr>
-      inline std::ostream &
-      operator<<( std::ostream & str, const RW_pointer<_D, _Ptr> & obj )
+      inline std::ostream & operator<<( std::ostream & str, const RW_pointer<_D, _Ptr> & obj )
       {
         if ( obj.get() )
           return str << *obj.get();
@@ -345,19 +347,46 @@ namespace zypp
 
     /** \relates RW_pointer */
     template<class _D, class _Ptr>
-      inline bool
-      operator==( const RW_pointer<_D, _Ptr> & lhs, const RW_pointer<_D, _Ptr> & rhs )
-      {
-        return( lhs.get() == rhs.get() );
-      }
+      inline bool operator==( const RW_pointer<_D, _Ptr> & lhs, const RW_pointer<_D, _Ptr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator==( const RW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_Ptr & rhs )
+       { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator==( const typename _Ptr::_Ptr & lhs, const RW_pointer<_D, _Ptr> & rhs )
+       { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator==( const RW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_constPtr & rhs )
+       { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator==( const typename _Ptr::_constPtr & lhs, const RW_pointer<_D, _Ptr> & rhs )
+       { return( lhs.get() == rhs.get() ); }
+
 
     /** \relates RW_pointer */
     template<class _D, class _Ptr>
-      inline bool
-      operator!=( const RW_pointer<_D, _Ptr> & lhs, const RW_pointer<_D, _Ptr> & rhs )
-      {
-        return ! ( lhs == rhs );
-      }
+      inline bool operator!=( const RW_pointer<_D, _Ptr> & lhs, const RW_pointer<_D, _Ptr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator!=( const RW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_Ptr & rhs )
+       { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator!=( const typename _Ptr::_Ptr & lhs, const RW_pointer<_D, _Ptr> & rhs )
+       { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator!=( const RW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_constPtr & rhs )
+       { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+     template<class _D, class _Ptr>
+       inline bool operator!=( const typename _Ptr::_constPtr & lhs, const RW_pointer<_D, _Ptr> & rhs )
+       { return ! ( lhs == rhs ); }
 
     ///////////////////////////////////////////////////////////////////
 
@@ -435,6 +464,9 @@ namespace zypp
         _Ptr getPtr()
         { assertUnshared(); return _dptr; }
 
+        _constPtr cgetPtr()
+        { return _dptr; }
+
       private:
 
         void assertUnshared()
@@ -465,8 +497,7 @@ namespace zypp
      * if the pointer is \c NULL.
     */
     template<class _D, class _Ptr>
-      inline std::ostream &
-      operator<<( std::ostream & str, const RWCOW_pointer<_D, _Ptr> & obj )
+      inline std::ostream & operator<<( std::ostream & str, const RWCOW_pointer<_D, _Ptr> & obj )
       {
         if ( obj.get() )
           return str << *obj.get();
@@ -475,19 +506,45 @@ namespace zypp
 
     /** \relates RWCOW_pointer */
     template<class _D, class _Ptr>
-      inline bool
-      operator==( const RWCOW_pointer<_D, _Ptr> & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
-      {
-        return( lhs.get() == rhs.get() );
-      }
+      inline bool operator==( const RWCOW_pointer<_D, _Ptr> & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator==( const RWCOW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_Ptr & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator==( const typename _Ptr::_Ptr & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator==( const RWCOW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_constPtr & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator==( const typename _Ptr::_constPtr & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
 
     /** \relates RWCOW_pointer */
     template<class _D, class _Ptr>
-      inline bool
-      operator!=( const RWCOW_pointer<_D, _Ptr> & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
-      {
-        return ! ( lhs == rhs );
-      }
+      inline bool operator!=( const RWCOW_pointer<_D, _Ptr> & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator!=( const RWCOW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_Ptr & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator!=( const typename _Ptr::_Ptr & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator!=( const RWCOW_pointer<_D, _Ptr> & lhs, const typename _Ptr::_constPtr & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class _D, class _Ptr>
+      inline bool operator!=( const typename _Ptr::_constPtr & lhs, const RWCOW_pointer<_D, _Ptr> & rhs )
+      { return ! ( lhs == rhs ); }
 
     ///////////////////////////////////////////////////////////////////