diff --git a/projects/mtg/include/Trash.h b/projects/mtg/include/Trash.h index 53193b157..c30d424e4 100644 --- a/projects/mtg/include/Trash.h +++ b/projects/mtg/include/Trash.h @@ -5,17 +5,21 @@ #include "Pos.h" #include "WEvent.h" -void trash(Pos*); - +template void trash(T*); class Trash { - std::vector bin; - void put_out(); - int receiveEvent(WEvent* e); - friend void trash(Pos*); - public: static void cleanup(); }; +template +class TrashBin +{ + std::vector bin; + void put_out(); + int receiveEvent(WEvent* e); + template friend void trash(Q*); + friend class Trash; +}; + #endif // _TRASH_H_ diff --git a/projects/mtg/src/GuiCombat.cpp b/projects/mtg/src/GuiCombat.cpp index a0653ffe4..d863c7ec1 100644 --- a/projects/mtg/src/GuiCombat.cpp +++ b/projects/mtg/src/GuiCombat.cpp @@ -4,6 +4,7 @@ #include "../include/GuiCombat.h" #include "../include/AIPlayer.h" #include "../include/GameObserver.h" +#include "../include/Trash.h" #include "Closest.cpp" static const float MARGIN = 70; @@ -386,7 +387,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) AttackerDamaged* d = *it; if (activeAtk == *it) activeAtk = NULL; attackers.erase(it); - SAFE_DELETE(d); + trash(d); return 1; } else @@ -395,7 +396,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) { DefenserDamaged* d = *q; (*it)->blockers.erase(q); - SAFE_DELETE(d); + trash(d); return 1; } return 0; @@ -408,7 +409,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) { AttackerDamaged* d = *it; attackers.erase(it); - SAFE_DELETE(d); + trash(d); return 1; } return 0; @@ -422,7 +423,7 @@ int GuiCombat::receiveEventMinus(WEvent* e) { DefenserDamaged* d = *q; (*it)->blockers.erase(q); - SAFE_DELETE(d); + trash(d); return 1; } return 0; diff --git a/projects/mtg/src/Trash.cpp b/projects/mtg/src/Trash.cpp index ef1dca7f1..6d1111f16 100644 --- a/projects/mtg/src/Trash.cpp +++ b/projects/mtg/src/Trash.cpp @@ -2,28 +2,37 @@ #include "../include/MTGDefinitions.h" #include "../include/Pos.h" #include "../include/CardGui.h" +#include "../include/DamagerDamaged.h" #include "../include/Trash.h" -void Trash::put_out() +template +void TrashBin::put_out() { - for (std::vector::iterator it = bin.begin(); it != bin.end(); ++it) - { - if (CardView *c = dynamic_cast(*it)) - SAFE_DELETE(c); - else - SAFE_DELETE(*it); - } + for (typename std::vector::iterator it = bin.begin(); it != bin.end(); ++it) + SAFE_DELETE(*it); bin.clear(); } -static Trash PosTrash; +static TrashBin CardViewTrash; +static TrashBin DefenserDamagedTrash; +static TrashBin AttackerDamagedTrash; void Trash::cleanup() { - PosTrash.put_out(); + CardViewTrash.put_out(); + DefenserDamagedTrash.put_out(); + AttackerDamagedTrash.put_out(); } -void trash(Pos* garbage) +template<> void trash(CardView* garbage) { - PosTrash.bin.push_back(garbage); + CardViewTrash.bin.push_back(garbage); +} +template<> void trash(DefenserDamaged* garbage) +{ + DefenserDamagedTrash.bin.push_back(garbage); +} +template<> void trash(AttackerDamaged* garbage) +{ + AttackerDamagedTrash.bin.push_back(garbage); }