Commit 3116c91c by Gert Wollny Committed by Commit Bot

JsonSerializer: Sort group members before writing them out

Use a multimap to accumulate the values added to a group and then add them to the Json group when it is finished. Bug: angleproject:5853 Change-Id: Idbe82acc5f9a9671063f02bd1af039575aa52e87 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2824432 Commit-Queue: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com>
parent 45344f05
...@@ -33,24 +33,22 @@ void JsonSerializer::startDocument(const std::string &name) ...@@ -33,24 +33,22 @@ void JsonSerializer::startDocument(const std::string &name)
void JsonSerializer::startGroup(const std::string &name) void JsonSerializer::startGroup(const std::string &name)
{ {
auto group = std::make_unique<js::Value>(js::kObjectType); mGroupValueStack.push(SortedValueGroup());
mGroupValueStack.push(std::move(group));
mGroupNameStack.push(name); mGroupNameStack.push(name);
} }
void JsonSerializer::endGroup() void JsonSerializer::endGroup()
{ {
ValuePointer group = std::move(mGroupValueStack.top()); SortedValueGroup group = std::move(mGroupValueStack.top());
std::string name = std::move(mGroupNameStack.top()); std::string name = std::move(mGroupNameStack.top());
mGroupValueStack.pop(); mGroupValueStack.pop();
mGroupNameStack.pop(); mGroupNameStack.pop();
rapidjson::Value name_value(name.c_str(), mAllocator);
mGroupValueStack.top()->AddMember(name_value, *group, mAllocator); mGroupValueStack.top().insert(std::make_pair(name, makeValueGroup(group)));
} }
void JsonSerializer::addBlob(const std::string &name, const uint8_t *blob, size_t length) void JsonSerializer::addBlob(const std::string &name, const uint8_t *blob, size_t length)
{ {
rapidjson::Value tag(name.c_str(), mAllocator);
unsigned char hash[angle::base::kSHA1Length]; unsigned char hash[angle::base::kSHA1Length];
angle::base::SHA1HashBytes(blob, length, hash); angle::base::SHA1HashBytes(blob, length, hash);
std::ostringstream os; std::ostringstream os;
...@@ -70,7 +68,7 @@ void JsonSerializer::addCString(const std::string &name, const char *value) ...@@ -70,7 +68,7 @@ void JsonSerializer::addCString(const std::string &name, const char *value)
{ {
rapidjson::Value tag(name.c_str(), mAllocator); rapidjson::Value tag(name.c_str(), mAllocator);
rapidjson::Value val(value, mAllocator); rapidjson::Value val(value, mAllocator);
mGroupValueStack.top()->AddMember(tag, val, mAllocator); mGroupValueStack.top().insert(std::make_pair(name, std::move(val)));
} }
void JsonSerializer::addString(const std::string &name, const std::string &value) void JsonSerializer::addString(const std::string &name, const std::string &value)
...@@ -78,6 +76,21 @@ void JsonSerializer::addString(const std::string &name, const std::string &value ...@@ -78,6 +76,21 @@ void JsonSerializer::addString(const std::string &name, const std::string &value
addCString(name, value.c_str()); addCString(name, value.c_str());
} }
void JsonSerializer::addVectorOfStrings(const std::string &name,
const std::vector<std::string> &value)
{
rapidjson::Value array(rapidjson::kArrayType);
array.SetArray();
for (const std::string &v : value)
{
rapidjson::Value str(v.c_str(), mAllocator);
array.PushBack(str, mAllocator);
}
mGroupValueStack.top().insert(std::make_pair(name, std::move(array)));
}
const char *JsonSerializer::data() const const char *JsonSerializer::data() const
{ {
return mResult.c_str(); return mResult.c_str();
...@@ -95,7 +108,7 @@ void JsonSerializer::endDocument() ...@@ -95,7 +108,7 @@ void JsonSerializer::endDocument()
ASSERT(!mGroupNameStack.empty()); ASSERT(!mGroupNameStack.empty());
rapidjson::Value name_value(mGroupNameStack.top().c_str(), mAllocator); rapidjson::Value name_value(mGroupNameStack.top().c_str(), mAllocator);
mDoc.AddMember(name_value, *mGroupValueStack.top(), mAllocator); mDoc.AddMember(name_value, makeValueGroup(mGroupValueStack.top()), mAllocator);
mGroupValueStack.pop(); mGroupValueStack.pop();
mGroupNameStack.pop(); mGroupNameStack.pop();
...@@ -114,4 +127,15 @@ size_t JsonSerializer::length() const ...@@ -114,4 +127,15 @@ size_t JsonSerializer::length() const
return mResult.length(); return mResult.length();
} }
rapidjson::Value JsonSerializer::makeValueGroup(SortedValueGroup &group)
{
rapidjson::Value valueGroup(js::kObjectType);
for (auto &it : group)
{
rapidjson::Value tag(it.first.c_str(), mAllocator);
valueGroup.AddMember(tag, it.second, mAllocator);
}
return valueGroup;
}
} // namespace angle } // namespace angle
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <rapidjson/document.h> #include <rapidjson/document.h>
#include <map>
#include <memory> #include <memory>
#include <sstream> #include <sstream>
#include <stack> #include <stack>
...@@ -73,22 +74,20 @@ class JsonSerializer : public angle::NonCopyable ...@@ -73,22 +74,20 @@ class JsonSerializer : public angle::NonCopyable
template <typename T> template <typename T>
void addScalar(const std::string &name, T value) void addScalar(const std::string &name, T value)
{ {
rapidjson::Value tag(name.c_str(), mAllocator);
typename StoreAs<T>::Type v = value; typename StoreAs<T>::Type v = value;
mGroupValueStack.top()->AddMember(tag, v, mAllocator); mGroupValueStack.top().insert(std::make_pair(name, rapidjson::Value(v)));
} }
template <typename T> template <typename T>
void addVector(const std::string &name, const std::vector<T> &value) void addVector(const std::string &name, const std::vector<T> &value)
{ {
rapidjson::Value tag(name.c_str(), mAllocator);
rapidjson::Value array(rapidjson::kArrayType); rapidjson::Value array(rapidjson::kArrayType);
array.SetArray(); array.SetArray();
for (typename StoreAs<T>::Type v : value) for (typename StoreAs<T>::Type v : value)
array.PushBack(v, mAllocator); array.PushBack(v, mAllocator);
mGroupValueStack.top()->AddMember(tag, array, mAllocator); mGroupValueStack.top().insert(std::make_pair(name, std::move(array)));
} }
template <typename T> template <typename T>
...@@ -97,13 +96,19 @@ class JsonSerializer : public angle::NonCopyable ...@@ -97,13 +96,19 @@ class JsonSerializer : public angle::NonCopyable
addBlob(name, reinterpret_cast<const uint8_t *>(&value[0]), value.size() * sizeof(T)); addBlob(name, reinterpret_cast<const uint8_t *>(&value[0]), value.size() * sizeof(T));
} }
void addVectorOfStrings(const std::string &name, const std::vector<std::string> &value);
private: private:
using SortedValueGroup = std::multimap<std::string, rapidjson::Value>;
rapidjson::Value makeValueGroup(SortedValueGroup &group);
using ValuePointer = std::unique_ptr<rapidjson::Value>; using ValuePointer = std::unique_ptr<rapidjson::Value>;
rapidjson::Document mDoc; rapidjson::Document mDoc;
rapidjson::Document::AllocatorType &mAllocator; rapidjson::Document::AllocatorType &mAllocator;
std::stack<std::string> mGroupNameStack; std::stack<std::string> mGroupNameStack;
std::stack<ValuePointer> mGroupValueStack; std::stack<SortedValueGroup> mGroupValueStack;
std::string mResult; std::string mResult;
}; };
......
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