123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- #include "var.hpp"
- #include "inter.hpp"
- #include "__gc.hpp"
- using namespace aFuncore;
- using namespace aFuntool;
- aFuncore::Var::Var(Object *data_, Inter *inter_) : data{data_}, inter{inter_->base} {
- addObject(inter->getGcRecord()->var);
- }
- aFuncore::VarSpace::VarSpace(Inter *inter_) : count{0}, var{}, inter{inter_->base} {
- addObject(inter->getGcRecord()->varspace);
- }
- /**
- * 访问指定变量
- * @param name 变量名
- * @return
- */
- Var *aFuncore::VarSpace::findVar(const std::string &name){
- size_t index = time33(name) % VAR_HASH_SIZE;
- for (auto tmp = var[index]; tmp != nullptr; tmp = tmp->next) {
- if (tmp->name == name)
- return tmp->var;
- }
- return nullptr;
- }
- /**
- * 定义变量
- * @param name 变量名
- * @param data 变量(Object)
- * @return
- */
- VarOperationFlat aFuncore::VarSpace::defineVar(const std::string &name, Object *data){
- size_t index = time33(name) % VAR_HASH_SIZE;
- auto tmp = &var[index];
- for (NULL; *tmp != nullptr; tmp = &(*tmp)->next) {
- if ((*tmp)->name == name)
- return vof_redefine_var;
- }
- (*tmp) = new VarCup;
- (*tmp)->name = name;
- (*tmp)->var = new Var(data, inter);
- count++;
- return vof_success;
- }
- /**
- * 定义变量
- * @param name 变量名
- * @param data 变量(Var)
- * @return
- */
- VarOperationFlat aFuncore::VarSpace::defineVar(const std::string &name, Var *data){
- size_t index = time33(name) % VAR_HASH_SIZE;
- auto tmp = &var[index];
- for (NULL; *tmp != nullptr; tmp = &(*tmp)->next) {
- if ((*tmp)->name == name)
- return vof_redefine_var;
- }
- (*tmp) = new VarCup;
- (*tmp)->name = name;
- (*tmp)->var = data;
- count++;
- return vof_success;
- }
- /**
- * 设定变量的值
- * @param name 变量名
- * @param data 变量
- * @return
- */
- VarOperationFlat aFuncore::VarSpace::setVar(const std::string &name, Object *data){
- size_t index = time33(name) % VAR_HASH_SIZE;
- for (auto tmp = var[index]; tmp != nullptr; tmp = tmp->next) {
- if (tmp->name == name) {
- tmp->var->setData(data);
- return vof_success;
- }
- }
- return vof_not_var;
- }
- /**
- * 删除变量
- * @param name 变量名
- * @return
- */
- VarOperationFlat aFuncore::VarSpace::delVar(const std::string &name){
- size_t index = time33(name) % VAR_HASH_SIZE;
- for (auto tmp = var[index]; tmp != nullptr && tmp->next != nullptr; tmp = tmp->next) {
- if (tmp->next->name == name) {
- auto del = tmp->next;
- tmp->next = del->next;
- delete del; // 删除 VarCup
- count--;
- return vof_success;
- }
- }
- return vof_not_var;
- }
- aFuncore::VarSpace::~VarSpace(){
- for (auto &cup : var) {
- for (VarCup *next; cup != nullptr; cup = next) {
- next = cup->next;
- delete cup;
- }
- }
- }
- /**
- * 定义变量
- * 若启用保护且变量名存在,则返回错误redefine
- * 若启用保护则返回错误fail
- * @param name 变量名
- * @param data 变量(Object)
- * @return
- */
- VarOperationFlat aFuncore::ProtectVarSpace::defineVar(const std::string &name, Object *data){
- if (is_protect)
- return findVar(name) ? vof_redefine_var : vof_fail;
- return VarSpace::defineVar(name, data);
- }
- /**
- * 定义变量
- * 若启用保护且变量名存在,则返回错误redefine
- * 若启用保护则返回错误fail
- * @param name 变量名
- * @param data 变量(Var)
- * @return
- */
- VarOperationFlat aFuncore::ProtectVarSpace::defineVar(const std::string &name, Var *data){
- if (is_protect)
- return findVar(name) ? vof_redefine_var : vof_fail;
- return VarSpace::defineVar(name, data);
- }
- /**
- * 设定变量的值
- * 若启用保护且变量名存在,则返回错误fail
- * 若启用保护则返回错误 not_var
- * @param name 变量名
- * @param data 变量(Var)
- * @return
- */
- VarOperationFlat aFuncore::ProtectVarSpace::setVar(const std::string &name, Object *data){
- if (is_protect)
- return findVar(name) ? vof_fail : vof_not_var;
- return VarSpace::setVar(name, data);
- }
- /**
- * 删除变量
- * 若启用保护且变量名存在,则返回错误fail
- * 若启用保护则返回错误 not_var
- * @param name 变量名
- * @param data 变量(Var)
- * @return
- */
- VarOperationFlat aFuncore::ProtectVarSpace::delVar(const std::string &name){
- if (is_protect)
- return findVar(name) ? vof_fail : vof_not_var;
- return VarSpace::delVar(name);
- }
- /**
- * 访问变量
- * @param name 变量名
- * @return
- */
- Var *aFuncore::VarList::findVar(const std::string &name){
- Var *ret = nullptr;
- for (auto tmp = this; tmp != nullptr && ret == nullptr; tmp = tmp->next)
- ret = tmp->varspace->findVar(name);
- return ret;
- }
- /**
- * 定义变量
- * 若定义出现redefine则退出报错
- * 若出现fail则跳到下一个变量空间尝试定义
- * @param name 变量名
- * @param data 变量(Object)
- * @return
- */
- bool aFuncore::VarList::defineVar(const std::string &name, Object *data){
- VarOperationFlat ret = vof_fail;
- for (auto tmp = this; tmp != nullptr && ret == vof_fail; tmp = tmp->next)
- ret = tmp->varspace->defineVar(name, data);
- return ret == vof_success;
- }
- /**
- * 定义变量
- * 若定义出现redefine则退出报错
- * 若出现fail则跳到下一个变量空间尝试定义
- * @param name 变量名
- * @param data 变量(Var)
- * @return
- */
- bool aFuncore::VarList::defineVar(const std::string &name, Var *data){
- VarOperationFlat ret = vof_fail;
- for (auto tmp = this; tmp != nullptr && ret == vof_fail; tmp = tmp->next)
- ret = tmp->varspace->defineVar(name, data);
- return ret == vof_success;
- }
- /**
- * 设置变量的值
- * 若not_var则跳到下一个变量空间
- * 若fail则结束
- * @param name 变量名
- * @param data 数据
- * @return
- */
- bool aFuncore::VarList::setVar(const std::string &name, Object *data){
- VarOperationFlat ret = vof_not_var;
- for (auto tmp = this; tmp != nullptr && ret == vof_not_var; tmp = tmp->next)
- ret = tmp->varspace->setVar(name, data);
- return ret == vof_success;
- }
- /**
- * 删除变量
- * 若not_var则跳到下一个变量空间
- * 若fail则结束
- * @param name
- * @return
- */
- bool aFuncore::VarList::delVar(const std::string &name){
- VarOperationFlat ret = vof_not_var;
- for (auto tmp = this; tmp != nullptr && ret == vof_not_var; tmp = tmp->next)
- ret = tmp->varspace->delVar(name);
- return ret == vof_success;
- }
- /**
- * 在指定位置断开varlist
- * @param varlist
- */
- void aFuncore::VarList::disconnect(VarList *varlist){
- for (VarList *tmp = this; tmp != nullptr; tmp = tmp->next) {
- if (tmp->next == varlist) {
- tmp->next = nullptr;
- return;
- }
- }
- }
- /**
- * 删除所有varlist
- */
- void VarList::destructAll(){
- for (VarList *tmp=this, *n; tmp != nullptr; tmp = n) {
- n = tmp->next;
- delete tmp;
- }
- }
|