var.hpp 3.4 KB

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