summaryrefslogtreecommitdiff
path: root/sc/source/filter/orcus/interface.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/orcus/interface.cxx')
-rw-r--r--sc/source/filter/orcus/interface.cxx33
1 files changed, 24 insertions, 9 deletions
diff --git a/sc/source/filter/orcus/interface.cxx b/sc/source/filter/orcus/interface.cxx
index 45f23049cef2..73b4d0beb416 100644
--- a/sc/source/filter/orcus/interface.cxx
+++ b/sc/source/filter/orcus/interface.cxx
@@ -24,7 +24,7 @@ using orcus::spreadsheet::formula_grammar_t;
ScOrcusFactory::StringCellCache::StringCellCache(const ScAddress& rPos, size_t nIndex) :
maPos(rPos), mnIndex(nIndex) {}
-ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc), maSharedStrings(maStrings) {}
+ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc), maSharedStrings(*this) {}
orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
{
@@ -95,6 +95,25 @@ void ScOrcusFactory::finalize()
}
}
+size_t ScOrcusFactory::appendString(const OUString& rStr)
+{
+ size_t nPos = maStrings.size();
+ maStrings.push_back(rStr);
+ maStringHash.insert(StringHashType::value_type(rStr, nPos));
+
+ return nPos;
+}
+
+size_t ScOrcusFactory::addString(const OUString& rStr)
+{
+ // Add only if the string is not yet present in the string pool.
+ StringHashType::iterator it = maStringHash.find(rStr);
+ if (it != maStringHash.end())
+ return it->second;
+
+ return appendString(rStr);
+}
+
void ScOrcusFactory::pushStringCell(const ScAddress& rPos, size_t nStrIndex)
{
maStringCells.push_back(StringCellCache(rPos, nStrIndex));
@@ -241,23 +260,19 @@ void ScOrcusSheet::set_bool(row_t row, col_t col, bool value)
mrDoc.SetValue(col, row, mnTab, value ? 1.0 : 0.0);
}
-ScOrcusSharedStrings::ScOrcusSharedStrings(std::vector<OUString>& rStrings) :
- mrStrings(rStrings) {}
+ScOrcusSharedStrings::ScOrcusSharedStrings(ScOrcusFactory& rFactory) :
+ mrFactory(rFactory) {}
size_t ScOrcusSharedStrings::append(const char* s, size_t n)
{
OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
- mrStrings.push_back(aNewString);
-
- return mrStrings.size() - 1;
+ return mrFactory.appendString(aNewString);
}
size_t ScOrcusSharedStrings::add(const char* s, size_t n)
{
OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
- mrStrings.push_back(aNewString);
-
- return mrStrings.size() - 1;
+ return mrFactory.addString(aNewString);
}
void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)