var.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #ifndef AFUN_VAR_HPP
  2. #define AFUN_VAR_HPP
  3. #include "tool.hpp"
  4. #include "aFunCoreExport.h"
  5. namespace aFuncore {
  6. static const size_t VAR_HASH_SIZE = 100; // 环境变量哈希表大小
  7. typedef enum VarOperationFlat {
  8. vof_success = 0, // 成功
  9. vof_not_var = 1, // 变量不存在
  10. vof_redefine_var = 2, // 变量重复定义
  11. vof_fail = 3, // 存在其他错误
  12. } VarOperationFlat;
  13. class Var;
  14. class VarSpace;
  15. class VarList;
  16. class ProtectVarSpace;
  17. }
  18. #include "gc.hpp"
  19. #include "value.hpp"
  20. namespace aFuncore {
  21. class Var : public GcObject<class Var> {
  22. friend class Inter;
  23. Inter *inter;
  24. Object *data;
  25. public:
  26. Var(Object *data_, Inter *inter_);
  27. ~Var() override =default;
  28. virtual Object *getData() {return data;}
  29. virtual void setData(Object *data_) {data = data_;}
  30. };
  31. class VarSpace : public GcObject<class VarSpace> {
  32. friend class Inter;
  33. Inter *inter;
  34. struct VarCup {
  35. std::string name;
  36. Var *var;
  37. VarCup *next=nullptr;
  38. };
  39. size_t count;
  40. VarCup *var[VAR_HASH_SIZE];
  41. public:
  42. explicit VarSpace(Inter *inter_);
  43. ~VarSpace() override;
  44. virtual Var *findVar(const std::string &name);
  45. virtual VarOperationFlat defineVar(const std::string &name, Object *data);
  46. virtual VarOperationFlat defineVar(const std::string &name, Var *data);
  47. virtual VarOperationFlat setVar(const std::string &name, Object *data);
  48. virtual VarOperationFlat delVar(const std::string &name);
  49. Object *findObject(const std::string &name) {
  50. Var *ret = findVar(name);
  51. return ret ? ret->getData() : nullptr;
  52. }
  53. };
  54. class ProtectVarSpace : public VarSpace {
  55. bool is_protect;
  56. public:
  57. explicit ProtectVarSpace(Inter *inter_) : VarSpace(inter_), is_protect{false} {}
  58. [[nodiscard]]bool getProtect() const {return is_protect;};
  59. bool setProtect(bool protect) {bool ret = is_protect; is_protect = protect; return ret;}
  60. VarOperationFlat defineVar(const std::string &name, Object *data) override;
  61. VarOperationFlat defineVar(const std::string &name, Var *data) override;
  62. VarOperationFlat setVar(const std::string &name, Object *data) override;
  63. VarOperationFlat delVar(const std::string &name) override;
  64. };
  65. class VarList {
  66. VarSpace *const varspace;
  67. VarList *next;
  68. public:
  69. explicit VarList(VarSpace *vs) : varspace {vs}, next {nullptr} {};
  70. void destructAll();
  71. virtual Var *findVar(const std::string &name);
  72. virtual bool defineVar(const std::string &name, Object *data);
  73. virtual bool defineVar(const std::string &name, Var *data);
  74. virtual bool setVar(const std::string &name, Object *data);
  75. virtual bool delVar(const std::string &name);
  76. Object *findObject(const std::string &name) {
  77. Var *var = findVar(name);
  78. return var ? var->getData() : nullptr;
  79. }
  80. VarList *toNext() {return next;}
  81. VarList *connect(VarList *varlist) {next = varlist; return this;}
  82. void disconnect(VarList *varlist);
  83. };
  84. }
  85. #endif //AFUN_VAR_HPP