Kaydet (Commit) 5ecb3f46 authored tarafından Kohei Yoshida's avatar Kohei Yoshida Kaydeden (comit) Kohei Yoshida

tdf#107945: store rtl_uString pointers instead of heap OUString objects.

Change-Id: I61079e041a79195f9e9cb77ce80368ef7e909cef
Reviewed-on: https://gerrit.libreoffice.org/38288Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarKohei Yoshida <libreoffice@kohei.us>
üst f681a862
...@@ -117,7 +117,7 @@ private: ...@@ -117,7 +117,7 @@ private:
FieldsType maFields; FieldsType maFields;
GroupFieldsType maGroupFields; GroupFieldsType maGroupFields;
mutable StringSetType maStringPool; StringSetType maStringPool;
std::vector<OUString> maLabelNames; // Stores dimension names and the data layout dimension name at position 0. std::vector<OUString> maLabelNames; // Stores dimension names and the data layout dimension name at position 0.
mdds::flat_segment_tree<SCROW, bool> maEmptyRows; mdds::flat_segment_tree<SCROW, bool> maEmptyRows;
...@@ -127,7 +127,7 @@ private: ...@@ -127,7 +127,7 @@ private:
bool mbDisposing; bool mbDisposing;
public: public:
const OUString* InternString(const OUString& rStr) const; rtl_uString* InternString( const OUString& rStr );
void AddReference(ScDPObject* pObj) const; void AddReference(ScDPObject* pObj) const;
void RemoveReference(ScDPObject* pObj) const; void RemoveReference(ScDPObject* pObj) const;
const ScDPObjectSet& GetAllReferences() const; const ScDPObjectSet& GetAllReferences() const;
......
...@@ -45,7 +45,7 @@ public: ...@@ -45,7 +45,7 @@ public:
private: private:
union { union {
const OUString* mpString; rtl_uString* mpString;
GroupValueAttr maGroupValue; GroupValueAttr maGroupValue;
double mfValue; double mfValue;
}; };
...@@ -68,12 +68,12 @@ public: ...@@ -68,12 +68,12 @@ public:
Type GetType() const { return static_cast<Type>(meType); } Type GetType() const { return static_cast<Type>(meType); }
void SetEmpty(); void SetEmpty();
void SetString(const OUString& rS); void SetString(const OUString& rS);
void SetString(const OUString* pS); void SetStringInterned( rtl_uString* pS );
void SetValue(double fVal); void SetValue(double fVal);
void SetRangeStart(double fVal); void SetRangeStart(double fVal);
void SetRangeFirst(); void SetRangeFirst();
void SetRangeLast(); void SetRangeLast();
void SetErrorString(const OUString* pS); void SetErrorStringInterned( rtl_uString* pS );
bool IsCaseInsEqual(const ScDPItemData& r) const; bool IsCaseInsEqual(const ScDPItemData& r) const;
// exact equality // exact equality
......
...@@ -134,7 +134,7 @@ void initFromCell( ...@@ -134,7 +134,7 @@ void initFromCell(
if (rCell.hasError()) if (rCell.hasError())
{ {
rData.SetErrorString(rCache.InternString(aDocStr)); rData.SetErrorStringInterned(rCache.InternString(aDocStr));
} }
else if (rCell.hasNumeric()) else if (rCell.hasNumeric())
{ {
...@@ -144,7 +144,7 @@ void initFromCell( ...@@ -144,7 +144,7 @@ void initFromCell(
} }
else if (!rCell.isEmpty()) else if (!rCell.isEmpty())
{ {
rData.SetString(rCache.InternString(aDocStr)); rData.SetStringInterned(rCache.InternString(aDocStr));
} }
else else
rData.SetEmpty(); rData.SetEmpty();
...@@ -901,15 +901,15 @@ SCCOL ScDPCache::GetDimensionIndex(const OUString& sName) const ...@@ -901,15 +901,15 @@ SCCOL ScDPCache::GetDimensionIndex(const OUString& sName) const
return -1; return -1;
} }
const OUString* ScDPCache::InternString(const OUString& rStr) const rtl_uString* ScDPCache::InternString( const OUString& rStr )
{ {
StringSetType::iterator it = maStringPool.find(rStr); StringSetType::iterator it = maStringPool.find(rStr);
if (it != maStringPool.end()) if (it != maStringPool.end())
// In the pool. // In the pool.
return &(*it); return (*it).pData;
std::pair<StringSetType::iterator, bool> r = maStringPool.insert(rStr); std::pair<StringSetType::iterator, bool> r = maStringPool.insert(rStr);
return r.second ? &(*r.first) : nullptr; return r.second ? (*r.first).pData : nullptr;
} }
void ScDPCache::AddReference(ScDPObject* pObj) const void ScDPCache::AddReference(ScDPObject* pObj) const
......
...@@ -83,7 +83,9 @@ ScDPItemData::ScDPItemData(const ScDPItemData& r) : ...@@ -83,7 +83,9 @@ ScDPItemData::ScDPItemData(const ScDPItemData& r) :
{ {
case String: case String:
case Error: case Error:
mpString = mbStringInterned ? r.mpString : new OUString(*r.mpString); mpString = r.mpString;
if (!mbStringInterned)
rtl_uString_acquire(mpString);
break; break;
case Value: case Value:
case RangeStart: case RangeStart:
...@@ -104,14 +106,17 @@ void ScDPItemData::DisposeString() ...@@ -104,14 +106,17 @@ void ScDPItemData::DisposeString()
if (!mbStringInterned) if (!mbStringInterned)
{ {
if (meType == String || meType == Error) if (meType == String || meType == Error)
delete mpString; rtl_uString_release(mpString);
} }
mbStringInterned = false; mbStringInterned = false;
} }
ScDPItemData::ScDPItemData(const OUString& rStr) : ScDPItemData::ScDPItemData(const OUString& rStr) :
mpString(new OUString(rStr)), meType(String), mbStringInterned(false) {} mpString(rStr.pData), meType(String), mbStringInterned(false)
{
rtl_uString_acquire(mpString);
}
ScDPItemData::ScDPItemData(sal_Int32 nGroupType, sal_Int32 nValue) : ScDPItemData::ScDPItemData(sal_Int32 nGroupType, sal_Int32 nValue) :
meType(GroupValue), mbStringInterned(false) meType(GroupValue), mbStringInterned(false)
...@@ -134,11 +139,12 @@ void ScDPItemData::SetEmpty() ...@@ -134,11 +139,12 @@ void ScDPItemData::SetEmpty()
void ScDPItemData::SetString(const OUString& rS) void ScDPItemData::SetString(const OUString& rS)
{ {
DisposeString(); DisposeString();
mpString = new OUString(rS); mpString = rS.pData;
rtl_uString_acquire(mpString);
meType = String; meType = String;
} }
void ScDPItemData::SetString(const OUString* pS) void ScDPItemData::SetStringInterned( rtl_uString* pS )
{ {
DisposeString(); DisposeString();
mpString = pS; mpString = pS;
...@@ -174,9 +180,9 @@ void ScDPItemData::SetRangeLast() ...@@ -174,9 +180,9 @@ void ScDPItemData::SetRangeLast()
meType = RangeStart; meType = RangeStart;
} }
void ScDPItemData::SetErrorString(const OUString* pS) void ScDPItemData::SetErrorStringInterned( rtl_uString* pS )
{ {
SetString(pS); SetStringInterned(pS);
meType = Error; meType = Error;
} }
...@@ -234,13 +240,14 @@ ScDPItemData& ScDPItemData::operator= (const ScDPItemData& r) ...@@ -234,13 +240,14 @@ ScDPItemData& ScDPItemData::operator= (const ScDPItemData& r)
{ {
DisposeString(); DisposeString();
meType = r.meType; meType = r.meType;
mbStringInterned = false;
switch (r.meType) switch (r.meType)
{ {
case String: case String:
case Error: case Error:
mpString = r.mbStringInterned ? r.mpString : new OUString(*r.mpString);
mbStringInterned = r.mbStringInterned; mbStringInterned = r.mbStringInterned;
mpString = r.mpString;
if (!mbStringInterned)
rtl_uString_acquire(mpString);
break; break;
case Value: case Value:
case RangeStart: case RangeStart:
...@@ -286,7 +293,7 @@ void ScDPItemData::Dump(const char* msg) const ...@@ -286,7 +293,7 @@ void ScDPItemData::Dump(const char* msg) const
break; break;
case Error: case Error:
printf("error: %s\n", printf("error: %s\n",
OUStringToOString(*mpString, RTL_TEXTENCODING_UTF8).getStr()); OUStringToOString(OUString(mpString), RTL_TEXTENCODING_UTF8).getStr());
break; break;
case GroupValue: case GroupValue:
printf("group value: group type = %d value = %d\n", printf("group value: group type = %d value = %d\n",
...@@ -294,7 +301,7 @@ void ScDPItemData::Dump(const char* msg) const ...@@ -294,7 +301,7 @@ void ScDPItemData::Dump(const char* msg) const
break; break;
case String: case String:
printf("string: %s\n", printf("string: %s\n",
OUStringToOString(*mpString, RTL_TEXTENCODING_UTF8).getStr()); OUStringToOString(OUString(mpString), RTL_TEXTENCODING_UTF8).getStr());
break; break;
case Value: case Value:
printf("value: %g\n", mfValue); printf("value: %g\n", mfValue);
...@@ -325,7 +332,7 @@ OUString ScDPItemData::GetString() const ...@@ -325,7 +332,7 @@ OUString ScDPItemData::GetString() const
{ {
case String: case String:
case Error: case Error:
return *mpString; return OUString(mpString);
case Value: case Value:
case RangeStart: case RangeStart:
return OUString::number(mfValue); return OUString::number(mfValue);
......
...@@ -247,7 +247,7 @@ void DBConnector::getValue(long nCol, ScDPItemData &rData, short& rNumType) cons ...@@ -247,7 +247,7 @@ void DBConnector::getValue(long nCol, ScDPItemData &rData, short& rNumType) cons
case sdbc::DataType::VARBINARY: case sdbc::DataType::VARBINARY:
case sdbc::DataType::LONGVARBINARY: case sdbc::DataType::LONGVARBINARY:
default: default:
rData.SetString(mrCache.InternString(mxRow->getString(nCol+1))); rData.SetStringInterned(mrCache.InternString(mxRow->getString(nCol+1)));
} }
} }
catch (uno::Exception&) catch (uno::Exception&)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment