1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 14:07:45 +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:
Max Wipfli 2021-06-28 11:02:18 +02:00 committed by Andreas Kling
parent 13b2067da6
commit e0ed160372
3 changed files with 11 additions and 26 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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;