starmath/inc/mathml/starmathdatabase.hxx    |    6 ++--
 starmath/inc/token.hxx                      |   34 ++++++++++++++--------------
 starmath/source/mathml/export.cxx           |   18 ++++++--------
 starmath/source/mathml/mathmlexport.cxx     |    3 --
 starmath/source/mathml/starmathdatabase.cxx |   19 ++++++++-------
 starmath/source/parse5.cxx                  |    6 ++--
 starmath/source/visitors.cxx                |    4 +--
 7 files changed, 44 insertions(+), 46 deletions(-)

New commits:
commit 8ad920befe1290c40ef762e8d7d9797b1924f5d2
Author:     Noel Grandin <[email protected]>
AuthorDate: Thu May 12 12:49:53 2022 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Fri May 13 10:58:26 2022 +0200

    tdf#121740 reduce cost of mathml parsing
    
    by re-using OUString instances instead of allocating new ones for each
    SmToken
    
    Change-Id: Ia897427d6c1ffeb0e741dea90fde1f4d56a70175
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134264
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/starmath/inc/mathml/starmathdatabase.hxx 
b/starmath/inc/mathml/starmathdatabase.hxx
index 3a4e939973d9..b4d3d6d3f8b5 100644
--- a/starmath/inc/mathml/starmathdatabase.hxx
+++ b/starmath/inc/mathml/starmathdatabase.hxx
@@ -302,7 +302,7 @@ SmColorTokenTableEntry Identify_Color_DVIPSNAMES(sal_uInt32 
cColor);
   * @param cColor
   * @param parser color
   */
-const SmColorTokenTableEntry* Identify_ColorName_Parser(const OUString& 
colorname);
+const SmColorTokenTableEntry* Identify_ColorName_Parser(std::u16string_view 
colorname);
 
 /**
   * Identifies color from color name.
@@ -315,7 +315,7 @@ const SmColorTokenTableEntry* 
Identify_ColorName_Parser(const OUString& colornam
   * @param cColor
   * @param parser color
   */
-SmColorTokenTableEntry Identify_ColorName_HTML(const OUString& colorname);
+SmColorTokenTableEntry Identify_ColorName_HTML(std::u16string_view colorname);
 
 /**
   * Identifies color from color name.
@@ -326,7 +326,7 @@ SmColorTokenTableEntry Identify_ColorName_HTML(const 
OUString& colorname);
   * @param cColor
   * @param parser color
   */
-const SmColorTokenTableEntry* Identify_ColorName_DVIPSNAMES(const OUString& 
colorname);
+const SmColorTokenTableEntry* 
Identify_ColorName_DVIPSNAMES(std::u16string_view colorname);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/starmath/inc/token.hxx b/starmath/inc/token.hxx
index 86ee287d51c8..d3e141e5adb9 100644
--- a/starmath/inc/token.hxx
+++ b/starmath/inc/token.hxx
@@ -29,6 +29,7 @@
 #pragma once
 
 #include <tools/color.hxx>
+#include <o3tl/string_view.hxx>
 #include <o3tl/typed_flags_set.hxx>
 
 // std imports
@@ -148,7 +149,7 @@ enum SmTokenType
 
 struct SmTokenTableEntry
 {
-    std::u16string_view pIdent;
+    OUString aIdent;
     SmTokenType eType;
     sal_Unicode cMathChar;
     TG nGroup;
@@ -157,48 +158,47 @@ struct SmTokenTableEntry
 
 struct SmColorTokenTableEntry
 {
-    const char* pIdent;
+    OUString aIdent;
     SmTokenType eType;
     Color cColor;
 
     SmColorTokenTableEntry()
-        : pIdent("")
-        , eType(TERROR)
+        : eType(TERROR)
         , cColor()
     {
     }
 
     SmColorTokenTableEntry(const SmColorTokenTableEntry* 
amColorTokenTableEntry)
-        : pIdent(amColorTokenTableEntry->pIdent)
+        : aIdent(amColorTokenTableEntry->aIdent)
         , eType(amColorTokenTableEntry->eType)
         , cColor(amColorTokenTableEntry->cColor)
     {
     }
 
     SmColorTokenTableEntry(const std::unique_ptr<SmColorTokenTableEntry> 
amColorTokenTableEntry)
-        : pIdent(amColorTokenTableEntry->pIdent)
+        : aIdent(amColorTokenTableEntry->aIdent)
         , eType(amColorTokenTableEntry->eType)
         , cColor(amColorTokenTableEntry->cColor)
     {
     }
 
-    SmColorTokenTableEntry(const char* name, SmTokenType ctype, Color ncolor)
-        : pIdent(name)
+    SmColorTokenTableEntry(const OUString& name, SmTokenType ctype, Color 
ncolor)
+        : aIdent(name)
         , eType(ctype)
         , cColor(ncolor)
     {
     }
 
-    SmColorTokenTableEntry(const char* name, SmTokenType ctype, sal_uInt32 
ncolor)
-        : pIdent(name)
+    SmColorTokenTableEntry(const OUString& name, SmTokenType ctype, sal_uInt32 
ncolor)
+        : aIdent(name)
         , eType(ctype)
         , cColor(ColorTransparency, ncolor)
     {
     }
 
-    bool equals(const OUString& colorname) const
+    bool equals(std::u16string_view colorname) const
     {
-        return colorname.compareToIgnoreAsciiCaseAscii(pIdent) == 0;
+        return o3tl::compareToIgnoreAsciiCase(colorname, aIdent) == 0;
     }
 
     bool equals(sal_uInt32 colorcode) const { return colorcode == 
static_cast<sal_uInt32>(cColor); }
@@ -224,9 +224,9 @@ struct SmToken
     {
     }
 
-    SmToken(SmTokenType eTokenType, sal_Unicode cMath, const char* pText, TG 
nTokenGroup = TG::NONE,
-            sal_uInt16 nTokenLevel = 0)
-        : aText(OUString::createFromAscii(pText))
+    SmToken(SmTokenType eTokenType, sal_Unicode cMath, const OUString& rText,
+            TG nTokenGroup = TG::NONE, sal_uInt16 nTokenLevel = 0)
+        : aText(rText)
         , eType(eTokenType)
         , cMathChar(cMath)
         , nGroup(nTokenGroup)
@@ -236,7 +236,7 @@ struct SmToken
 
     void operator=(const SmTokenTableEntry& aTokenTableEntry)
     {
-        aText = aTokenTableEntry.pIdent;
+        aText = aTokenTableEntry.aIdent;
         eType = aTokenTableEntry.eType;
         cMathChar = OUString(&aTokenTableEntry.cMathChar, 1);
         nGroup = aTokenTableEntry.nGroup;
@@ -245,7 +245,7 @@ struct SmToken
 
     void operator=(const SmTokenTableEntry* aTokenTableEntry)
     {
-        aText = aTokenTableEntry->pIdent;
+        aText = aTokenTableEntry->aIdent;
         eType = aTokenTableEntry->eType;
         cMathChar = OUString(&aTokenTableEntry->cMathChar, 1);
         nGroup = aTokenTableEntry->nGroup;
diff --git a/starmath/source/mathml/export.cxx 
b/starmath/source/mathml/export.cxx
index 7115e7a1a8f3..ab737c125491 100644
--- a/starmath/source/mathml/export.cxx
+++ b/starmath/source/mathml/export.cxx
@@ -785,11 +785,10 @@ void SmMLExport::exportMlAttributes(const SmMlElement* 
pMlElement)
                         break;
                     case SmMlAttributeValueMathbackground::MlRgb:
                     {
-                        OUString aTextColor
-                            = 
OUString::createFromAscii(starmathdatabase::Identify_Color_MATHML(
-                                                            
sal_uInt32(aAttributeValue->m_aCol))
-                                                            .pIdent);
-                        addAttribute(XML_MATHBACKGROUND, aTextColor);
+                        const OUString& rTextColor = 
starmathdatabase::Identify_Color_MATHML(
+                                                         
sal_uInt32(aAttributeValue->m_aCol))
+                                                         .aIdent;
+                        addAttribute(XML_MATHBACKGROUND, rTextColor);
                         break;
                     }
                     default:
@@ -807,11 +806,10 @@ void SmMLExport::exportMlAttributes(const SmMlElement* 
pMlElement)
                         break;
                     case SmMlAttributeValueMathcolor::MlRgb:
                     {
-                        OUString aTextColor
-                            = 
OUString::createFromAscii(starmathdatabase::Identify_Color_MATHML(
-                                                            
sal_uInt32(aAttributeValue->m_aCol))
-                                                            .pIdent);
-                        addAttribute(XML_MATHCOLOR, aTextColor);
+                        const OUString& rTextColor = 
starmathdatabase::Identify_Color_MATHML(
+                                                         
sal_uInt32(aAttributeValue->m_aCol))
+                                                         .aIdent;
+                        addAttribute(XML_MATHCOLOR, rTextColor);
                         break;
                     }
                     default:
diff --git a/starmath/source/mathml/mathmlexport.cxx 
b/starmath/source/mathml/mathmlexport.cxx
index 142ba6fd665c..0fb2573b5b80 100644
--- a/starmath/source/mathml/mathmlexport.cxx
+++ b/starmath/source/mathml/mathmlexport.cxx
@@ -1142,8 +1142,7 @@ void SmXMLExport::ExportFont(const SmNode* pNode, int 
nLevel)
         case TMATHMLCOL:
         {
             nc = pNode->GetToken().cMathChar.toUInt32(16);
-            OUString sssStr
-                = 
OUString::createFromAscii(starmathdatabase::Identify_Color_MATHML(nc).pIdent);
+            const OUString& sssStr = 
starmathdatabase::Identify_Color_MATHML(nc).aIdent;
             AddAttribute(XML_NAMESPACE_MATH, XML_MATHCOLOR, sssStr);
         }
         break;
diff --git a/starmath/source/mathml/starmathdatabase.cxx 
b/starmath/source/mathml/starmathdatabase.cxx
index d52a5fa37cdc..66bdf3f3400c 100644
--- a/starmath/source/mathml/starmathdatabase.cxx
+++ b/starmath/source/mathml/starmathdatabase.cxx
@@ -743,13 +743,14 @@ SmColorTokenTableEntry 
starmathdatabase::Identify_Color_DVIPSNAMES(sal_uInt32 cC
         return SmColorTokenTableEntry("", TRGBA, cColor);
 }
 
-const SmColorTokenTableEntry* 
starmathdatabase::Identify_ColorName_Parser(const OUString& colorname)
+const SmColorTokenTableEntry*
+starmathdatabase::Identify_ColorName_Parser(std::u16string_view colorname)
 {
-    if (colorname.isEmpty())
+    if (colorname.empty())
         return &aColorTokenTableERROR[0];
     for (auto i = std::begin(aColorTokenTableParse); i < 
std::end(aColorTokenTableParse); ++i)
     {
-        sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+        sal_Int32 matches = o3tl::compareToIgnoreAsciiCase(colorname, 
i->aIdent);
         if (matches == 0)
             return i;
         if (matches < 0)
@@ -757,9 +758,9 @@ const SmColorTokenTableEntry* 
starmathdatabase::Identify_ColorName_Parser(const
     }
     return &aColorTokenTableERROR[0];
 }
-SmColorTokenTableEntry starmathdatabase::Identify_ColorName_HTML(const 
OUString& colorname)
+SmColorTokenTableEntry 
starmathdatabase::Identify_ColorName_HTML(std::u16string_view colorname)
 {
-    if (colorname.isEmpty())
+    if (colorname.empty())
         return SmColorTokenTableEntry("", TERROR, COL_SM_BLACK);
     if (colorname[0] == '#')
     {
@@ -768,7 +769,7 @@ SmColorTokenTableEntry 
starmathdatabase::Identify_ColorName_HTML(const OUString&
     }
     for (auto i = std::begin(aColorTokenTableHTML); i < 
std::end(aColorTokenTableHTML); ++i)
     {
-        sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+        sal_Int32 matches = o3tl::compareToIgnoreAsciiCase(colorname, 
i->aIdent);
         if (matches == 0)
             return i;
         if (matches < 0)
@@ -777,13 +778,13 @@ SmColorTokenTableEntry 
starmathdatabase::Identify_ColorName_HTML(const OUString&
     return SmColorTokenTableEntry("", TERROR, COL_SM_BLACK);
 }
 const SmColorTokenTableEntry*
-starmathdatabase::Identify_ColorName_DVIPSNAMES(const OUString& colorname)
+starmathdatabase::Identify_ColorName_DVIPSNAMES(std::u16string_view colorname)
 {
-    if (colorname.isEmpty())
+    if (colorname.empty())
         return &aColorTokenTableERROR[0];
     for (auto i = std::begin(aColorTokenTableDVIPS); i < 
std::end(aColorTokenTableDVIPS); ++i)
     {
-        sal_Int32 matches = colorname.compareToIgnoreAsciiCaseAscii(i->pIdent);
+        sal_Int32 matches = o3tl::compareToIgnoreAsciiCase(colorname, 
i->aIdent);
         if (matches == 0)
             return i;
         if (matches < 0)
diff --git a/starmath/source/parse5.cxx b/starmath/source/parse5.cxx
index 06c2f0c0dc1e..1bc218f646f0 100644
--- a/starmath/source/parse5.cxx
+++ b/starmath/source/parse5.cxx
@@ -288,7 +288,7 @@ const sal_Int32 coUserDefinedCharContFlags = 
KParseTokens::ANY_LETTER_OR_NUMBER
 //Checks if keyword is in the list.
 static inline bool findCompare(const SmTokenTableEntry& lhs, const OUString& s)
 {
-    return s.compareToIgnoreAsciiCase(lhs.pIdent) > 0;
+    return s.compareToIgnoreAsciiCase(lhs.aIdent) > 0;
 }
 
 //Returns the SmTokenTableEntry for a keyword
@@ -299,7 +299,7 @@ static const SmTokenTableEntry* GetTokenTableEntry(const 
OUString& rName)
     //Looks for the first keyword after or equal to rName in alphabetical 
order.
     auto findIter
         = std::lower_bound(std::begin(aTokenTable), std::end(aTokenTable), 
rName, findCompare);
-    if (findIter != std::end(aTokenTable) && 
rName.equalsIgnoreAsciiCase(findIter->pIdent))
+    if (findIter != std::end(aTokenTable) && 
rName.equalsIgnoreAsciiCase(findIter->aIdent))
         return &*findIter; //check is equal
     return nullptr; //not found
 }
@@ -490,7 +490,7 @@ void SmParser5::NextToken() //Central part of the parser
             m_aCurToken.setChar(pEntry->cMathChar);
             m_aCurToken.nGroup = pEntry->nGroup;
             m_aCurToken.nLevel = pEntry->nLevel;
-            m_aCurToken.aText = pEntry->pIdent;
+            m_aCurToken.aText = pEntry->aIdent;
         }
         else
         {
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index e84619f2a4e9..980c6346ca80 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -2164,14 +2164,14 @@ void SmNodeToTextVisitor::Visit( SmFontNode* pNode )
         case TDVIPSNAMESCOL:
             Append(u"color dvip ");
             nc = pNode->GetToken().cMathChar.toUInt32(16);
-            Append( starmathdatabase::Identify_Color_Parser( nc ).pIdent );
+            Append( starmathdatabase::Identify_Color_Parser( nc ).aIdent );
             break;
         case THTMLCOL:
         case TMATHMLCOL:
         case TICONICCOL:
             Append(u"color ");
             nc = pNode->GetToken().cMathChar.toUInt32(16);
-            Append( starmathdatabase::Identify_Color_Parser( nc ).pIdent );
+            Append( starmathdatabase::Identify_Color_Parser( nc ).aIdent );
             break;
         case TRGB:
             nc = pNode->GetToken().cMathChar.toUInt32(16);

Reply via email to