JsonExpression.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #pragma once
  2. #include <Array.h>
  3. #include <Assembly.h>
  4. #include <Critical.h>
  5. #include <JSON.h>
  6. #include <Text.h>
  7. #include <Trie.h>
  8. #include "Noise.h"
  9. #include "TypeRegistry.h"
  10. class Chunk;
  11. class JExpressionMemory;
  12. class JExpressionMemory : public virtual Framework::ReferenceCounter
  13. {
  14. private:
  15. Framework::RCTrie<Noise> noises;
  16. Framework::Trie<float> floatVariables;
  17. Framework::Trie<bool> boolVariables;
  18. Chunk* currentChunk;
  19. Framework::Critical cs;
  20. public:
  21. JExpressionMemory();
  22. ~JExpressionMemory();
  23. void lock();
  24. void unlock();
  25. Noise* zNoiseP(Framework::Text name);
  26. void setNoise(Framework::Text name, Noise* noise);
  27. void setCurrentChunk(Chunk* chunk);
  28. float* getFloatVariableP(const Framework::Text& name);
  29. bool* getBoolVariableP(const Framework::Text& name);
  30. Chunk** zzCurrentChunk();
  31. };
  32. typedef float (*FloatFunc)();
  33. class JFloatExpression : public virtual Framework::ReferenceCounter
  34. {
  35. private:
  36. FloatFunc compiled;
  37. JExpressionMemory* memory;
  38. protected:
  39. Framework::Assembly::AssemblyBlock codeBlock;
  40. public:
  41. JFloatExpression();
  42. virtual Framework::Assembly::AssemblyBlock& buildAssembly(
  43. JExpressionMemory* zMemory)
  44. = 0;
  45. float getValue();
  46. FloatFunc compile(JExpressionMemory* zMemory);
  47. };
  48. typedef bool (*BoolFunc)();
  49. class JBoolExpression : public virtual Framework::ReferenceCounter
  50. {
  51. private:
  52. BoolFunc compiled;
  53. JExpressionMemory* memory;
  54. protected:
  55. Framework::Assembly::AssemblyBlock codeBlock;
  56. public:
  57. JBoolExpression();
  58. virtual Framework::Assembly::AssemblyBlock& buildAssembly(
  59. JExpressionMemory* zMemory)
  60. = 0;
  61. bool getValue();
  62. BoolFunc compile(JExpressionMemory* zMemory);
  63. };
  64. class JVariableFloatExpression : public JFloatExpression
  65. {
  66. private:
  67. Framework::Text name;
  68. public:
  69. JVariableFloatExpression();
  70. Framework::Assembly::AssemblyBlock& buildAssembly(
  71. JExpressionMemory* zMemory) override;
  72. void setName(Framework::Text name);
  73. Framework::Text getName() const;
  74. };
  75. class JVariableFloatExpressionFactory
  76. : public SubTypeFactory<JFloatExpression, JVariableFloatExpression>
  77. {
  78. public:
  79. JVariableFloatExpressionFactory();
  80. JVariableFloatExpression* fromJson(
  81. Framework::JSON::JSONObject* zJson) const override;
  82. Framework::JSON::JSONObject* toJsonObject(
  83. JVariableFloatExpression* zObject) const override;
  84. JSONObjectValidationBuilder* addToValidator(
  85. JSONObjectValidationBuilder* builder) const override;
  86. const char* getTypeToken() const override;
  87. };
  88. class JVariableBoolExpression : public JBoolExpression
  89. {
  90. private:
  91. Framework::Text name;
  92. public:
  93. JVariableBoolExpression();
  94. Framework::Assembly::AssemblyBlock& buildAssembly(
  95. JExpressionMemory* zMemory) override;
  96. void setName(Framework::Text name);
  97. Framework::Text getName() const;
  98. };
  99. class JVariableBoolExpressionFactory
  100. : public SubTypeFactory<JBoolExpression, JVariableBoolExpression>
  101. {
  102. public:
  103. JVariableBoolExpressionFactory();
  104. JVariableBoolExpression* fromJson(
  105. Framework::JSON::JSONObject* zJson) const override;
  106. Framework::JSON::JSONObject* toJsonObject(
  107. JVariableBoolExpression* zObject) const override;
  108. JSONObjectValidationBuilder* addToValidator(
  109. JSONObjectValidationBuilder* builder) const override;
  110. const char* getTypeToken() const override;
  111. };
  112. class JConstantFloatExpression : public JFloatExpression
  113. {
  114. private:
  115. float value;
  116. public:
  117. JConstantFloatExpression();
  118. Framework::Assembly::AssemblyBlock& buildAssembly(
  119. JExpressionMemory* zMemory) override;
  120. void setValue(float value);
  121. float getValue() const;
  122. };
  123. class JConstantFloatExpressionFactory
  124. : public SubTypeFactory<JFloatExpression, JConstantFloatExpression>
  125. {
  126. public:
  127. JConstantFloatExpressionFactory();
  128. JConstantFloatExpression* fromJson(
  129. Framework::JSON::JSONObject* zJson) const override;
  130. Framework::JSON::JSONObject* toJsonObject(
  131. JConstantFloatExpression* zObject) const override;
  132. JSONObjectValidationBuilder* addToValidator(
  133. JSONObjectValidationBuilder* builder) const override;
  134. const char* getTypeToken() const override;
  135. };
  136. class JConstantBoolExpression : public JBoolExpression
  137. {
  138. private:
  139. bool value;
  140. public:
  141. JConstantBoolExpression();
  142. Framework::Assembly::AssemblyBlock& buildAssembly(
  143. JExpressionMemory* zMemory) override;
  144. void setValue(bool value);
  145. bool getValue() const;
  146. };
  147. class JConstantBoolExpressionFactory
  148. : public SubTypeFactory<JBoolExpression, JConstantBoolExpression>
  149. {
  150. public:
  151. JConstantBoolExpressionFactory();
  152. JConstantBoolExpression* fromJson(
  153. Framework::JSON::JSONObject* zJson) const override;
  154. Framework::JSON::JSONObject* toJsonObject(
  155. JConstantBoolExpression* zObject) const override;
  156. JSONObjectValidationBuilder* addToValidator(
  157. JSONObjectValidationBuilder* builder) const override;
  158. const char* getTypeToken() const override;
  159. };
  160. class JNoiseFloatExpression : public JFloatExpression
  161. {
  162. private:
  163. Framework::Text name;
  164. JFloatExpression* x;
  165. JFloatExpression* y;
  166. JFloatExpression* z;
  167. public:
  168. JNoiseFloatExpression();
  169. ~JNoiseFloatExpression();
  170. Framework::Assembly::AssemblyBlock& buildAssembly(
  171. JExpressionMemory* zMemory) override;
  172. void setName(Framework::Text name);
  173. Framework::Text getName() const;
  174. void setX(JFloatExpression* x);
  175. JFloatExpression* zX() const;
  176. void setY(JFloatExpression* y);
  177. JFloatExpression* zY() const;
  178. void setZ(JFloatExpression* z);
  179. JFloatExpression* zZ() const;
  180. };
  181. class JNoiseFloatExpressionFactory
  182. : public SubTypeFactory<JFloatExpression, JNoiseFloatExpression>
  183. {
  184. public:
  185. JNoiseFloatExpressionFactory();
  186. JNoiseFloatExpression* fromJson(
  187. Framework::JSON::JSONObject* zJson) const override;
  188. Framework::JSON::JSONObject* toJsonObject(
  189. JNoiseFloatExpression* zObject) const override;
  190. JSONObjectValidationBuilder* addToValidator(
  191. JSONObjectValidationBuilder* builder) const override;
  192. const char* getTypeToken() const override;
  193. };
  194. class JOperatorFloatExpression : public JFloatExpression
  195. {
  196. private:
  197. Framework::Text op;
  198. Framework::RCArray<JFloatExpression> values;
  199. public:
  200. JOperatorFloatExpression();
  201. Framework::Assembly::AssemblyBlock& buildAssembly(
  202. JExpressionMemory* zMemory) override;
  203. void setOperator(Framework::Text op);
  204. Framework::Text getOperator();
  205. void addValue(JFloatExpression* value);
  206. const Framework::RCArray<JFloatExpression>& getValues() const;
  207. };
  208. class JOperatorFloatExpressionFactory
  209. : public SubTypeFactory<JFloatExpression, JOperatorFloatExpression>
  210. {
  211. public:
  212. JOperatorFloatExpressionFactory();
  213. JOperatorFloatExpression* fromJson(
  214. Framework::JSON::JSONObject* zJson) const override;
  215. Framework::JSON::JSONObject* toJsonObject(
  216. JOperatorFloatExpression* zObject) const override;
  217. JSONObjectValidationBuilder* addToValidator(
  218. JSONObjectValidationBuilder* builder) const override;
  219. const char* getTypeToken() const override;
  220. };
  221. class JBoolOperatorBoolExpression : public JBoolExpression
  222. {
  223. private:
  224. Framework::Text op;
  225. Framework::RCArray<JBoolExpression> values;
  226. public:
  227. JBoolOperatorBoolExpression();
  228. Framework::Assembly::AssemblyBlock& buildAssembly(
  229. JExpressionMemory* zMemory) override;
  230. void setOperator(Framework::Text op);
  231. Framework::Text getOperator();
  232. void addValue(JBoolExpression* value);
  233. const Framework::RCArray<JBoolExpression>& getValues() const;
  234. };
  235. class JBoolOperatorBoolExpressionFactory
  236. : public SubTypeFactory<JBoolExpression, JBoolOperatorBoolExpression>
  237. {
  238. public:
  239. JBoolOperatorBoolExpressionFactory();
  240. JBoolOperatorBoolExpression* fromJson(
  241. Framework::JSON::JSONObject* zJson) const override;
  242. Framework::JSON::JSONObject* toJsonObject(
  243. JBoolOperatorBoolExpression* zObject) const override;
  244. JSONObjectValidationBuilder* addToValidator(
  245. JSONObjectValidationBuilder* builder) const override;
  246. const char* getTypeToken() const override;
  247. };
  248. class JFloatOperatorBoolExpression : public JBoolExpression
  249. {
  250. private:
  251. Framework::Text op;
  252. Framework::RCArray<JFloatExpression> values;
  253. public:
  254. JFloatOperatorBoolExpression();
  255. Framework::Assembly::AssemblyBlock& buildAssembly(
  256. JExpressionMemory* zMemory) override;
  257. void setOperator(Framework::Text op);
  258. Framework::Text getOperator();
  259. void addValue(JFloatExpression* value);
  260. const Framework::RCArray<JFloatExpression>& getValues() const;
  261. };
  262. class JFloatOperatorBoolExpressionFactory
  263. : public SubTypeFactory<JBoolExpression, JFloatOperatorBoolExpression>
  264. {
  265. public:
  266. JFloatOperatorBoolExpressionFactory();
  267. JFloatOperatorBoolExpression* fromJson(
  268. Framework::JSON::JSONObject* zJson) const override;
  269. Framework::JSON::JSONObject* toJsonObject(
  270. JFloatOperatorBoolExpression* zObject) const override;
  271. JSONObjectValidationBuilder* addToValidator(
  272. JSONObjectValidationBuilder* builder) const override;
  273. const char* getTypeToken() const override;
  274. };
  275. class JBlockTypeBoolExpression : public JBoolExpression
  276. {
  277. private:
  278. int typeId;
  279. JFloatExpression* x;
  280. JFloatExpression* y;
  281. JFloatExpression* z;
  282. public:
  283. JBlockTypeBoolExpression();
  284. ~JBlockTypeBoolExpression();
  285. private:
  286. bool isValidPosition(int x, int y, Chunk* currentChunk);
  287. public:
  288. Framework::Assembly::AssemblyBlock& buildAssembly(
  289. JExpressionMemory* zMemory) override;
  290. void setTypeId(int typeId);
  291. int getTypeId() const;
  292. void setX(JFloatExpression* x);
  293. JFloatExpression* zX() const;
  294. void setY(JFloatExpression* y);
  295. JFloatExpression* zY() const;
  296. void setZ(JFloatExpression* z);
  297. JFloatExpression* zZ() const;
  298. };
  299. class JBlockTypeBoolExpressionFactory
  300. : public SubTypeFactory<JBoolExpression, JBlockTypeBoolExpression>
  301. {
  302. public:
  303. JBlockTypeBoolExpressionFactory();
  304. JBlockTypeBoolExpression* fromJson(
  305. Framework::JSON::JSONObject* zJson) const override;
  306. Framework::JSON::JSONObject* toJsonObject(
  307. JBlockTypeBoolExpression* zObject) const override;
  308. JSONObjectValidationBuilder* addToValidator(
  309. JSONObjectValidationBuilder* builder) const override;
  310. const char* getTypeToken() const override;
  311. };