var.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef AFUN_VAR_H
  2. #define AFUN_VAR_H
  3. #include "aFuntool.h"
  4. #include "aFunCoreExport.h"
  5. #include "core.h"
  6. #include "gc.h"
  7. #include <list>
  8. namespace aFuncore {
  9. AFUN_CORE_EXPORT class Var : public GcObject<class Var> {
  10. Object *data;
  11. public:
  12. Inter *const inter;
  13. Var(Object *data_, Inter *inter_);
  14. ~Var() override =default;
  15. [[nodiscard]] virtual Object *getData() {return data;}
  16. virtual void setData(Object *data_) {data = data_;}
  17. };
  18. AFUN_CORE_EXPORT class VarSpace : public GcObject<class VarSpace> {
  19. public:
  20. static const size_t VAR_HASH_SIZE = 100; // 环境变量哈希表大小
  21. private:
  22. struct VarCup {
  23. std::string name;
  24. Var *var;
  25. VarCup *next=nullptr;
  26. };
  27. size_t count;
  28. VarCup *var[VAR_HASH_SIZE];
  29. public:
  30. Inter *const inter;
  31. explicit VarSpace(Inter *inter_);
  32. ~VarSpace() override;
  33. [[nodiscard]] size_t getCount() const {return count;}
  34. [[nodiscard]] virtual Var *findVar(const std::string &name);
  35. virtual VarOperationFlat defineVar(const std::string &name, Object *data);
  36. virtual VarOperationFlat defineVar(const std::string &name, Var *data);
  37. virtual VarOperationFlat setVar(const std::string &name, Object *data);
  38. virtual VarOperationFlat delVar(const std::string &name);
  39. [[nodiscard]] Object *findObject(const std::string &name) {
  40. Var *ret = findVar(name);
  41. return ret ? ret->getData() : nullptr;
  42. }
  43. };
  44. AFUN_CORE_EXPORT class ProtectVarSpace : public VarSpace {
  45. bool is_protect;
  46. public:
  47. explicit ProtectVarSpace(Inter *inter_) : VarSpace(inter_), is_protect{false} {}
  48. [[nodiscard]]bool getProtect() const {return is_protect;};
  49. bool setProtect(bool protect) {bool ret = is_protect; is_protect = protect; return ret;}
  50. VarOperationFlat defineVar(const std::string &name, Object *data) override;
  51. VarOperationFlat defineVar(const std::string &name, Var *data) override;
  52. VarOperationFlat setVar(const std::string &name, Object *data) override;
  53. VarOperationFlat delVar(const std::string &name) override;
  54. };
  55. AFUN_CORE_EXPORT class VarList {
  56. std::list<VarSpace *> varspace;
  57. public:
  58. explicit VarList() = default;
  59. explicit VarList(VarList *varlist);
  60. explicit VarList(VarSpace *varspace) {this->varspace.push_front(varspace);}
  61. ~VarList() = default;
  62. VarList(const VarList &)=delete;
  63. VarList &operator=(const VarList &)=delete;
  64. void connect(VarList *varlist);
  65. void push(VarSpace *varspace_) {varspace.push_front(varspace_);}
  66. [[nodiscard]] virtual Var *findVar(const std::string &name);
  67. virtual bool defineVar(const std::string &name, Object *data);
  68. virtual bool defineVar(const std::string &name, Var *data);
  69. virtual bool setVar(const std::string &name, Object *data);
  70. virtual bool delVar(const std::string &name);
  71. [[nodiscard]] Object *findObject(const std::string &name) {
  72. Var *var = findVar(name);
  73. return var ? var->getData() : nullptr;
  74. }
  75. };
  76. }
  77. #endif //AFUN_VAR_H