JsonExpression.h 13 KB

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