diff options
author | Kohei Yoshida <kohei.yoshida@suse.com> | 2012-03-02 17:28:59 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-03-09 11:13:28 -0500 |
commit | 20624fe17bc0a367c5f1d46c8244b7e3d0a7e110 (patch) | |
tree | 706d518ba05990404b93425eccf41fefc51d7f37 /sc | |
parent | Massive rework to reduce the size of ScDPItemData. (diff) | |
download | core-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.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/data/dpitemdata.cxx | 51 |
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 |