summaryrefslogtreecommitdiff
path: root/sc/source/core/data/dpitemdata.cxx
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-03-16 21:44:55 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-03-16 23:24:46 -0400
commitf81d15c3bab32938b5b475e16ae2a746a7a32ea9 (patch)
tree46b789f7e751c451c84ec3b57c8fc0b8cb0473cb /sc/source/core/data/dpitemdata.cxx
parentc94b4b7e0e4aeae13eed9402c1f534e694b4e992 (diff)
Use shared string pool to share string instances among string item values.
This brings down the reload time from 22 seconds to 4.3 seconds with my test document. This is what I've been looking for!
Diffstat (limited to 'sc/source/core/data/dpitemdata.cxx')
-rw-r--r--sc/source/core/data/dpitemdata.cxx47
1 files changed, 39 insertions, 8 deletions
diff --git a/sc/source/core/data/dpitemdata.cxx b/sc/source/core/data/dpitemdata.cxx
index 7c5bae5eabd7..fe2c540d2abf 100644
--- a/sc/source/core/data/dpitemdata.cxx
+++ b/sc/source/core/data/dpitemdata.cxx
@@ -70,6 +70,10 @@ sal_Int32 ScDPItemData::Compare(const ScDPItemData& rA, const ScDPItemData& rB)
}
case String:
case Error:
+ if (rA.mpString == rB.mpString)
+ // strings may be interned.
+ return 0;
+
return ScGlobal::GetCollator()->compareString(rA.GetString(), rB.GetString());
default:
;
@@ -78,16 +82,16 @@ sal_Int32 ScDPItemData::Compare(const ScDPItemData& rA, const ScDPItemData& rB)
}
ScDPItemData::ScDPItemData() :
- mfValue(0.0), meType(Empty) {}
+ mfValue(0.0), meType(Empty), mbStringInterned(false) {}
ScDPItemData::ScDPItemData(const ScDPItemData& r) :
- meType(r.meType)
+ meType(r.meType), mbStringInterned(r.mbStringInterned)
{
switch (r.meType)
{
case String:
case Error:
- mpString = new rtl::OUString(*r.mpString);
+ mpString = mbStringInterned ? r.mpString : new rtl::OUString(*r.mpString);
break;
case Value:
case RangeStart:
@@ -105,12 +109,20 @@ ScDPItemData::ScDPItemData(const ScDPItemData& r) :
void ScDPItemData::DisposeString()
{
- if (meType == String || meType == Error)
- delete mpString;
+ if (!mbStringInterned)
+ {
+ if (meType == String || meType == Error)
+ delete mpString;
+ }
+
+ mbStringInterned = false;
}
ScDPItemData::ScDPItemData(const rtl::OUString& rStr) :
- mpString(new rtl::OUString(rStr)), meType(String) {}
+ mpString(new rtl::OUString(rStr)), meType(String), mbStringInterned(false) {}
+
+ScDPItemData::ScDPItemData(const rtl::OUString* pStr) :
+ mpString(pStr), meType(String), mbStringInterned(true) {}
ScDPItemData::ScDPItemData(sal_Int32 nGroupType, sal_Int32 nValue) :
meType(GroupValue)
@@ -126,7 +138,7 @@ ScDPItemData::~ScDPItemData()
ScDPItemData::Type ScDPItemData::GetType() const
{
- return meType;
+ return static_cast<Type>(meType);
}
void ScDPItemData::SetString(const rtl::OUString& rS)
@@ -136,6 +148,14 @@ void ScDPItemData::SetString(const rtl::OUString& rS)
meType = String;
}
+void ScDPItemData::SetString(const rtl::OUString* pS)
+{
+ DisposeString();
+ mpString = pS;
+ meType = String;
+ mbStringInterned = true;
+}
+
void ScDPItemData::SetValue(double fVal)
{
DisposeString();
@@ -170,6 +190,12 @@ void ScDPItemData::SetErrorString(const rtl::OUString& rS)
meType = Error;
}
+void ScDPItemData::SetErrorString(const rtl::OUString* pS)
+{
+ SetString(pS);
+ meType = Error;
+}
+
bool ScDPItemData::IsCaseInsEqual(const ScDPItemData& r) const
{
if (meType != r.meType)
@@ -187,6 +213,9 @@ bool ScDPItemData::IsCaseInsEqual(const ScDPItemData& r) const
;
}
+ if (mbStringInterned && r.mbStringInterned)
+ return mpString == mpString;
+
return ScGlobal::GetpTransliteration()->isEqual(GetString(), r.GetString());
}
@@ -225,11 +254,13 @@ ScDPItemData& ScDPItemData::operator= (const ScDPItemData& r)
{
DisposeString();
meType = r.meType;
+ mbStringInterned = false;
switch (r.meType)
{
case String:
case Error:
- mpString = new rtl::OUString(*r.mpString);
+ mpString = r.mbStringInterned ? r.mpString : new rtl::OUString(*r.mpString);
+ mbStringInterned = r.mbStringInterned;
break;
case Value:
case RangeStart: