include/tools/globname.hxx | 60 ++++++++++++---------------- tools/source/ref/globname.cxx | 90 ++++++++++++++---------------------------- 2 files changed, 57 insertions(+), 93 deletions(-)
New commits: commit c1a9d0139112d7489ca6dd29b18f9418c6da3085 Author: Daniel Robertson <danlrobertso...@gmail.com> Date: Thu Aug 27 16:27:33 2015 -0400 tdf#62525: use cow_wrapper for SvGlobalName Convert the pimpled copy-on-write SvGlobalName class to use the ::o3tl::cow_wrapper using the default reference counting policy. Change-Id: I7bceb06ddfb31ca5901e5e7d5d93dda494db945f Reviewed-on: https://gerrit.libreoffice.org/18070 Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> Tested-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/include/tools/globname.hxx b/include/tools/globname.hxx index 6796c3b..42ff4f4 100644 --- a/include/tools/globname.hxx +++ b/include/tools/globname.hxx @@ -23,6 +23,7 @@ #include <tools/toolsdllapi.h> #include <com/sun/star/uno/Sequence.hxx> +#include <o3tl/cow_wrapper.hxx> struct SvGUID { @@ -35,20 +36,16 @@ struct SvGUID struct ImpSvGlobalName { struct SvGUID szData; - sal_uInt16 nRefCount; - enum Empty { EMPTY }; - - ImpSvGlobalName(const SvGUID &rData) - : szData(rData) - , nRefCount(0) - { - } - ImpSvGlobalName(sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, - sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, - sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15); - ImpSvGlobalName( const ImpSvGlobalName & rObj ); - ImpSvGlobalName( Empty ); + ImpSvGlobalName(const SvGUID &rData) + : szData(rData) + { + } + ImpSvGlobalName(sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, + sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, + sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15); + ImpSvGlobalName( const ImpSvGlobalName & rObj ); + ImpSvGlobalName(); bool operator == ( const ImpSvGlobalName & rObj ) const; }; @@ -57,30 +54,26 @@ class SvStream; class TOOLS_DLLPUBLIC SvGlobalName { - ImpSvGlobalName * pImp; - void NewImp(); + ::o3tl::cow_wrapper< ImpSvGlobalName > pImp; public: - SvGlobalName(); - SvGlobalName( const SvGlobalName & rObj ) - { - pImp = rObj.pImp; - pImp->nRefCount++; - } - SvGlobalName( ImpSvGlobalName * pImpP ) - { - pImp = pImpP; - pImp->nRefCount++; - } - SvGlobalName( sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, - sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, - sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 ); - - // create SvGlobalName from a platform independent representation - SvGlobalName( const ::com::sun::star::uno::Sequence< sal_Int8 >& aSeq ); + SvGlobalName(); + SvGlobalName( const SvGlobalName & rObj ) : + pImp( rObj.pImp ) + { + } + + SvGlobalName( sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, + sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, + sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 ); + + // create SvGlobalName from a platform independent representation + SvGlobalName( const ::com::sun::star::uno::Sequence< sal_Int8 >& aSeq ); + + SvGlobalName( const SvGUID & rId ); SvGlobalName & operator = ( const SvGlobalName & rObj ); - ~SvGlobalName(); + ~SvGlobalName(); TOOLS_DLLPUBLIC friend SvStream & operator >> ( SvStream &, SvGlobalName & ); TOOLS_DLLPUBLIC friend SvStream & WriteSvGlobalName( SvStream &, const SvGlobalName & ); @@ -97,7 +90,6 @@ public: bool MakeId( const OUString & rId ); OUString GetHexName() const; - SvGlobalName( const SvGUID & rId ); const SvGUID& GetCLSID() const { return pImp->szData; } // platform independent representation of a "GlobalName" diff --git a/tools/source/ref/globname.cxx b/tools/source/ref/globname.cxx index fe96048..b11e21f 100644 --- a/tools/source/ref/globname.cxx +++ b/tools/source/ref/globname.cxx @@ -27,22 +27,19 @@ #include <tools/globname.hxx> // ImpSvGlobalName ------------------------------------------------------------ -ImpSvGlobalName::ImpSvGlobalName( const ImpSvGlobalName & rObj ) - : szData(rObj.szData) - , nRefCount(0) +ImpSvGlobalName::ImpSvGlobalName() { + memset( &szData, 0, sizeof( szData ) ); } -ImpSvGlobalName::ImpSvGlobalName( Empty ) - : nRefCount(1) +ImpSvGlobalName::ImpSvGlobalName( const ImpSvGlobalName & rObj ) + : szData(rObj.szData) { - memset( &szData, 0, sizeof( szData ) ); } ImpSvGlobalName::ImpSvGlobalName(sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15) - : nRefCount(0) { szData.Data1 = n1; szData.Data2 = n2; @@ -63,53 +60,49 @@ bool ImpSvGlobalName::operator == ( const ImpSvGlobalName & rObj ) const } // SvGlobalName ---------------------------------------------------------------- -SvGlobalName::SvGlobalName() +SvGlobalName::SvGlobalName() : + pImp() { - static ImpSvGlobalName aNoName( ImpSvGlobalName::EMPTY ); - - pImp = &aNoName; - pImp->nRefCount++; } -SvGlobalName::SvGlobalName( const SvGUID & rId ) +SvGlobalName::SvGlobalName( const SvGUID & rId ) : + pImp( ImpSvGlobalName( rId ) ) { - pImp = new ImpSvGlobalName(rId); - pImp->nRefCount++; } SvGlobalName::SvGlobalName( sal_uInt32 n1, sal_uInt16 n2, sal_uInt16 n3, sal_uInt8 b8, sal_uInt8 b9, sal_uInt8 b10, sal_uInt8 b11, - sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 ) + sal_uInt8 b12, sal_uInt8 b13, sal_uInt8 b14, sal_uInt8 b15 ) : + pImp( ImpSvGlobalName(n1, n2, n3, b8, b9, b10, b11, b12, b13, b14, b15) ) +{ +} + +SvGlobalName::SvGlobalName( const com::sun::star::uno::Sequence < sal_Int8 >& aSeq ) { - pImp = new ImpSvGlobalName(n1, n2, n3, b8, b9, b10, b11, b12, b13, b14, b15); - pImp->nRefCount++; + // create SvGlobalName from a platform independent representation + SvGUID aResult; + memset( &aResult, 0, sizeof( aResult ) ); + if ( aSeq.getLength() == 16 ) + { + aResult.Data1 = ( ( ( ( ( ( sal_uInt8 )aSeq[0] << 8 ) + ( sal_uInt8 )aSeq[1] ) << 8 ) + ( sal_uInt8 )aSeq[2] ) << 8 ) + ( sal_uInt8 )aSeq[3]; + aResult.Data2 = ( ( sal_uInt8 )aSeq[4] << 8 ) + ( sal_uInt8 )aSeq[5]; + aResult.Data3 = ( ( sal_uInt8 )aSeq[6] << 8 ) + ( sal_uInt8 )aSeq[7]; + for( int nInd = 0; nInd < 8; nInd++ ) + aResult.Data4[nInd] = ( sal_uInt8 )aSeq[nInd+8]; + } + + pImp = ::o3tl::cow_wrapper< ImpSvGlobalName >(aResult); } SvGlobalName::~SvGlobalName() { - pImp->nRefCount--; - if( !pImp->nRefCount ) - delete pImp; } SvGlobalName & SvGlobalName::operator = ( const SvGlobalName & rObj ) { - rObj.pImp->nRefCount++; - pImp->nRefCount--; - if( !pImp->nRefCount ) - delete pImp; pImp = rObj.pImp; - return *this; -} -void SvGlobalName::NewImp() -{ - if( pImp->nRefCount > 1 ) - { - pImp->nRefCount--; - pImp = new ImpSvGlobalName( *pImp ); - pImp->nRefCount++; - } + return *this; } SvStream& WriteSvGlobalName( SvStream& rOStr, const SvGlobalName & rObj ) @@ -123,7 +116,8 @@ SvStream& WriteSvGlobalName( SvStream& rOStr, const SvGlobalName & rObj ) SvStream& operator >> ( SvStream& rStr, SvGlobalName & rObj ) { - rObj.NewImp(); // copy if necessary + // the non-const dereferencing operator + // ensures pImp is unique rStr.ReadUInt32( rObj.pImp->szData.Data1 ); rStr.ReadUInt16( rObj.pImp->szData.Data2 ); rStr.ReadUInt16( rObj.pImp->szData.Data3 ); @@ -149,8 +143,6 @@ bool SvGlobalName::operator < ( const SvGlobalName & rObj ) const SvGlobalName & SvGlobalName::operator += ( sal_uInt32 n ) { - NewImp(); - sal_uInt32 nOld = pImp->szData.Data1; pImp->szData.Data1 += n; @@ -164,12 +156,11 @@ SvGlobalName & SvGlobalName::operator += ( sal_uInt32 n ) bool SvGlobalName::operator == ( const SvGlobalName & rObj ) const { - return *pImp == *rObj.pImp; + return pImp == rObj.pImp; } void SvGlobalName::MakeFromMemory( void * pData ) { - NewImp(); memcpy( &pImp->szData, pData, sizeof( pImp->szData ) ); } @@ -241,7 +232,6 @@ bool SvGlobalName::MakeId( const OUString & rIdStr ) pStr++; } - NewImp(); memcpy(&pImp->szData.Data1, &nFirst, sizeof(nFirst)); memcpy(&pImp->szData.Data2, &nSec, sizeof(nSec)); memcpy(&pImp->szData.Data3, &nThird, sizeof(nThird)); @@ -305,22 +295,4 @@ com::sun::star::uno::Sequence < sal_Int8 > SvGlobalName::GetByteSequence() const return aResult; } -SvGlobalName::SvGlobalName( const com::sun::star::uno::Sequence < sal_Int8 >& aSeq ) -{ - // create SvGlobalName from a platform independent representation - SvGUID aResult; - memset( &aResult, 0, sizeof( aResult ) ); - if ( aSeq.getLength() == 16 ) - { - aResult.Data1 = ( ( ( ( ( ( sal_uInt8 )aSeq[0] << 8 ) + ( sal_uInt8 )aSeq[1] ) << 8 ) + ( sal_uInt8 )aSeq[2] ) << 8 ) + ( sal_uInt8 )aSeq[3]; - aResult.Data2 = ( ( sal_uInt8 )aSeq[4] << 8 ) + ( sal_uInt8 )aSeq[5]; - aResult.Data3 = ( ( sal_uInt8 )aSeq[6] << 8 ) + ( sal_uInt8 )aSeq[7]; - for( int nInd = 0; nInd < 8; nInd++ ) - aResult.Data4[nInd] = ( sal_uInt8 )aSeq[nInd+8]; - } - - pImp = new ImpSvGlobalName(aResult); - pImp->nRefCount++; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits