var.h 3.8 KB

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