var.h 3.4 KB

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