summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDaniel Robertson <danlrobertson89@gmail.com>2015-08-27 16:27:33 -0400
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2015-08-30 12:55:17 +0000
commitc1a9d0139112d7489ca6dd29b18f9418c6da3085 (patch)
tree0794adc048b5d2cacd04c9a896f9b295b5ebabf9 /tools
parentd11715c4c67be4a991cc9fee72ae1c015eac3745 (diff)
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.Behrens@CIB.de> Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'tools')
-rw-r--r--tools/source/ref/globname.cxx90
1 files changed, 31 insertions, 59 deletions
diff --git a/tools/source/ref/globname.cxx b/tools/source/ref/globname.cxx
index fe9604821aec..b11e21f42508 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: */