Research portable Memory game | Исследовать портируемую игру Память
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
hace 5 meses
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <list>
  2. #include <queue>
  3. #include <string>
  4. #ifndef ctx_HEADER
  5. #define ctx_HEADER
  6. template <class T> class ctx_Controller {
  7. std::list<std::function<T(T)> > callbacks;
  8. std::list<std::function<T(T)> > functions;
  9. std::queue<T> queue;
  10. public:
  11. T context;
  12. bool isProcessingQueue = false;
  13. ctx_Controller(const T &c) {
  14. context = c;
  15. }
  16. void executeFunctions() {
  17. auto c = queue.front();
  18. queue.pop();
  19. for (const auto &f : functions) {
  20. auto ctx = f(c);
  21. if (ctx.recentField != "none") {
  22. queue.push(ctx);
  23. }
  24. }
  25. context.recentField = c.recentField;
  26. context.setField(c.recentField, c.field(c.recentField));
  27. reportContext();
  28. }
  29. void processQueue() {
  30. // Decline recursion.
  31. if (isProcessingQueue) {
  32. return;
  33. }
  34. isProcessingQueue = true;
  35. while (!queue.empty()) {
  36. executeFunctions();
  37. }
  38. isProcessingQueue = false;
  39. }
  40. void registerFunction(std::function<T(T)> f) {
  41. functions.push_back(f);
  42. }
  43. /*
  44. void registerCallback(void (*cb)(T)) {
  45. callbacks.push_back(cb);
  46. }
  47. void registerFieldCallback(const std::string &fieldName, void (*cb)(T)) {
  48. auto execCB = [fieldName, cb](T c) {
  49. if (c.recentField == fieldName) {
  50. cb(c);
  51. }
  52. };
  53. callbacks.push_back(execCB);
  54. }
  55. void registerFunctions(const std::list<T *(T)> funcs) {
  56. for (const auto &f : funcs) {
  57. functions.push_back(f);
  58. }
  59. }
  60. */
  61. void reportContext() {
  62. for (const auto &cb : callbacks) {
  63. cb(context);
  64. }
  65. }
  66. template <typename U> void set(
  67. const std::string &fieldName,
  68. const U &value
  69. ) {
  70. auto c = context;
  71. c.setField(fieldName, value);
  72. c.recentField = fieldName;
  73. queue.push(c);
  74. processQueue();
  75. }
  76. };
  77. #endif // ctx_HEADER