mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:37:35 +00:00
LibJS: Make Map iterators independent of the underlying hashmap
This implements ordered maps as a pair of an RBTree for key order, and an underlying unordered hash map for storage. Fixes (part of) #11004.
This commit is contained in:
parent
e7dea10381
commit
4a73ec07c5
8 changed files with 153 additions and 19 deletions
|
@ -22,6 +22,65 @@ Map::~Map()
|
|||
{
|
||||
}
|
||||
|
||||
// 24.1.3.1 Map.prototype.clear ( ), https://tc39.es/ecma262/#sec-map.prototype.clear
|
||||
void Map::map_clear()
|
||||
{
|
||||
m_keys.clear();
|
||||
m_entries.clear();
|
||||
}
|
||||
|
||||
// 24.1.3.3 Map.prototype.delete ( key ), https://tc39.es/ecma262/#sec-map.prototype.delete
|
||||
bool Map::map_remove(Value const& key)
|
||||
{
|
||||
Optional<size_t> index;
|
||||
|
||||
for (auto it = m_keys.begin(); it != m_keys.end(); ++it) {
|
||||
if (ValueTraits::equals(*it, key)) {
|
||||
index = it.key();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!index.has_value())
|
||||
return false;
|
||||
|
||||
m_keys.remove(*index);
|
||||
m_entries.remove(key);
|
||||
return true;
|
||||
}
|
||||
|
||||
// 24.1.3.6 Map.prototype.get ( key ), https://tc39.es/ecma262/#sec-map.prototype.get
|
||||
Optional<Value> Map::map_get(Value const& key) const
|
||||
{
|
||||
if (auto it = m_entries.find(key); it != m_entries.end())
|
||||
return it->value;
|
||||
return {};
|
||||
}
|
||||
|
||||
// 24.1.3.7 Map.prototype.has ( key ), https://tc39.es/ecma262/#sec-map.prototype.has
|
||||
bool Map::map_has(Value const& key) const
|
||||
{
|
||||
return m_entries.contains(key);
|
||||
}
|
||||
|
||||
// 24.1.3.9 Map.prototype.set ( key, value ), https://tc39.es/ecma262/#sec-map.prototype.set
|
||||
void Map::map_set(Value const& key, Value value)
|
||||
{
|
||||
auto it = m_entries.find(key);
|
||||
if (it != m_entries.end()) {
|
||||
it->value = value;
|
||||
} else {
|
||||
auto index = m_next_insertion_id++;
|
||||
m_keys.insert(index, key);
|
||||
m_entries.set(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
size_t Map::map_size() const
|
||||
{
|
||||
return m_keys.size();
|
||||
}
|
||||
|
||||
void Map::visit_edges(Cell::Visitor& visitor)
|
||||
{
|
||||
Base::visit_edges(visitor);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue