summaryrefslogtreecommitdiffstats
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2012-03-02 17:28:59 -0500
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-03-09 11:13:28 -0500
commit20624fe17bc0a367c5f1d46c8244b7e3d0a7e110 (patch)
tree706d518ba05990404b93425eccf41fefc51d7f37 /sc
parentMassive rework to reduce the size of ScDPItemData. (diff)
downloadcore-20624fe17bc0a367c5f1d46c8244b7e3d0a7e110.tar.gz
core-20624fe17bc0a367c5f1d46c8244b7e3d0a7e110.zip
Custom copy constructor and assignment operator to fix segfault.
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/dpitemdata.hxx3
-rw-r--r--sc/source/core/data/dpitemdata.cxx51
2 files changed, 53 insertions, 1 deletions
diff --git a/sc/inc/dpitemdata.hxx b/sc/inc/dpitemdata.hxx
index ec95038b53af..01bb425f78b3 100644
--- a/sc/inc/dpitemdata.hxx
+++ b/sc/inc/dpitemdata.hxx
@@ -70,6 +70,7 @@ public:
static sal_Int32 Compare(const ScDPItemData& rA, const ScDPItemData& rB);
ScDPItemData();
+ ScDPItemData(const ScDPItemData& r);
ScDPItemData(const rtl::OUString& rStr);
ScDPItemData(double fVal);
ScDPItemData(sal_Int32 nGroupType, sal_Int32 nValue);
@@ -86,6 +87,8 @@ public:
// exact equality
bool operator==(const ScDPItemData& r) const;
+ ScDPItemData& operator= (const ScDPItemData& r);
+
bool IsEmpty() const;
bool IsValue() const;
rtl::OUString GetString() const;
diff --git a/sc/source/core/data/dpitemdata.cxx b/sc/source/core/data/dpitemdata.cxx
index 579f98521ab2..b7d6c2864bef 100644
--- a/sc/source/core/data/dpitemdata.cxx
+++ b/sc/source/core/data/dpitemdata.cxx
@@ -52,6 +52,28 @@ sal_Int32 ScDPItemData::Compare(const ScDPItemData& rA, const ScDPItemData& rB)
ScDPItemData::ScDPItemData() :
mfValue(0.0), meType(Empty) {}
+ScDPItemData::ScDPItemData(const ScDPItemData& r) :
+ meType(r.meType)
+{
+ switch (r.meType)
+ {
+ case String:
+ case Error:
+ mpString = new rtl::OUString(*r.mpString);
+ break;
+ case Value:
+ mfValue = r.mfValue;
+ break;
+ case GroupValue:
+ maGroupValue.mnGroupType = r.maGroupValue.mnGroupType;
+ maGroupValue.mnValue = r.maGroupValue.mnValue;
+ break;
+ case Empty:
+ default:
+ mfValue = 0.0;
+ }
+}
+
ScDPItemData::ScDPItemData(const rtl::OUString& rStr) :
mpString(new rtl::OUString(rStr)), meType(String) {}
@@ -100,6 +122,7 @@ void ScDPItemData::SetGroupValue(sal_Int32 nGroupType, sal_Int32 nValue)
void ScDPItemData::SetErrorString(const rtl::OUString& rS)
{
SetString(rS);
+ meType = Error;
}
bool ScDPItemData::IsCaseInsEqual(const ScDPItemData& r) const
@@ -121,6 +144,9 @@ size_t ScDPItemData::Hash() const
// If we do unicode safe case insensitive hash we can drop
// ScDPItemData::operator== and use ::IsCasInsEqual
rtl::OUString aStr = GetString();
+ if (aStr.isEmpty())
+ return 0;
+
return rtl_ustr_hashCode_WithLength(aStr.getStr(), aStr.getLength());
}
@@ -140,6 +166,29 @@ bool ScDPItemData::operator== (const ScDPItemData& r) const
return GetString() == r.GetString();
}
+ScDPItemData& ScDPItemData::operator= (const ScDPItemData& r)
+{
+ meType = r.meType;
+ switch (r.meType)
+ {
+ case String:
+ case Error:
+ mpString = new rtl::OUString(*r.mpString);
+ break;
+ case Value:
+ mfValue = r.mfValue;
+ break;
+ case GroupValue:
+ maGroupValue.mnGroupType = r.maGroupValue.mnGroupType;
+ maGroupValue.mnValue = r.maGroupValue.mnValue;
+ break;
+ case Empty:
+ default:
+ mfValue = 0.0;
+ }
+ return *this;
+}
+
sal_uInt8 ScDPItemData::GetCellType() const
{
if (meType == Error)
@@ -168,7 +217,7 @@ rtl::OUString ScDPItemData::GetString() const
return *mpString;
// TODO: Generate appropriate string.
- return rtl::OUString();
+ return rtl::OUString::createFromAscii("fail");
}
double ScDPItemData::GetValue() const