[PATCH] Proof of concept - conversion operator for uno::Reference
Thorsten Behrens (via Code Review)
gerrit at gerrit.libreoffice.org
Tue Apr 30 08:49:07 PDT 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/3698
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/98/3698/1
Proof of concept - conversion operator for uno::Reference
Change-Id: I589b57c0a54524460fc8518a456dc09797c3567a
---
M include/com/sun/star/uno/Reference.h
M include/com/sun/star/uno/Reference.hxx
2 files changed, 56 insertions(+), 5 deletions(-)
diff --git a/include/com/sun/star/uno/Reference.h b/include/com/sun/star/uno/Reference.h
index 94551a0..2b776b8 100644
--- a/include/com/sun/star/uno/Reference.h
+++ b/include/com/sun/star/uno/Reference.h
@@ -19,6 +19,8 @@
#ifndef _COM_SUN_STAR_UNO_REFERENCE_H_
#define _COM_SUN_STAR_UNO_REFERENCE_H_
+#include <boost/config.hpp> // for BOOST_NO_MEMBER_TEMPLATE_FRIENDS macro
+
#include <rtl/alloc.h>
@@ -54,10 +56,6 @@
class BaseReference
{
protected:
- /** the interface pointer
- */
- XInterface * _pInterface;
-
/** Queries given interface for type rType.
@param pInterface interface pointer
@@ -77,6 +75,19 @@
inline static XInterface * SAL_CALL iquery_throw( XInterface * pInterface, const Type & rType )
SAL_THROW( (RuntimeException) );
#endif
+
+// if member template friends don't work, make protected _pInterface
+// public, to allow template copy constructor from Reference to access
+// them.
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+ template<typename T> friend class Reference;
+#else
+public:
+#endif
+
+ /** the interface pointer
+ */
+ XInterface * _pInterface;
public:
/** Gets interface pointer. This call does not acquire the interface.
@@ -332,6 +343,15 @@
inline Reference( interface_type * pInterface, UnoReference_SetThrow dummy ) SAL_THROW( (RuntimeException) );
#endif
+ /* Constructor: copy-construct from derived interface
+
+ @param rRef
+ Interface reference that must be convertible to interface_type
+ (typically, this implies that interface_type is a basetype of
+ the passed type)
+ */
+ template< class Ifc > inline Reference( const Reference<Ifc>& rRef );
+
/** Cast operator to Reference< XInterface >: Reference objects are binary compatible and
any interface must be derived from com.sun.star.uno.XInterface.
This a useful direct cast possibility.
@@ -485,6 +505,18 @@
*/
inline Reference< interface_type > & SAL_CALL operator = ( const Reference< interface_type > & rRef ) SAL_THROW(());
+ /** Assignment operator for derived interfaces: Acquires given
+ interface reference and sets reference. An interface already
+ set will be released.
+
+ @param rRef
+ Interface reference that must be convertible to interface_type
+ (typically, this implies that interface_type is a basetype of
+ the passed type)
+ */
+ template< class Ifc >
+ inline Reference< interface_type > & SAL_CALL operator = ( const Reference<Ifc>& rRef );
+
/** Queries given interface reference for type interface_type.
@param rRef interface reference
diff --git a/include/com/sun/star/uno/Reference.hxx b/include/com/sun/star/uno/Reference.hxx
index aa39810..9b84809 100644
--- a/include/com/sun/star/uno/Reference.hxx
+++ b/include/com/sun/star/uno/Reference.hxx
@@ -193,7 +193,16 @@
_pInterface = castToXInterface( iset_throw( pInterface ) );
}
#endif
-
+//__________________________________________________________________________________________________
+template< class interface_type >
+template< class Ifc >
+inline Reference< interface_type >::Reference( const Reference<Ifc>& rRef )
+{
+ interface_type* pTmp = reinterpret_cast< Ifc* >(rRef._pInterface);
+ _pInterface = pTmp;
+ if (_pInterface)
+ _pInterface->acquire();
+}
//__________________________________________________________________________________________________
template< class interface_type >
inline void Reference< interface_type >::clear() SAL_THROW(())
@@ -332,6 +341,16 @@
set( castFromXInterface( rRef._pInterface ) );
return *this;
}
+//__________________________________________________________________________________________________
+template< class interface_type >
+template< class Ifc >
+inline Reference< interface_type > & Reference< interface_type >::operator = (
+ const Reference<Ifc>& rRef )
+{
+ interface_type* pTmp = reinterpret_cast< Ifc* >(rRef._pInterface);
+ set( pTmp );
+ return *this;
+}
//__________________________________________________________________________________________________
template< class interface_type >
--
To view, visit https://gerrit.libreoffice.org/3698
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I589b57c0a54524460fc8518a456dc09797c3567a
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Thorsten Behrens <tbehrens at suse.com>
More information about the LibreOffice
mailing list