summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@me.com>2019-05-14 10:18:53 +0200
committerArmin Le Grand <Armin.Le.Grand@me.com>2019-05-14 10:18:53 +0200
commit61e538cd9c5c04f9311fe6f67203adbdde00a7aa (patch)
treeb9ebf4e3e798dc3015f54bab3db4b18aaaddb426
parentWIP: Continued Item stuff changes (diff)
downloadcore-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.hxx2
-rw-r--r--include/item/simple/CntOUString.hxx38
-rw-r--r--item/source/simple/CntOUString.cxx56
-rw-r--r--item/test/ItemTest.cxx12
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++;