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)
void JsonSerializer::startGroup(const std::string &name)
{
auto group = std::make_unique<js::Value>(js::kObjectType);
mGroupValueStack.push(std::move(group));
mGroupValueStack.push(SortedValueGroup());
mGroupNameStack.push(name);
}
void JsonSerializer::endGroup()
{
ValuePointer group = std::move(mGroupValueStack.top());
std::string name = std::move(mGroupNameStack.top());
SortedValueGroup group = std::move(mGroupValueStack.top());
std::string name = std::move(mGroupNameStack.top());
mGroupValueStack.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)
{
rapidjson::Value tag(name.c_str(), mAllocator);
unsigned char hash[angle::base::kSHA1Length];
angle::base::SHA1HashBytes(blob, length, hash);
std::ostringstream os;
......@@ -70,7 +68,7 @@ void JsonSerializer::addCString(const std::string &name, const char *value)
{
rapidjson::Value tag(name.c_str(), 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)
......@@ -78,6 +76,21 @@ void JsonSerializer::addString(const std::string &name, const std::string &value
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
{
return mResult.c_str();
......@@ -95,7 +108,7 @@ void JsonSerializer::endDocument()
ASSERT(!mGroupNameStack.empty());
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();
mGroupNameStack.pop();
......@@ -114,4 +127,15 @@ size_t JsonSerializer::length() const
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
......@@ -17,6 +17,7 @@
#include <rapidjson/document.h>
#include <map>
#include <memory>
#include <sstream>
#include <stack>
......@@ -73,22 +74,20 @@ class JsonSerializer : public angle::NonCopyable
template <typename T>
void addScalar(const std::string &name, T value)
{
rapidjson::Value tag(name.c_str(), mAllocator);
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>
void addVector(const std::string &name, const std::vector<T> &value)
{
rapidjson::Value tag(name.c_str(), mAllocator);
rapidjson::Value array(rapidjson::kArrayType);
array.SetArray();
for (typename StoreAs<T>::Type v : value)
array.PushBack(v, mAllocator);
mGroupValueStack.top()->AddMember(tag, array, mAllocator);
mGroupValueStack.top().insert(std::make_pair(name, std::move(array)));
}
template <typename T>
......@@ -97,13 +96,19 @@ class JsonSerializer : public angle::NonCopyable
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:
using SortedValueGroup = std::multimap<std::string, rapidjson::Value>;
rapidjson::Value makeValueGroup(SortedValueGroup &group);
using ValuePointer = std::unique_ptr<rapidjson::Value>;
rapidjson::Document mDoc;
rapidjson::Document::AllocatorType &mAllocator;
std::stack<std::string> mGroupNameStack;
std::stack<ValuePointer> mGroupValueStack;
std::stack<SortedValueGroup> mGroupValueStack;
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