mirror of
https://github.com/SerenityOS/serenity
synced 2024-07-21 18:15:58 +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
|
@ -78,7 +78,7 @@ using OrderedHashTable = HashTable<T, TraitsForT, true>;
|
|||
template<typename K, typename V, typename KeyTraits = Traits<K>, bool IsOrdered = false>
|
||||
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>;
|
||||
|
||||
template<typename T>
|
||||
|
|
|
@ -21,32 +21,26 @@ public:
|
|||
~JsonObject() = default;
|
||||
|
||||
JsonObject(JsonObject const& other)
|
||||
: m_order(other.m_order)
|
||||
, m_members(other.m_members)
|
||||
: m_members(other.m_members)
|
||||
{
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
if (this != &other) {
|
||||
if (this != &other)
|
||||
m_members = other.m_members;
|
||||
m_order = other.m_order;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
JsonObject& operator=(JsonObject&& other)
|
||||
{
|
||||
if (this != &other) {
|
||||
if (this != &other)
|
||||
m_members = move(other.m_members);
|
||||
m_order = move(other.m_order);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
@ -80,27 +74,19 @@ public:
|
|||
|
||||
void set(String const& key, JsonValue value)
|
||||
{
|
||||
if (m_members.set(key, move(value)) == HashSetResult::ReplacedExistingEntry)
|
||||
m_order.remove(m_order.find_first_index(key).value());
|
||||
m_order.append(key);
|
||||
m_members.set(key, move(value));
|
||||
}
|
||||
|
||||
template<typename Callback>
|
||||
void for_each_member(Callback callback) const
|
||||
{
|
||||
for (size_t i = 0; i < m_order.size(); ++i) {
|
||||
auto property = m_order[i];
|
||||
callback(property, m_members.get(property).value());
|
||||
}
|
||||
for (auto& member : m_members)
|
||||
callback(member.key, member.value);
|
||||
}
|
||||
|
||||
bool remove(String const& key)
|
||||
{
|
||||
if (m_members.remove(key)) {
|
||||
m_order.remove(m_order.find_first_index(key).value());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return m_members.remove(key);
|
||||
}
|
||||
|
||||
template<typename Builder>
|
||||
|
@ -112,8 +98,7 @@ public:
|
|||
String to_string() const { return serialized<StringBuilder>(); }
|
||||
|
||||
private:
|
||||
Vector<String> m_order;
|
||||
HashMap<String, JsonValue> m_members;
|
||||
OrderedHashMap<String, JsonValue> m_members;
|
||||
};
|
||||
|
||||
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());
|
||||
};
|
||||
|
||||
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);
|
||||
if (!position_option.has_value())
|
||||
return IterationDecision::Continue;
|
||||
|
|
Loading…
Reference in a new issue