QueriesProcessor.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. boost::mutex QueriesProcessor::mx;
  14. void QueriesProcessor::popQuery(PlayerColor player, QueryPtr query)
  15. {
  16. LOG_TRACE_PARAMS(logGlobal, "player='%s', query='%s'", player % query);
  17. if(topQuery(player) != query)
  18. {
  19. logGlobal->trace("Cannot remove, not a top!");
  20. return;
  21. }
  22. queries[player] -= query;
  23. auto nextQuery = topQuery(player);
  24. query->onRemoval(player);
  25. //Exposure on query below happens only if removal didn't trigger any new query
  26. if(nextQuery && nextQuery == topQuery(player))
  27. nextQuery->onExposure(query);
  28. }
  29. void QueriesProcessor::popQuery(const CQuery &query)
  30. {
  31. LOG_TRACE_PARAMS(logGlobal, "query='%s'", query);
  32. assert(query.players.size());
  33. for(auto player : query.players)
  34. {
  35. auto top = topQuery(player);
  36. if(top.get() == &query)
  37. popQuery(top);
  38. else
  39. {
  40. logGlobal->trace("Cannot remove query %s", query.toString());
  41. logGlobal->trace("Queries found:");
  42. for(auto q : queries[player])
  43. {
  44. logGlobal->trace(q->toString());
  45. }
  46. }
  47. }
  48. }
  49. void QueriesProcessor::popQuery(QueryPtr query)
  50. {
  51. for(auto player : query->players)
  52. popQuery(player, query);
  53. }
  54. void QueriesProcessor::addQuery(QueryPtr query)
  55. {
  56. for(auto player : query->players)
  57. addQuery(player, query);
  58. for(auto player : query->players)
  59. query->onAdded(player);
  60. }
  61. void QueriesProcessor::addQuery(PlayerColor player, QueryPtr query)
  62. {
  63. LOG_TRACE_PARAMS(logGlobal, "player='%d', query='%s'", player.getNum() % query);
  64. query->onAdding(player);
  65. queries[player].push_back(query);
  66. }
  67. QueryPtr QueriesProcessor::topQuery(PlayerColor player)
  68. {
  69. return vstd::backOrNull(queries[player]);
  70. }
  71. void QueriesProcessor::popIfTop(QueryPtr query)
  72. {
  73. LOG_TRACE_PARAMS(logGlobal, "query='%d'", query);
  74. if(!query)
  75. logGlobal->error("The query is nullptr! Ignoring.");
  76. popIfTop(*query);
  77. }
  78. void QueriesProcessor::popIfTop(const CQuery & query)
  79. {
  80. for(PlayerColor color : query.players)
  81. if(topQuery(color).get() == &query)
  82. popQuery(color, topQuery(color));
  83. }
  84. std::vector<std::shared_ptr<const CQuery>> QueriesProcessor::allQueries() const
  85. {
  86. std::vector<std::shared_ptr<const CQuery>> ret;
  87. for(auto & playerQueries : queries)
  88. for(auto & query : playerQueries.second)
  89. ret.push_back(query);
  90. return ret;
  91. }
  92. std::vector<QueryPtr> QueriesProcessor::allQueries()
  93. {
  94. //TODO code duplication with const function :(
  95. std::vector<QueryPtr> ret;
  96. for(auto & playerQueries : queries)
  97. for(auto & query : playerQueries.second)
  98. ret.push_back(query);
  99. return ret;
  100. }
  101. QueryPtr QueriesProcessor::getQuery(QueryID queryID)
  102. {
  103. for(auto & playerQueries : queries)
  104. for(auto & query : playerQueries.second)
  105. if(query->queryID == queryID)
  106. return query;
  107. return nullptr;
  108. }