var.h 3.7 KB

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