var.hpp 3.4 KB

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