253 lines
7.2 KiB
C++
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;
|
|
}
|
|
|
|
}; |