crosslang/src/types/ittr.cpp

253 lines
7.2 KiB
C++

#include "CrossLang.hpp"
namespace Tesses::CrossLang
{
bool TCustomEnumerator::MoveNext(GC* ls)
{
GCList ls2(ls);
auto res = this->dict->CallMethod(ls2,"MoveNext",{});
bool out;
if(GetObject(res,out)) return out;
return false;
}
TObject TCustomEnumerator::GetCurrent(GCList& ls)
{
TObject res=Undefined();
ls.GetGC()->BarrierBegin();
auto getCurrent = this->dict->GetValue("getCurrent");
TCallable* call;
if(GetObjectHeap(getCurrent,call))
{
ls.GetGC()->BarrierEnd();
res=call->Call(ls,{});
ls.GetGC()->BarrierBegin();
}else{
res=this->dict->GetValue("Current");
}
ls.GetGC()->BarrierEnd();
return res;
}
void TCustomEnumerator::Mark()
{
if(this->marked) return;
this->dict->Mark();
}
TCustomEnumerator* TCustomEnumerator::Create(GCList* ls, TDictionary* dict)
{
TCustomEnumerator* customEnum = new TCustomEnumerator();
customEnum->dict = dict;
GC* _gc = ls->GetGC();
ls->Add(customEnum);
_gc->Watch(customEnum);
return customEnum;
}
TCustomEnumerator* TCustomEnumerator::Create(GCList& ls, TDictionary* dict)
{
TCustomEnumerator* customEnum = new TCustomEnumerator();
customEnum->dict = dict;
GC* _gc = ls.GetGC();
ls.Add(customEnum);
_gc->Watch(customEnum);
return customEnum;
}
TEnumerator* TEnumerator::CreateFromObject(GCList& ls, TObject obj)
{
std::string str;
TList* mls;
TDictionary* dict;
TEnumerator* enumerator;
if(GetObject(obj,str))
{
return TStringEnumerator::Create(ls, str);
}
else if(GetObjectHeap(obj,mls))
{
return TListEnumerator::Create(ls,mls);
}
else if(GetObjectHeap(obj,dict))
{
auto res=dict->CallMethod(ls,"GetEnumerator",{});
if(GetObjectHeap(res,dict))
{
return TCustomEnumerator::Create(ls,dict);
}
else if(GetObjectHeap(res,enumerator))
{
return enumerator;
}
}
return nullptr;
}
TVFSPathEnumerator* TVFSPathEnumerator::Create(GCList& ls, Tesses::Framework::Filesystem::VFSPathEnumerator enumerator)
{
TVFSPathEnumerator* vfspathe = new TVFSPathEnumerator();
vfspathe->enumerator = enumerator;
GC* _gc = ls.GetGC();
ls.Add(vfspathe);
_gc->Watch(vfspathe);
return vfspathe;
}
TVFSPathEnumerator* TVFSPathEnumerator::Create(GCList* ls, Tesses::Framework::Filesystem::VFSPathEnumerator enumerator)
{
TVFSPathEnumerator* vfspathe = new TVFSPathEnumerator();
vfspathe->enumerator = enumerator;
GC* _gc = ls->GetGC();
ls->Add(vfspathe);
_gc->Watch(vfspathe);
return vfspathe;
}
bool TVFSPathEnumerator::MoveNext(GC* ls)
{
return enumerator.MoveNext();
}
TObject TVFSPathEnumerator::GetCurrent(GCList& ls)
{
return enumerator.Current;
}
TDictionaryEnumerator* TDictionaryEnumerator::Create(GCList& ls, TDictionary* dict)
{
TDictionaryEnumerator* dicte=new TDictionaryEnumerator();
dicte->dict = dict;
dicte->hasStarted=false;
GC* _gc = ls.GetGC();
ls.Add(dicte);
_gc->Watch(dicte);
return dicte;
}
TDictionaryEnumerator* TDictionaryEnumerator::Create(GCList* ls, TDictionary* dict)
{
TDictionaryEnumerator* dicte=new TDictionaryEnumerator();
dicte->dict = dict;
dicte->hasStarted=false;
GC* _gc = ls->GetGC();
ls->Add(dicte);
_gc->Watch(dicte);
return dicte;
}
bool TDictionaryEnumerator::MoveNext(GC* ls)
{
if(!this->hasStarted)
{
this->hasStarted=true;
this->ittr = this->dict->items.begin();
return !this->dict->items.empty();
}
else
{
this->ittr++;
return this->ittr != this->dict->items.end();
}
}
TObject TDictionaryEnumerator::GetCurrent(GCList& ls)
{
if(!this->hasStarted) return Undefined();
if(this->ittr != this->dict->items.end())
{
ls.GetGC()->BarrierBegin();
std::string key = this->ittr->first;
TObject value = this->ittr->second;
auto kvp = TDictionary::Create(ls);
kvp->SetValue("Key",key);
kvp->SetValue("Value",value);
ls.GetGC()->BarrierEnd();
return kvp;
}
return Undefined();
}
void TDictionaryEnumerator::Mark()
{
if(this->marked) return;
this->marked=true;
this->dict->Mark();
}
TListEnumerator* TListEnumerator::Create(GCList& ls, TList* list)
{
TListEnumerator* liste=new TListEnumerator();
liste->ls = list;
liste->index = -1;
GC* _gc = ls.GetGC();
ls.Add(liste);
_gc->Watch(liste);
return liste;
}
TListEnumerator* TListEnumerator::Create(GCList* ls, TList* list)
{
TListEnumerator* liste=new TListEnumerator();
liste->ls = list;
liste->index = -1;
GC* _gc = ls->GetGC();
ls->Add(liste);
_gc->Watch(liste);
return liste;
}
bool TListEnumerator::MoveNext(GC* ls)
{
this->index++;
return this->index >= 0 && this->index < this->ls->Count();
}
TObject TListEnumerator::GetCurrent(GCList& ls)
{
if(this->index < -1) return nullptr;
if(this->ls->Count() == 0) return nullptr;
if(this->index >= this->ls->Count()) return nullptr;
ls.GetGC()->BarrierBegin();
TObject o = this->ls->Get(index);
ls.GetGC()->BarrierEnd();
return o;
}
void TListEnumerator::Mark()
{
if(this->marked) return;
this->marked = true;
this->ls->Mark();
}
TStringEnumerator* TStringEnumerator::Create(GCList& ls,std::string str)
{
TStringEnumerator* stre=new TStringEnumerator();
stre->str = str;
stre->hasStarted=false;
GC* _gc = ls.GetGC();
ls.Add(stre);
_gc->Watch(stre);
return stre;
}
TStringEnumerator* TStringEnumerator::Create(GCList* ls,std::string str)
{
TStringEnumerator* stre=new TStringEnumerator();
stre->str = str;
stre->hasStarted=false;
GC* _gc = ls->GetGC();
ls->Add(stre);
_gc->Watch(stre);
return stre;
}
bool TStringEnumerator::MoveNext(GC* ls)
{
if(!this->hasStarted)
{
this->hasStarted=true;
this->index = 0;
return !this->str.empty();
}
else
{
if(this->index >= this->str.size()) return false;
this->index++;
return this->index < this->str.size();
}
}
TObject TStringEnumerator::GetCurrent(GCList& ls)
{
if(!this->hasStarted) return nullptr;
if(this->index < this->str.size()) return this->str[this->index];
return nullptr;
}
};