BonusList.h 3.3 KB

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