Kaydet (Commit) d6865e5c authored tarafından Noel Grandin's avatar Noel Grandin

use std::unordered_map in RTFTokenizer

to speed up

    make sw.check

Using a --enable-dbgutil --enable-optimised build, this takes my runtime
from 6m03 to 3m43

Change-Id: I79d2345c361d99d4a1c4402a4b7008bbb59b8184
Reviewed-on: https://gerrit.libreoffice.org/72902Reviewed-by: 's avatarMichael Stahl <Michael.Stahl@cib.de>
Tested-by: Jenkins
üst 360b9d52
...@@ -27,8 +27,8 @@ namespace writerfilter ...@@ -27,8 +27,8 @@ namespace writerfilter
{ {
namespace rtftok namespace rtftok
{ {
std::vector<RTFSymbol> RTFTokenizer::s_aRTFControlWords; std::unordered_map<OString, RTFSymbol> RTFTokenizer::s_aRTFControlWords;
bool RTFTokenizer::s_bControlWordsSorted; bool RTFTokenizer::s_bControlWordsInitialised;
std::vector<RTFMathSymbol> RTFTokenizer::s_aRTFMathControlWords; std::vector<RTFMathSymbol> RTFTokenizer::s_aRTFMathControlWords;
bool RTFTokenizer::s_bMathControlWordsSorted; bool RTFTokenizer::s_bMathControlWordsSorted;
...@@ -42,12 +42,12 @@ RTFTokenizer::RTFTokenizer(RTFListener& rImport, SvStream* pInStream, ...@@ -42,12 +42,12 @@ RTFTokenizer::RTFTokenizer(RTFListener& rImport, SvStream* pInStream,
, m_nLineStartPos(0) , m_nLineStartPos(0)
, m_nGroupStart(0) , m_nGroupStart(0)
{ {
if (!RTFTokenizer::s_bControlWordsSorted) if (!RTFTokenizer::s_bControlWordsInitialised)
{ {
RTFTokenizer::s_bControlWordsSorted = true; RTFTokenizer::s_bControlWordsInitialised = true;
s_aRTFControlWords for (int i = 0; i < nRTFControlWords; ++i)
= std::vector<RTFSymbol>(aRTFControlWords, aRTFControlWords + nRTFControlWords); s_aRTFControlWords.emplace(OString(aRTFControlWords[i].GetKeyword()),
std::sort(s_aRTFControlWords.begin(), s_aRTFControlWords.end()); aRTFControlWords[i]);
} }
if (!RTFTokenizer::s_bMathControlWordsSorted) if (!RTFTokenizer::s_bMathControlWordsSorted)
{ {
...@@ -270,10 +270,8 @@ RTFError RTFTokenizer::dispatchKeyword(OString const& rKeyword, bool bParam, int ...@@ -270,10 +270,8 @@ RTFError RTFTokenizer::dispatchKeyword(OString const& rKeyword, bool bParam, int
SAL_INFO("writerfilter.rtf", OSL_THIS_FUNC << ": keyword '\\" << rKeyword << "' with param? " SAL_INFO("writerfilter.rtf", OSL_THIS_FUNC << ": keyword '\\" << rKeyword << "' with param? "
<< (bParam ? 1 : 0) << " param val: '" << (bParam ? 1 : 0) << " param val: '"
<< (bParam ? nParam : 0) << "'"); << (bParam ? nParam : 0) << "'");
RTFSymbol aSymbol(rKeyword.getStr()); auto findIt = s_aRTFControlWords.find(rKeyword);
auto low = std::lower_bound(s_aRTFControlWords.begin(), s_aRTFControlWords.end(), aSymbol); if (findIt == s_aRTFControlWords.end())
int i = low - s_aRTFControlWords.begin();
if (low == s_aRTFControlWords.end() || aSymbol < *low)
{ {
SAL_INFO("writerfilter.rtf", OSL_THIS_FUNC << ": unknown keyword '\\" << rKeyword << "'"); SAL_INFO("writerfilter.rtf", OSL_THIS_FUNC << ": unknown keyword '\\" << rKeyword << "'");
RTFSkipDestination aSkip(m_rImport); RTFSkipDestination aSkip(m_rImport);
...@@ -282,35 +280,36 @@ RTFError RTFTokenizer::dispatchKeyword(OString const& rKeyword, bool bParam, int ...@@ -282,35 +280,36 @@ RTFError RTFTokenizer::dispatchKeyword(OString const& rKeyword, bool bParam, int
} }
RTFError ret; RTFError ret;
switch (s_aRTFControlWords[i].GetControlType()) RTFSymbol const& rSymbol = findIt->second;
switch (rSymbol.GetControlType())
{ {
case CONTROL_FLAG: case CONTROL_FLAG:
// flags ignore any parameter by definition // flags ignore any parameter by definition
ret = m_rImport.dispatchFlag(s_aRTFControlWords[i].GetIndex()); ret = m_rImport.dispatchFlag(rSymbol.GetIndex());
if (ret != RTFError::OK) if (ret != RTFError::OK)
return ret; return ret;
break; break;
case CONTROL_DESTINATION: case CONTROL_DESTINATION:
// same for destinations // same for destinations
ret = m_rImport.dispatchDestination(s_aRTFControlWords[i].GetIndex()); ret = m_rImport.dispatchDestination(rSymbol.GetIndex());
if (ret != RTFError::OK) if (ret != RTFError::OK)
return ret; return ret;
break; break;
case CONTROL_SYMBOL: case CONTROL_SYMBOL:
// and symbols // and symbols
ret = m_rImport.dispatchSymbol(s_aRTFControlWords[i].GetIndex()); ret = m_rImport.dispatchSymbol(rSymbol.GetIndex());
if (ret != RTFError::OK) if (ret != RTFError::OK)
return ret; return ret;
break; break;
case CONTROL_TOGGLE: case CONTROL_TOGGLE:
ret = m_rImport.dispatchToggle(s_aRTFControlWords[i].GetIndex(), bParam, nParam); ret = m_rImport.dispatchToggle(rSymbol.GetIndex(), bParam, nParam);
if (ret != RTFError::OK) if (ret != RTFError::OK)
return ret; return ret;
break; break;
case CONTROL_VALUE: case CONTROL_VALUE:
if (!bParam) if (!bParam)
nParam = s_aRTFControlWords[i].GetDefValue(); nParam = rSymbol.GetDefValue();
ret = m_rImport.dispatchValue(s_aRTFControlWords[i].GetIndex(), nParam); ret = m_rImport.dispatchValue(rSymbol.GetIndex(), nParam);
if (ret != RTFError::OK) if (ret != RTFError::OK)
return ret; return ret;
break; break;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "rtflistener.hxx" #include "rtflistener.hxx"
#include <vector> #include <vector>
#include <unordered_map>
#include <com/sun/star/uno/Reference.h> #include <com/sun/star/uno/Reference.h>
...@@ -67,8 +68,8 @@ private: ...@@ -67,8 +68,8 @@ private:
SvStream* m_pInStream; SvStream* m_pInStream;
css::uno::Reference<css::task::XStatusIndicator> const& m_xStatusIndicator; css::uno::Reference<css::task::XStatusIndicator> const& m_xStatusIndicator;
// This is the same as aRTFControlWords, but sorted // This is the same as aRTFControlWords, but sorted
static std::vector<RTFSymbol> s_aRTFControlWords; static std::unordered_map<OString, RTFSymbol> s_aRTFControlWords;
static bool s_bControlWordsSorted; static bool s_bControlWordsInitialised;
// This is the same as aRTFMathControlWords, but sorted // This is the same as aRTFMathControlWords, but sorted
static std::vector<RTFMathSymbol> s_aRTFMathControlWords; static std::vector<RTFMathSymbol> s_aRTFMathControlWords;
static bool s_bMathControlWordsSorted; static bool s_bMathControlWordsSorted;
......
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