#include "CrossLang.hpp" namespace Tesses::CrossLang { TAssociativeArray *TAssociativeArray::Create(GCList &ls) { TAssociativeArray *list = new TAssociativeArray(); std::shared_ptr _gc = ls.GetGC(); ls.Add(list); _gc->Watch(list); return list; } TAssociativeArray *TAssociativeArray::Create(GCList *ls) { TAssociativeArray *list = new TAssociativeArray(); std::shared_ptr _gc = ls->GetGC(); ls->Add(list); _gc->Watch(list); return list; } void TAssociativeArray::Set(std::shared_ptr gc, TObject key, TObject value) { if (std::holds_alternative(key)) return; gc->BarrierBegin(); for (auto index = this->items.begin(); index < this->items.end(); index++) { auto first = index->first; gc->BarrierEnd(); auto eq = Equals(gc, key, first); gc->BarrierBegin(); if (eq) { if (std::holds_alternative(value)) { this->items.erase(index); } else { index->second = value; } gc->BarrierEnd(); return; } } this->items.push_back(std::pair(key, value)); gc->BarrierEnd(); } TObject TAssociativeArray::Get(std::shared_ptr gc, TObject key) { if (std::holds_alternative(key)) return Undefined(); gc->BarrierBegin(); for (auto &item : this->items) { auto first = item.first; gc->BarrierEnd(); auto eq = Equals(gc, key, first); gc->BarrierBegin(); if (eq) { gc->BarrierEnd(); return item.second; } } gc->BarrierEnd(); return Undefined(); } TObject TAssociativeArray::GetKey(int64_t index) { if (index >= 0 && index < (int64_t)this->items.size()) { return this->items[index].first; } return Undefined(); } TObject TAssociativeArray::GetValue(int64_t index) { if (index >= 0 && index < (int64_t)this->items.size()) { return this->items[index].second; } return Undefined(); } void TAssociativeArray::SetKey(int64_t index, TObject key) { if (std::holds_alternative(key)) return; if (index >= 0 && index < (int64_t)this->items.size()) { this->items[index].first = key; } } void TAssociativeArray::SetValue(int64_t index, TObject value) { if (std::holds_alternative(value)) return; if (index >= 0 && index < (int64_t)this->items.size()) { this->items[index].first = value; } } int64_t TAssociativeArray::Count() { return (int64_t)this->items.size(); } void TAssociativeArray::Mark() { if (this->marked) return; this->marked = true; for (auto &item : this->items) { GC::Mark(item.first); GC::Mark(item.second); } } } // namespace Tesses::CrossLang