mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:17:44 +00:00
AK: Use OrderedHashMap in JsonObject
This changes JsonObject to use the new OrderedHashMap instead of an extra vector for tracking the insertion order. This also adds a default value for the KeyTraits template argument in OrderedHashMap. Furthermore, it fixes two cases where code iterating over a JsonObject relied on the value argument being copied before invoking the callback.
This commit is contained in:
parent
13b2067da6
commit
e0ed160372
3 changed files with 11 additions and 26 deletions
|
@ -78,7 +78,7 @@ using OrderedHashTable = HashTable<T, TraitsForT, true>;
|
||||||
template<typename K, typename V, typename KeyTraits = Traits<K>, bool IsOrdered = false>
|
template<typename K, typename V, typename KeyTraits = Traits<K>, bool IsOrdered = false>
|
||||||
class HashMap;
|
class HashMap;
|
||||||
|
|
||||||
template<typename K, typename V, typename KeyTraits>
|
template<typename K, typename V, typename KeyTraits = Traits<K>>
|
||||||
using OrderedHashMap = HashMap<K, V, KeyTraits, true>;
|
using OrderedHashMap = HashMap<K, V, KeyTraits, true>;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|
|
@ -21,32 +21,26 @@ public:
|
||||||
~JsonObject() = default;
|
~JsonObject() = default;
|
||||||
|
|
||||||
JsonObject(JsonObject const& other)
|
JsonObject(JsonObject const& other)
|
||||||
: m_order(other.m_order)
|
: m_members(other.m_members)
|
||||||
, m_members(other.m_members)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject(JsonObject&& other)
|
JsonObject(JsonObject&& other)
|
||||||
: m_order(move(other.m_order))
|
: m_members(move(other.m_members))
|
||||||
, m_members(move(other.m_members))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject& operator=(JsonObject const& other)
|
JsonObject& operator=(JsonObject const& other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
if (this != &other)
|
||||||
m_members = other.m_members;
|
m_members = other.m_members;
|
||||||
m_order = other.m_order;
|
|
||||||
}
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject& operator=(JsonObject&& other)
|
JsonObject& operator=(JsonObject&& other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
if (this != &other)
|
||||||
m_members = move(other.m_members);
|
m_members = move(other.m_members);
|
||||||
m_order = move(other.m_order);
|
|
||||||
}
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,27 +74,19 @@ public:
|
||||||
|
|
||||||
void set(String const& key, JsonValue value)
|
void set(String const& key, JsonValue value)
|
||||||
{
|
{
|
||||||
if (m_members.set(key, move(value)) == HashSetResult::ReplacedExistingEntry)
|
m_members.set(key, move(value));
|
||||||
m_order.remove(m_order.find_first_index(key).value());
|
|
||||||
m_order.append(key);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
void for_each_member(Callback callback) const
|
void for_each_member(Callback callback) const
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_order.size(); ++i) {
|
for (auto& member : m_members)
|
||||||
auto property = m_order[i];
|
callback(member.key, member.value);
|
||||||
callback(property, m_members.get(property).value());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool remove(String const& key)
|
bool remove(String const& key)
|
||||||
{
|
{
|
||||||
if (m_members.remove(key)) {
|
return m_members.remove(key);
|
||||||
m_order.remove(m_order.find_first_index(key).value());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Builder>
|
template<typename Builder>
|
||||||
|
@ -112,8 +98,7 @@ public:
|
||||||
String to_string() const { return serialized<StringBuilder>(); }
|
String to_string() const { return serialized<StringBuilder>(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Vector<String> m_order;
|
OrderedHashMap<String, JsonValue> m_members;
|
||||||
HashMap<String, JsonValue> m_members;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Builder>
|
template<typename Builder>
|
||||||
|
|
|
@ -376,7 +376,7 @@ RefPtr<Sheet> Sheet::from_json(const JsonObject& object, Workbook& workbook)
|
||||||
format.background_color = Color::from_string(value.as_string());
|
format.background_color = Color::from_string(value.as_string());
|
||||||
};
|
};
|
||||||
|
|
||||||
cells.for_each_member([&](auto& name, JsonValue& value) {
|
cells.for_each_member([&](auto& name, JsonValue const& value) {
|
||||||
auto position_option = sheet->parse_cell_name(name);
|
auto position_option = sheet->parse_cell_name(name);
|
||||||
if (!position_option.has_value())
|
if (!position_option.has_value())
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue