QueriesProcessor.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * CQuery.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "QueriesProcessor.h"
  12. #include "CQuery.h"
  13. void QueriesProcessor::popQuery(PlayerColor player, QueryPtr query)
  14. {
  15. LOG_TRACE_PARAMS(logGlobal, "player='%s', query='%s'", player % query);
  16. if(topQuery(player) != query)
  17. {
  18. logGlobal->trace("Cannot remove, not a top!");
  19. return;
  20. }
  21. queries[player] -= query;
  22. auto nextQuery = topQuery(player);
  23. query->onRemoval(player);
  24. //Exposure on query below happens only if removal didn't trigger any new query
  25. if(nextQuery && nextQuery == topQuery(player))
  26. nextQuery->onExposure(query);
  27. }
  28. void QueriesProcessor::popQuery(const CQuery &query)
  29. {
  30. LOG_TRACE_PARAMS(logGlobal, "query='%s'", query);
  31. assert(query.players.size());
  32. for(auto player : query.players)
  33. {
  34. auto top = topQuery(player);
  35. if(top.get() == &query)
  36. popQuery(top);
  37. else
  38. {
  39. logGlobal->trace("Cannot remove query %s", query.toString());
  40. logGlobal->trace("Queries found:");
  41. for(auto q : queries[player])
  42. {
  43. logGlobal->trace(q->toString());
  44. }
  45. }
  46. }
  47. }
  48. void QueriesProcessor::popQuery(QueryPtr query)
  49. {
  50. for(auto player : query->players)
  51. popQuery(player, query);
  52. }
  53. void QueriesProcessor::addQuery(QueryPtr query)
  54. {
  55. for(auto player : query->players)
  56. addQuery(player, query);
  57. for(auto player : query->players)
  58. query->onAdded(player);
  59. }
  60. void QueriesProcessor::addQuery(PlayerColor player, QueryPtr query)
  61. {
  62. LOG_TRACE_PARAMS(logGlobal, "player='%d', query='%s'", player.getNum() % query);
  63. query->onAdding(player);
  64. queries[player].push_back(query);
  65. }
  66. QueryPtr QueriesProcessor::topQuery(PlayerColor player)
  67. {
  68. return vstd::backOrNull(queries[player]);
  69. }
  70. void QueriesProcessor::popIfTop(QueryPtr query)
  71. {
  72. LOG_TRACE_PARAMS(logGlobal, "query='%d'", query);
  73. if(!query)
  74. logGlobal->error("The query is nullptr! Ignoring.");
  75. popIfTop(*query);
  76. }
  77. void QueriesProcessor::popIfTop(const CQuery & query)
  78. {
  79. for(PlayerColor color : query.players)
  80. if(topQuery(color).get() == &query)
  81. popQuery(color, topQuery(color));
  82. }
  83. std::vector<std::shared_ptr<const CQuery>> QueriesProcessor::allQueries() const
  84. {
  85. std::vector<std::shared_ptr<const CQuery>> ret;
  86. for(auto & playerQueries : queries)
  87. for(auto & query : playerQueries.second)
  88. ret.push_back(query);
  89. return ret;
  90. }
  91. std::vector<QueryPtr> QueriesProcessor::allQueries()
  92. {
  93. //TODO code duplication with const function :(
  94. std::vector<QueryPtr> ret;
  95. for(auto & playerQueries : queries)
  96. for(auto & query : playerQueries.second)
  97. ret.push_back(query);
  98. return ret;
  99. }
  100. QueryPtr QueriesProcessor::getQuery(QueryID queryID)
  101. {
  102. for(auto & playerQueries : queries)
  103. for(auto & query : playerQueries.second)
  104. if(query->queryID == queryID)
  105. return query;
  106. return nullptr;
  107. }