diff options
author | Armin Le Grand <Armin.Le.Grand@me.com> | 2019-05-14 10:18:53 +0200 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@me.com> | 2019-05-14 10:18:53 +0200 |
commit | 61e538cd9c5c04f9311fe6f67203adbdde00a7aa (patch) | |
tree | b9ebf4e3e798dc3015f54bab3db4b18aaaddb426 | |
parent | WIP: Continued Item stuff changes (diff) | |
download | core-61e538cd9c5c04f9311fe6f67203adbdde00a7aa.tar.gz core-61e538cd9c5c04f9311fe6f67203adbdde00a7aa.zip |
WIP: Change Item class for rtl::OUString to shared
Checked in debugger if nowadays rtl::OUString is shared
at runtime office-wide, but that is not the case. Thus
adapted the basic Item:: class for all rtl::OUString
based Itens to use ItemBuffered and to share the instances
of strings. That will in the future be office-wide during
runtime and for all derived classes
Change-Id: Iaebadc9f15edc94c5f156721b0defce15fbc2713
-rw-r--r-- | include/item/simple/CntInt16.hxx | 2 | ||||
-rw-r--r-- | include/item/simple/CntOUString.hxx | 38 | ||||
-rw-r--r-- | item/source/simple/CntOUString.cxx | 56 | ||||
-rw-r--r-- | item/test/ItemTest.cxx | 12 |
4 files changed, 94 insertions, 14 deletions
diff --git a/include/item/simple/CntInt16.hxx b/include/item/simple/CntInt16.hxx index a1bd7b51c91a..164e2afe85d9 100644 --- a/include/item/simple/CntInt16.hxx +++ b/include/item/simple/CntInt16.hxx @@ -36,7 +36,7 @@ namespace Item virtual bool operator==(const ItemBase&) const; sal_Int16 getValue() const { return m_nValue; } - void putValue(sal_Int16 nNew) { m_nValue = nNew; } + void setValue(sal_Int16 nNew) { m_nValue = nNew; } virtual bool getPresentation( SfxItemPresentation, diff --git a/include/item/simple/CntOUString.hxx b/include/item/simple/CntOUString.hxx index 9f72ee5e25f6..87cea1749d34 100644 --- a/include/item/simple/CntOUString.hxx +++ b/include/item/simple/CntOUString.hxx @@ -10,7 +10,7 @@ #ifndef INCLUDED_ITEM_SIMPLE_CNTOUSTRING_HXX #define INCLUDED_ITEM_SIMPLE_CNTOUSTRING_HXX -#include <item/base/ItemBase.hxx> +#include <item/base/ItemBuffered.hxx> #include <rtl/ustring.hxx> /////////////////////////////////////////////////////////////////////////////// @@ -21,11 +21,33 @@ namespace Item // this is a helper base class, so it has *no* method // static ItemControlBlock& GetStaticItemControlBlock(); // and also no public constructor (!), but implements all the - // tooling methods for Items using a sal_Int16 internally - class ITEM_DLLPUBLIC CntOUString : public ItemBase + // tooling methods for Items using a sal_Int16 internally. + // I checked if rtl::OUString nowadays already does some + // office-wide runtime matching and buffering to hold the + // string data only once, but this is not the case. Construction + // is optimized, but no shared data usage. Thus, use ItemBuffered + // as base class and implement shared ItemData for rtl::OUString + // here now to always only have one instance for CntOUString-based + // derivations. This will use ItemAdministrator_set, see *.cxx + // for details + class ITEM_DLLPUBLIC CntOUString : public ItemBuffered { - private: - rtl::OUString m_aValue; + protected: + // ItemData class for ref-counted rtl::OUString instances + class CntOUString_Data : public ItemData + { + private: + rtl::OUString m_aValue; + + protected: + virtual ItemAdministrator& getItemAdministrator() const override; + + public: + CntOUString_Data(const rtl::OUString& rValue = rtl::OUString()); + virtual bool operator==(const ItemData& rRef) const override; + const rtl::OUString& getValue() const { return m_aValue; } + void setValue(const rtl::OUString& rValue) { m_aValue = rValue; } + }; protected: // constructor for derived classes that *have* to hand @@ -34,10 +56,10 @@ namespace Item public: CntOUString() = delete; - virtual bool operator==(const ItemBase&) const; + virtual bool operator==(const ItemBase&) const override; - const rtl::OUString& getValue() const { return m_aValue; } - void putValue(const rtl::OUString& rValue) { m_aValue = rValue; } + const rtl::OUString& getValue() const; + void setValue(const rtl::OUString& rValue); virtual bool getPresentation( SfxItemPresentation, diff --git a/item/source/simple/CntOUString.cxx b/item/source/simple/CntOUString.cxx index 08d91e618326..ba397337dc11 100644 --- a/item/source/simple/CntOUString.cxx +++ b/item/source/simple/CntOUString.cxx @@ -9,24 +9,70 @@ #include <item/simple/CntOUString.hxx> #include <item/base/ItemControlBlock.hxx> +#include <item/base/ItemAdministrator.hxx> #include <cassert> /////////////////////////////////////////////////////////////////////////////// namespace Item { - CntOUString::CntOUString(ItemControlBlock& rItemControlBlock, const rtl::OUString& rValue) - : ItemBase(rItemControlBlock), + ItemAdministrator& CntOUString::CntOUString_Data::getItemAdministrator() const + { + static ItemAdministrator_set aItemAdministrator_set( + // hand over localized lambda call to construct a new instance of Item + []() + { + return new CntOUString_Data(rtl::OUString()); + }, + // hand over localized lambda call to clone an Item + [](const ItemData& rRef) + { + const CntOUString_Data& rData(static_cast<const CntOUString_Data&>(rRef)); + return new CntOUString_Data(rData.getValue()); + }, + // hand over localized lambda operator< to have a sorted set + [](ItemData* A, ItemData* B) + { + return static_cast<CntOUString_Data*>(A)->getValue() < static_cast<CntOUString_Data*>(B)->getValue(); + }); + + return aItemAdministrator_set; + } + + CntOUString::CntOUString_Data::CntOUString_Data(const rtl::OUString& rValue) + : ItemData(), m_aValue(rValue) { } + bool CntOUString::CntOUString_Data::operator==(const ItemData& rRef) const + { + return ItemData::operator==(rRef) || // ptr-compare + getValue() == static_cast<const CntOUString_Data&>(rRef).getValue(); // content compare + } + + CntOUString::CntOUString(ItemControlBlock& rItemControlBlock, const rtl::OUString& rValue) + : ItemBuffered(rItemControlBlock) + { + setItemData(new CntOUString_Data(rValue)); + } + bool CntOUString::operator==(const ItemBase& rRef) const { return ItemBase::operator==(rRef) || // ptr-compare getValue() == static_cast<const CntOUString&>(rRef).getValue(); } + const rtl::OUString& CntOUString::getValue() const + { + return static_cast<CntOUString_Data&>(getItemData()).getValue(); + } + + void CntOUString::setValue(const rtl::OUString& rValue) + { + setItemData(new CntOUString_Data(rValue)); + } + bool CntOUString::getPresentation( SfxItemPresentation, MapUnit, @@ -34,13 +80,13 @@ namespace Item rtl::OUString& rText, const IntlWrapper&) const { - rText = m_aValue; + rText = getValue(); return true; } bool CntOUString::queryValue(css::uno::Any& rVal, sal_uInt8) const { - rVal <<= m_aValue; + rVal <<= getValue(); return true; } @@ -50,7 +96,7 @@ namespace Item if(rVal >>= aTheValue) { - m_aValue = aTheValue; + setValue(aTheValue); return true; } diff --git a/item/test/ItemTest.cxx b/item/test/ItemTest.cxx index 705867a81d04..1347bd775ddb 100644 --- a/item/test/ItemTest.cxx +++ b/item/test/ItemTest.cxx @@ -1434,6 +1434,13 @@ namespace Item void checkSimpleItems() { + // for debug, change bLoop to true, start, attach and set to false again to debug (one possibility...) + static bool bLoop(false); + while(bLoop) + { + bLoop = true; + } + static bool bInit(false); static CntInt16_derived a_sp, b_sp, c_sp; static CntInt16_derived theDefault; @@ -1490,6 +1497,11 @@ namespace Item CntOUString_derived shas3(CntOUString_derived("Hello")); CntOUString_derived shas4(CntOUString_derived("WhateverComesAlong")); + CntOUString_derived shas5(CntOUString_derived("RgnfShoe2474")); + CntOUString_derived shas6(CntOUString_derived("RgnfShoe2474")); + CntOUString_derived shas7(CntOUString_derived("RgnfShoe2474")); + CntOUString_derived shas8(CntOUString_derived("RgnfShoe2474")); + if(CntOUString_derived("NotDefault").isDefault()) { nIncrement++; |