JsonExpression.h 10 KB

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