object-value.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "object-value.h"
  2. #include "inter.h"
  3. #include "init.h"
  4. namespace aFuncore {
  5. Var::Var(Object *data_, Inter &inter) : Object("Var", inter), data{data_}, env{inter.getEnvironment()}{
  6. }
  7. Var::Var(Object *data_, Environment &env_) : Object("Var", env_), data{data_}, env{env_}{
  8. }
  9. VarSpace::VarSpace(Inter &inter) : Object("VarSpace", inter), env{inter.getEnvironment()}{
  10. }
  11. VarSpace::VarSpace(Environment &env_) : Object("VarSpace", env_), env{env_}{
  12. }
  13. void Var::linkObject(std::queue<Object *> &queue) {
  14. queue.push(getData());
  15. }
  16. Object *Var::getData() {
  17. std::unique_lock<std::mutex> mutex{lock};
  18. return data;
  19. }
  20. void Var::setData(Object *data_) {
  21. std::unique_lock<std::mutex> mutex{lock};
  22. data = data_;
  23. }
  24. /**
  25. * 访问指定变量
  26. * @param name 变量名
  27. * @return
  28. */
  29. Var *VarSpace::findVar(const std::string &name){
  30. std::unique_lock<std::mutex> mutex{lock};
  31. auto v = var.find(name);
  32. if (v == var.end())
  33. return nullptr;
  34. return v->second;
  35. }
  36. /**
  37. * 定义变量
  38. * @param name 变量名
  39. * @param data 变量(Object)
  40. * @return
  41. */
  42. VarSpace::VarOperationFlat VarSpace::defineVar(const std::string &name, Object *data) {
  43. std::unique_lock<std::mutex> mutex{lock};
  44. if (var.find(name) != var.end())
  45. return vof_redefine_var;
  46. auto new_var = new Var(data, env);
  47. var.emplace(name, new_var);
  48. new_var->delReference();
  49. return vof_success;
  50. }
  51. /**
  52. * 定义变量
  53. * @param name 变量名
  54. * @param data 变量(Var)
  55. * @return
  56. */
  57. VarSpace::VarOperationFlat VarSpace::defineVar(const std::string &name, Var *data){
  58. std::unique_lock<std::mutex> mutex{lock};
  59. if (var.find(name) != var.end())
  60. return vof_redefine_var;
  61. var.emplace(name, data);
  62. return vof_success;
  63. }
  64. /**
  65. * 设定变量的值
  66. * @param name 变量名
  67. * @param data 变量
  68. * @return
  69. */
  70. VarSpace::VarOperationFlat VarSpace::setVar(const std::string &name, Object *data){
  71. std::unique_lock<std::mutex> mutex{lock};
  72. auto v = var.find(name);
  73. if (v == var.end())
  74. return vof_not_var;
  75. v->second->setData(data);
  76. return vof_success;
  77. }
  78. /**
  79. * 删除变量
  80. * @param name 变量名
  81. * @return
  82. */
  83. VarSpace::VarOperationFlat VarSpace::delVar(const std::string &name){
  84. std::unique_lock<std::mutex> mutex{lock};
  85. auto v = var.find(name);
  86. if (v == var.end())
  87. return vof_not_var;
  88. var.erase(v);
  89. return vof_success;
  90. }
  91. void VarSpace::linkObject(std::queue<Object *> &queue) {
  92. for (auto tmp : var)
  93. queue.push(tmp.second);
  94. }
  95. /**
  96. * 定义变量
  97. * 若启用保护且变量名存在,则返回错误redefine
  98. * 若启用保护则返回错误fail
  99. * @param name 变量名
  100. * @param data 变量(Object)
  101. * @return
  102. */
  103. VarSpace::VarOperationFlat ProtectVarSpace::defineVar(const std::string &name, Object *data){
  104. return VarSpace::defineVar(name, data);
  105. }
  106. /**
  107. * 定义变量
  108. * 若启用保护且变量名存在,则返回错误redefine
  109. * 若启用保护则返回错误fail
  110. * @param name 变量名
  111. * @param data 变量(Var)
  112. * @return
  113. */
  114. VarSpace::VarOperationFlat ProtectVarSpace::defineVar(const std::string &name, Var *data){
  115. return VarSpace::defineVar(name, data);
  116. }
  117. /**
  118. * 设定变量的值
  119. * 若启用保护且变量名存在,则返回错误fail
  120. * 若启用保护则返回错误 not_var
  121. * @param name 变量名
  122. * @param data 变量(Var)
  123. * @return
  124. */
  125. VarSpace::VarOperationFlat ProtectVarSpace::setVar(const std::string &name, Object *data){
  126. if (is_protect)
  127. return findVar(name) ? vof_fail : vof_not_var;
  128. return VarSpace::setVar(name, data);
  129. }
  130. /**
  131. * 删除变量
  132. * 若启用保护且变量名存在,则返回错误fail
  133. * 若启用保护则返回错误 not_var
  134. * @param name 变量名
  135. * @param data 变量(Var)
  136. * @return
  137. */
  138. VarSpace::VarOperationFlat ProtectVarSpace::delVar(const std::string &name){
  139. if (is_protect)
  140. return findVar(name) ? vof_fail : vof_not_var;
  141. return VarSpace::delVar(name);
  142. }
  143. bool Function::isInfix() {
  144. return false;
  145. }
  146. bool CallBackVar::isCallBack(Inter &inter, Activation &activation) {
  147. return true;
  148. }
  149. }