diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-08-14 10:28:36 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-08-14 11:17:26 -0400 |
commit | af246f94554e646880ffcdfc83f6163fdff1fef5 (patch) | |
tree | ab1ac66d09861e298d551d81e1b6497d2b6a6334 /editeng/source | |
parent | e12d21fee9471ca1c4546b23df475aa39c953e13 (diff) |
Apply a simple pimpl idiom and rename the old Impl to make it non-Impl.
The old Impl instance is ref-counted, which I'd like to convert to using
boost::intrusive_ptr. But to make it happen, we need to really hide this
from public header...
Change-Id: I1f1e9e500f2112eea04e3e6d661a7dfa74655c62
Diffstat (limited to 'editeng/source')
-rw-r--r-- | editeng/source/outliner/outlobj.cxx | 134 |
1 files changed, 74 insertions, 60 deletions
diff --git a/editeng/source/outliner/outlobj.cxx b/editeng/source/outliner/outlobj.cxx index 077d567889d9..d4aee9d6dfa8 100644 --- a/editeng/source/outliner/outlobj.cxx +++ b/editeng/source/outliner/outlobj.cxx @@ -32,9 +32,11 @@ #include <vcl/bitmap.hxx> #include <tools/stream.hxx> - - -class ImplOutlinerParaObject +/** + * This is the guts of OutlinerParaObject, refcounted and shared among + * multiple instances of OutlinerParaObject. + */ +class OutlinerParaObjData { public: // data members @@ -46,7 +48,7 @@ public: sal_uInt32 mnRefCount; // constuctor - ImplOutlinerParaObject(EditTextObject* pEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc) + OutlinerParaObjData(EditTextObject* pEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc) : mpEditTextObject(pEditTextObject), maParagraphDataVector(rParagraphDataVector), mbIsEditDoc(bIsEditDoc), @@ -57,12 +59,12 @@ public: } // destructor - ~ImplOutlinerParaObject() + ~OutlinerParaObjData() { delete mpEditTextObject; } - bool operator==(const ImplOutlinerParaObject& rCandidate) const + bool operator==(const OutlinerParaObjData& rCandidate) const { return (*mpEditTextObject == *rCandidate.mpEditTextObject && maParagraphDataVector == rCandidate.maParagraphDataVector @@ -70,69 +72,81 @@ public: } // #i102062# - bool isWrongListEqual(const ImplOutlinerParaObject& rCompare) const + bool isWrongListEqual(const OutlinerParaObjData& rCompare) const { return mpEditTextObject->isWrongListEqual(*rCompare.mpEditTextObject); } }; +struct OutlinerParaObject::Impl +{ + OutlinerParaObjData* mpData; + Impl( const EditTextObject& rTextObj, const ParagraphDataVector& rParaData, bool bIsEditDoc ) : + mpData(new OutlinerParaObjData(rTextObj.Clone(), rParaData, bIsEditDoc)) {} -void OutlinerParaObject::ImplMakeUnique() -{ - if(mpImplOutlinerParaObject->mnRefCount) + Impl( const EditTextObject& rTextObj ) : + mpData(new OutlinerParaObjData(rTextObj.Clone(), ParagraphDataVector(), true)) {} + + Impl( const Impl& r ) : mpData(r.mpData) { - ImplOutlinerParaObject* pNew = new ImplOutlinerParaObject( - mpImplOutlinerParaObject->mpEditTextObject->Clone(), - mpImplOutlinerParaObject->maParagraphDataVector, - mpImplOutlinerParaObject->mbIsEditDoc); - mpImplOutlinerParaObject->mnRefCount--; - mpImplOutlinerParaObject = pNew; + mpData->mnRefCount++; } -} -OutlinerParaObject::OutlinerParaObject(const EditTextObject& rEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc) -: mpImplOutlinerParaObject(new ImplOutlinerParaObject(rEditTextObject.Clone(), rParagraphDataVector, bIsEditDoc)) + ~Impl() + { + if (mpData->mnRefCount) + mpData->mnRefCount--; + else + delete mpData; + } +}; + +void OutlinerParaObject::ImplMakeUnique() { + if (mpImpl->mpData->mnRefCount) + { + OutlinerParaObjData* pNew = new OutlinerParaObjData( + mpImpl->mpData->mpEditTextObject->Clone(), + mpImpl->mpData->maParagraphDataVector, + mpImpl->mpData->mbIsEditDoc); + mpImpl->mpData->mnRefCount--; + mpImpl->mpData = pNew; + } } -OutlinerParaObject::OutlinerParaObject( const EditTextObject& rEditTextObject) -: mpImplOutlinerParaObject( new ImplOutlinerParaObject( rEditTextObject.Clone(), ParagraphDataVector(), true)) -{} +OutlinerParaObject::OutlinerParaObject( + const EditTextObject& rTextObj, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc ) : + mpImpl(new Impl(rTextObj, rParagraphDataVector, bIsEditDoc)) {} -OutlinerParaObject::OutlinerParaObject(const OutlinerParaObject& rCandidate) -: mpImplOutlinerParaObject(rCandidate.mpImplOutlinerParaObject) +OutlinerParaObject::OutlinerParaObject( const EditTextObject& rTextObj ) : + mpImpl(new Impl(rTextObj)) { - mpImplOutlinerParaObject->mnRefCount++; } +OutlinerParaObject::OutlinerParaObject(const OutlinerParaObject& rCandidate) : + mpImpl(new Impl(*rCandidate.mpImpl)) {} + OutlinerParaObject::~OutlinerParaObject() { - if(mpImplOutlinerParaObject->mnRefCount) - { - mpImplOutlinerParaObject->mnRefCount--; - } - else - { - delete mpImplOutlinerParaObject; - } + delete mpImpl; } OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCandidate) { - if(rCandidate.mpImplOutlinerParaObject != mpImplOutlinerParaObject) + if(rCandidate.mpImpl->mpData != mpImpl->mpData) { - if(mpImplOutlinerParaObject->mnRefCount) + if (mpImpl->mpData->mnRefCount) { - mpImplOutlinerParaObject->mnRefCount--; + mpImpl->mpData->mnRefCount--; } else { - delete mpImplOutlinerParaObject; + delete mpImpl->mpData; } - mpImplOutlinerParaObject = rCandidate.mpImplOutlinerParaObject; - mpImplOutlinerParaObject->mnRefCount++; + mpImpl->mpData = rCandidate.mpImpl->mpData; + mpImpl->mpData->mnRefCount++; } return *this; @@ -140,56 +154,56 @@ OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCan bool OutlinerParaObject::operator==(const OutlinerParaObject& rCandidate) const { - if(rCandidate.mpImplOutlinerParaObject == mpImplOutlinerParaObject) + if (rCandidate.mpImpl->mpData == mpImpl->mpData) { return true; } - return (*rCandidate.mpImplOutlinerParaObject == *mpImplOutlinerParaObject); + return (*rCandidate.mpImpl->mpData == *mpImpl->mpData); } // #i102062# bool OutlinerParaObject::isWrongListEqual(const OutlinerParaObject& rCompare) const { - if(rCompare.mpImplOutlinerParaObject == mpImplOutlinerParaObject) + if (rCompare.mpImpl->mpData == mpImpl->mpData) { return true; } - return mpImplOutlinerParaObject->isWrongListEqual(*rCompare.mpImplOutlinerParaObject); + return mpImpl->mpData->isWrongListEqual(*rCompare.mpImpl->mpData); } sal_uInt16 OutlinerParaObject::GetOutlinerMode() const { - return mpImplOutlinerParaObject->mpEditTextObject->GetUserType(); + return mpImpl->mpData->mpEditTextObject->GetUserType(); } void OutlinerParaObject::SetOutlinerMode(sal_uInt16 nNew) { - if(mpImplOutlinerParaObject->mpEditTextObject->GetUserType() != nNew) + if (mpImpl->mpData->mpEditTextObject->GetUserType() != nNew) { ImplMakeUnique(); - mpImplOutlinerParaObject->mpEditTextObject->SetUserType(nNew); + mpImpl->mpData->mpEditTextObject->SetUserType(nNew); } } bool OutlinerParaObject::IsVertical() const { - return mpImplOutlinerParaObject->mpEditTextObject->IsVertical(); + return mpImpl->mpData->mpEditTextObject->IsVertical(); } void OutlinerParaObject::SetVertical(bool bNew) { - if((bool)mpImplOutlinerParaObject->mpEditTextObject->IsVertical() != bNew) + if((bool)mpImpl->mpData->mpEditTextObject->IsVertical() != bNew) { ImplMakeUnique(); - mpImplOutlinerParaObject->mpEditTextObject->SetVertical(bNew); + mpImpl->mpData->mpEditTextObject->SetVertical(bNew); } } sal_Int32 OutlinerParaObject::Count() const { - size_t nSize = mpImplOutlinerParaObject->maParagraphDataVector.size(); + size_t nSize = mpImpl->mpData->maParagraphDataVector.size(); if (nSize > EE_PARA_MAX_COUNT) { SAL_WARN( "editeng", "OutlinerParaObject::Count - overflow " << nSize); @@ -200,9 +214,9 @@ sal_Int32 OutlinerParaObject::Count() const sal_Int16 OutlinerParaObject::GetDepth(sal_Int32 nPara) const { - if(0 <= nPara && static_cast<size_t>(nPara) < mpImplOutlinerParaObject->maParagraphDataVector.size()) + if(0 <= nPara && static_cast<size_t>(nPara) < mpImpl->mpData->maParagraphDataVector.size()) { - return mpImplOutlinerParaObject->maParagraphDataVector[nPara].getDepth(); + return mpImpl->mpData->maParagraphDataVector[nPara].getDepth(); } else { @@ -212,19 +226,19 @@ sal_Int16 OutlinerParaObject::GetDepth(sal_Int32 nPara) const const EditTextObject& OutlinerParaObject::GetTextObject() const { - return *mpImplOutlinerParaObject->mpEditTextObject; + return *mpImpl->mpData->mpEditTextObject; } bool OutlinerParaObject::IsEditDoc() const { - return mpImplOutlinerParaObject->mbIsEditDoc; + return mpImpl->mpData->mbIsEditDoc; } const ParagraphData& OutlinerParaObject::GetParagraphData(sal_Int32 nIndex) const { - if(0 <= nIndex && static_cast<size_t>(nIndex) < mpImplOutlinerParaObject->maParagraphDataVector.size()) + if(0 <= nIndex && static_cast<size_t>(nIndex) < mpImpl->mpData->maParagraphDataVector.size()) { - return mpImplOutlinerParaObject->maParagraphDataVector[nIndex]; + return mpImpl->mpData->maParagraphDataVector[nIndex]; } else { @@ -237,21 +251,21 @@ const ParagraphData& OutlinerParaObject::GetParagraphData(sal_Int32 nIndex) cons void OutlinerParaObject::ClearPortionInfo() { ImplMakeUnique(); - mpImplOutlinerParaObject->mpEditTextObject->ClearPortionInfo(); + mpImpl->mpData->mpEditTextObject->ClearPortionInfo(); } bool OutlinerParaObject::ChangeStyleSheets(const OUString& rOldName, SfxStyleFamily eOldFamily, const OUString& rNewName, SfxStyleFamily eNewFamily) { ImplMakeUnique(); - return mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheets(rOldName, eOldFamily, rNewName, eNewFamily); + return mpImpl->mpData->mpEditTextObject->ChangeStyleSheets(rOldName, eOldFamily, rNewName, eNewFamily); } void OutlinerParaObject::ChangeStyleSheetName(SfxStyleFamily eFamily, const OUString& rOldName, const OUString& rNewName) { ImplMakeUnique(); - mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheetName(eFamily, rOldName, rNewName); + mpImpl->mpData->mpEditTextObject->ChangeStyleSheetName(eFamily, rOldName, rNewName); } void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewName, @@ -268,7 +282,7 @@ void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewN { if(GetDepth(--nDecrementer) == nLevel) { - mpImplOutlinerParaObject->mpEditTextObject->SetStyleSheet(nDecrementer, rNewName, rNewFamily); + mpImpl->mpData->mpEditTextObject->SetStyleSheet(nDecrementer, rNewName, rNewFamily); } } } |