ResourceSet.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #define VCMI_DLL
  2. #include "ResourceSet.h"
  3. Res::ResourceSet::ResourceSet()
  4. {
  5. resize(RESOURCE_QUANTITY, 0);
  6. }
  7. bool Res::ResourceSet::nonZero() const
  8. {
  9. for(int i = 0; i < size(); i++)
  10. if(at(i))
  11. return true;
  12. return false;
  13. }
  14. void Res::ResourceSet::amax(const TResource &val)
  15. {
  16. for(int i = 0; i < size(); i++)
  17. ::amax(at(i), val);
  18. }
  19. bool Res::ResourceSet::canBeAfforded(const ResourceSet &res) const
  20. {
  21. return Res::canAfford(res, *this);
  22. }
  23. bool Res::ResourceSet::canAfford(const ResourceSet &price) const
  24. {
  25. return Res::canAfford(*this, price);
  26. }
  27. bool Res::canAfford(const ResourceSet &res, const ResourceSet &price)
  28. {
  29. assert(res.size() == price.size() && price.size() == RESOURCE_QUANTITY);
  30. for(int i = 0; i < RESOURCE_QUANTITY; i++)
  31. if(price[i] > res[i])
  32. return false;
  33. return true;
  34. }
  35. bool Res::ResourceSet::nziterator::valid()
  36. {
  37. return cur.resType < RESOURCE_QUANTITY && cur.resVal;
  38. }
  39. Res::ResourceSet::nziterator Res::ResourceSet::nziterator::operator++()
  40. {
  41. advance();
  42. return *this;
  43. }
  44. Res::ResourceSet::nziterator Res::ResourceSet::nziterator::operator++(int)
  45. {
  46. nziterator ret = *this;
  47. advance();
  48. return ret;
  49. }
  50. const Res::ResourceSet::nziterator::ResEntry& Res::ResourceSet::nziterator::operator*() const
  51. {
  52. return cur;
  53. }
  54. const Res::ResourceSet::nziterator::ResEntry * Res::ResourceSet::nziterator::operator->() const
  55. {
  56. return &cur;
  57. }
  58. void Res::ResourceSet::nziterator::advance()
  59. {
  60. do
  61. {
  62. cur.resType++;
  63. } while(cur.resType < RESOURCE_QUANTITY && !(cur.resVal=rs[cur.resType]));
  64. if(cur.resType >= RESOURCE_QUANTITY)
  65. cur.resVal = -1;
  66. }
  67. Res::ResourceSet::nziterator::nziterator(const ResourceSet &RS)
  68. : rs(RS)
  69. {
  70. cur.resType = 0;
  71. cur.resVal = rs[0];
  72. if(!valid())
  73. advance();
  74. }