var.h 3.5 KB

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