Path: blob/master/Common/include/Luau/InsertionOrderedMap.h
2727 views
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details1#pragma once23#include "Luau/Common.h"45#include <unordered_map>6#include <vector>7#include <type_traits>8#include <iterator>910namespace Luau11{1213template<typename K, typename V>14struct InsertionOrderedMap15{16static_assert(std::is_trivially_copyable_v<K>, "key must be trivially copyable");1718private:19using vec = std::vector<std::pair<K, V>>;2021public:22using iterator = typename vec::iterator;23using const_iterator = typename vec::const_iterator;2425void insert(K k, V v)26{27if (indices.count(k) != 0)28return;2930pairs.push_back(std::make_pair(k, std::move(v)));31indices[k] = pairs.size() - 1;32}3334void clear()35{36pairs.clear();37indices.clear();38}3940size_t size() const41{42LUAU_ASSERT(pairs.size() == indices.size());43return pairs.size();44}4546bool contains(const K& k) const47{48return indices.count(k) > 0;49}5051const V* get(const K& k) const52{53auto it = indices.find(k);54if (it == indices.end())55return nullptr;56else57return &pairs.at(it->second).second;58}5960V* get(const K& k)61{62auto it = indices.find(k);63if (it == indices.end())64return nullptr;65else66return &pairs.at(it->second).second;67}6869V& operator[](const K& k)70{71auto it = indices.find(k);72if (it == indices.end())73{74pairs.push_back(std::make_pair(k, V()));75indices[k] = pairs.size() - 1;76return pairs.back().second;77}78else79return pairs.at(it->second).second;80}8182const_iterator begin() const83{84return pairs.begin();85}8687const_iterator end() const88{89return pairs.end();90}9192iterator begin()93{94return pairs.begin();95}9697iterator end()98{99return pairs.end();100}101102const_iterator find(K k) const103{104auto indicesIt = indices.find(k);105if (indicesIt == indices.end())106return end();107else108return begin() + indicesIt->second;109}110111iterator find(K k)112{113auto indicesIt = indices.find(k);114if (indicesIt == indices.end())115return end();116else117return begin() + indicesIt->second;118}119120void erase(iterator it)121{122if (it == pairs.end())123return;124125K k = it->first;126auto indexIt = indices.find(k);127if (indexIt == indices.end())128return;129130size_t removed = indexIt->second;131indices.erase(indexIt);132pairs.erase(it);133134for (auto& [_, index] : indices)135{136if (index > removed)137--index;138}139}140141private:142vec pairs;143std::unordered_map<K, size_t> indices;144};145146} // namespace Luau147148149