summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-10-21 19:56:59 +0500
committerMike Kaganski <mike.kaganski@collabora.com>2024-10-21 20:28:43 +0200
commit7b2ea917cecbaa7deb67559fe09531bb2a3d98eb (patch)
tree9c4cf54910b874a77222d83641f255a6f3e2c9d1
parentaa963e6273541e81921dffda85cb1a42ce8e6de4 (diff)
Optimize JsonToPropertyValues a bit
1. Make it take string view: helps to avoid extra string allocation e.g. in desktop::jsonToPropertyValuesVector, and will help more, when C++26 stringstream ctor taking string view is available. 2. Factor out a function taking boost::property_tree::ptree, making implementation simpler for [][]com.sun.star.beans.PropertyValue and []com.sun.star.beans.PropertyValue, without writing a child node to a JSON string, and parsing it again. Change-Id: I16ac2641633ea67a7c9c054c9df09a790500e6fb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175361 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r--comphelper/qa/unit/propertyvalue.cxx2
-rw-r--r--comphelper/source/misc/sequenceashashmap.cxx25
-rw-r--r--include/comphelper/propertysequence.hxx2
-rw-r--r--sfx2/qa/cppunit/doc.cxx2
-rw-r--r--sw/qa/uibase/shells/shells.cxx16
-rw-r--r--sw/qa/uibase/shells/textsh.cxx2
6 files changed, 24 insertions, 25 deletions
diff --git a/comphelper/qa/unit/propertyvalue.cxx b/comphelper/qa/unit/propertyvalue.cxx
index 877a964478ac..4523bb49d352 100644
--- a/comphelper/qa/unit/propertyvalue.cxx
+++ b/comphelper/qa/unit/propertyvalue.cxx
@@ -103,7 +103,7 @@ class MakePropertyValueTest : public CppUnit::TestFixture
]
}
}
-)json"_ostr);
+)json");
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), aRet.size());
beans::PropertyValue aFirst = aRet[0];
CPPUNIT_ASSERT_EQUAL(u"FieldType"_ustr, aFirst.Name);
diff --git a/comphelper/source/misc/sequenceashashmap.cxx b/comphelper/source/misc/sequenceashashmap.cxx
index ba4955e09780..9f8655f3d164 100644
--- a/comphelper/source/misc/sequenceashashmap.cxx
+++ b/comphelper/source/misc/sequenceashashmap.cxx
@@ -302,13 +302,10 @@ void SequenceAsHashMap::update(const SequenceAsHashMap& rUpdate)
}
}
-std::vector<css::beans::PropertyValue> JsonToPropertyValues(const OString& rJson)
+static std::vector<css::beans::PropertyValue> JsonToPropertyValues(const boost::property_tree::ptree& aTree)
{
std::vector<beans::PropertyValue> aArguments;
- boost::property_tree::ptree aTree, aNodeNull, aNodeValue;
- std::stringstream aStream((std::string(rJson)));
- boost::property_tree::read_json(aStream, aTree);
-
+ boost::property_tree::ptree aNodeNull, aNodeValue;
for (const auto& rPair : aTree)
{
const std::string& rType = rPair.second.get<std::string>("type", "");
@@ -364,10 +361,7 @@ std::vector<css::beans::PropertyValue> JsonToPropertyValues(const OString& rJson
else if (rType == "[]com.sun.star.beans.PropertyValue")
{
aNodeValue = rPair.second.get_child("value", aNodeNull);
- std::stringstream s;
- boost::property_tree::write_json(s, aNodeValue);
- std::vector<beans::PropertyValue> aPropertyValues = JsonToPropertyValues(OString(s.str()));
- aValue.Value <<= comphelper::containerToSequence(aPropertyValues);
+ aValue.Value <<= comphelper::containerToSequence(JsonToPropertyValues(aNodeValue));
}
else if (rType == "[][]com.sun.star.beans.PropertyValue")
{
@@ -375,10 +369,7 @@ std::vector<css::beans::PropertyValue> JsonToPropertyValues(const OString& rJson
std::vector<uno::Sequence<beans::PropertyValue>> aSeqs;
for (const auto& rItem : aNodeValue)
{
- std::stringstream s;
- boost::property_tree::write_json(s, rItem.second);
- std::vector<beans::PropertyValue> aPropertyValues = JsonToPropertyValues(OString(s.str()));
- aSeqs.push_back(comphelper::containerToSequence(aPropertyValues));
+ aSeqs.push_back(comphelper::containerToSequence(JsonToPropertyValues(rItem.second)));
}
aValue.Value <<= comphelper::containerToSequence(aSeqs);
}
@@ -389,6 +380,14 @@ std::vector<css::beans::PropertyValue> JsonToPropertyValues(const OString& rJson
return aArguments;
}
+std::vector<css::beans::PropertyValue> JsonToPropertyValues(std::string_view rJson)
+{
+ boost::property_tree::ptree aTree;
+ std::stringstream aStream((std::string(rJson)));
+ boost::property_tree::read_json(aStream, aTree);
+ return JsonToPropertyValues(aTree);
+}
+
} // namespace comphelper
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/comphelper/propertysequence.hxx b/include/comphelper/propertysequence.hxx
index e788f56f428f..787f96f3e855 100644
--- a/include/comphelper/propertysequence.hxx
+++ b/include/comphelper/propertysequence.hxx
@@ -53,7 +53,7 @@ namespace comphelper
return vResult;
}
- COMPHELPER_DLLPUBLIC std::vector<css::beans::PropertyValue> JsonToPropertyValues(const OString& rJson);
+ COMPHELPER_DLLPUBLIC std::vector<css::beans::PropertyValue> JsonToPropertyValues(std::string_view rJson);
} // namespace comphelper
diff --git a/sfx2/qa/cppunit/doc.cxx b/sfx2/qa/cppunit/doc.cxx
index 555c5f5aea78..92bfadd363e9 100644
--- a/sfx2/qa/cppunit/doc.cxx
+++ b/sfx2/qa/cppunit/doc.cxx
@@ -126,7 +126,7 @@ CPPUNIT_TEST_FIXTURE(Test, testSetDocumentPropertiesUpdate)
}
}
}
-)json"_ostr);
+)json");
uno::Sequence<beans::PropertyValue> aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:SetDocumentProperties"_ustr, aArgs);
diff --git a/sw/qa/uibase/shells/shells.cxx b/sw/qa/uibase/shells/shells.cxx
index 28a31a50ed28..b6e071d782d4 100644
--- a/sw/qa/uibase/shells/shells.cxx
+++ b/sw/qa/uibase/shells/shells.cxx
@@ -543,7 +543,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateBookmarks)
]
}
}
-)json"_ostr);
+)json");
uno::Sequence<beans::PropertyValue> aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateBookmarks"_ustr, aArgs);
@@ -829,7 +829,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateRefmarks)
]
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateFields"_ustr, aArgs);
@@ -887,7 +887,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateFieldmark)
}
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateTextFormField"_ustr, aArgs);
@@ -938,7 +938,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateSections)
]
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateSections"_ustr, aArgs);
@@ -1035,7 +1035,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateBookmark)
}
}
}
-)json"_ostr);
+)json");
uno::Sequence<beans::PropertyValue> aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateBookmark"_ustr, aArgs);
@@ -1089,7 +1089,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testUpdateRefmark)
}
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:UpdateField"_ustr, aArgs);
@@ -1127,7 +1127,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testDeleteBookmarks)
"value": "ZOTERO_BREF_"
}
}
-)json"_ostr);
+)json");
uno::Sequence<beans::PropertyValue> aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:DeleteBookmarks"_ustr, aArgs);
@@ -1164,7 +1164,7 @@ CPPUNIT_TEST_FIXTURE(SwUibaseShellsTest, testDeleteFields)
"value": "ZOTERO_ITEM CSL_CITATION"
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:DeleteFields"_ustr, aArgs);
diff --git a/sw/qa/uibase/shells/textsh.cxx b/sw/qa/uibase/shells/textsh.cxx
index 265ac4c7dff1..3721569977f0 100644
--- a/sw/qa/uibase/shells/textsh.cxx
+++ b/sw/qa/uibase/shells/textsh.cxx
@@ -56,7 +56,7 @@ CPPUNIT_TEST_FIXTURE(Test, testDeleteSections)
"value": "ZOTERO_BIBL"
}
}
-)json"_ostr);
+)json");
aArgs = comphelper::containerToSequence(aArgsVec);
dispatchCommand(mxComponent, u".uno:DeleteSections"_ustr, aArgs);