BonusList.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * BonusList.h, 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. #pragma once
  11. #include "Bonus.h"
  12. #include "BonusSelector.h"
  13. VCMI_LIB_NAMESPACE_BEGIN
  14. class DLL_LINKAGE BonusList
  15. {
  16. public:
  17. using TInternalContainer = std::vector<std::shared_ptr<Bonus>>;
  18. private:
  19. TInternalContainer bonuses;
  20. bool belongsToTree;
  21. void changed() const;
  22. public:
  23. using const_reference = TInternalContainer::const_reference;
  24. using value_type = TInternalContainer::value_type;
  25. using const_iterator = TInternalContainer::const_iterator;
  26. using iterator = TInternalContainer::iterator;
  27. BonusList(bool BelongsToTree = false);
  28. BonusList(const BonusList &bonusList);
  29. BonusList(BonusList && other) noexcept;
  30. BonusList& operator=(const BonusList &bonusList);
  31. // wrapper functions of the STL vector container
  32. TInternalContainer::size_type size() const { return bonuses.size(); }
  33. void push_back(const std::shared_ptr<Bonus> & x);
  34. TInternalContainer::iterator erase (const int position);
  35. void clear();
  36. bool empty() const { return bonuses.empty(); }
  37. void resize(TInternalContainer::size_type sz, const std::shared_ptr<Bonus> & c = nullptr);
  38. void reserve(TInternalContainer::size_type sz);
  39. TInternalContainer::size_type capacity() const { return bonuses.capacity(); }
  40. STRONG_INLINE std::shared_ptr<Bonus> &operator[] (TInternalContainer::size_type n) { return bonuses[n]; }
  41. STRONG_INLINE const std::shared_ptr<Bonus> &operator[] (TInternalContainer::size_type n) const { return bonuses[n]; }
  42. std::shared_ptr<Bonus> &back() { return bonuses.back(); }
  43. std::shared_ptr<Bonus> &front() { return bonuses.front(); }
  44. const std::shared_ptr<Bonus> &back() const { return bonuses.back(); }
  45. const std::shared_ptr<Bonus> &front() const { return bonuses.front(); }
  46. // There should be no non-const access to provide solid,robust bonus caching
  47. TInternalContainer::const_iterator begin() const { return bonuses.begin(); }
  48. TInternalContainer::const_iterator end() const { return bonuses.end(); }
  49. TInternalContainer::size_type operator-=(const std::shared_ptr<Bonus> & i);
  50. // BonusList functions
  51. void stackBonuses();
  52. int totalValue() const;
  53. void getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit = nullptr) const;
  54. void getAllBonuses(BonusList &out) const;
  55. //special find functions
  56. std::shared_ptr<Bonus> getFirst(const CSelector &select);
  57. std::shared_ptr<const Bonus> getFirst(const CSelector &select) const;
  58. int valOfBonuses(const CSelector &select) const;
  59. // conversion / output
  60. JsonNode toJsonNode() const;
  61. // remove_if implementation for STL vector types
  62. template <class Predicate>
  63. void remove_if(Predicate pred)
  64. {
  65. BonusList newList;
  66. for(const auto & b : bonuses)
  67. {
  68. if (!pred(b.get()))
  69. newList.push_back(b);
  70. }
  71. bonuses.clear();
  72. bonuses.resize(newList.size());
  73. std::copy(newList.begin(), newList.end(), bonuses.begin());
  74. }
  75. template <class InputIterator>
  76. void insert(const int position, InputIterator first, InputIterator last);
  77. void insert(TInternalContainer::iterator position, TInternalContainer::size_type n, const std::shared_ptr<Bonus> & x);
  78. template <typename Handler>
  79. void serialize(Handler &h, const int version)
  80. {
  81. h & static_cast<TInternalContainer&>(bonuses);
  82. }
  83. // C++ for range support
  84. auto begin () -> decltype (bonuses.begin())
  85. {
  86. return bonuses.begin();
  87. }
  88. auto end () -> decltype (bonuses.end())
  89. {
  90. return bonuses.end();
  91. }
  92. };
  93. DLL_LINKAGE std::ostream & operator<<(std::ostream &out, const BonusList &bonusList);
  94. VCMI_LIB_NAMESPACE_END