updated ManaCost copy constructor to do a true deep copy.

added copy constructors to ManaCostHybrid.
This commit is contained in:
techdragon.nguyen@gmail.com
2011-02-09 20:42:19 +00:00
parent c6849d35d5
commit 9c8ff0e27a
3 changed files with 61 additions and 22 deletions
+2
View File
@@ -10,6 +10,8 @@ public:
int value1; int value1;
int value2; int value2;
ManaCostHybrid(); ManaCostHybrid();
ManaCostHybrid(const ManaCostHybrid& hybridManaCost);
ManaCostHybrid(const ManaCostHybrid* hybridManaCost);
ManaCostHybrid(int c1, int v1, int c2, int v2); ManaCostHybrid(int c1, int v1, int c2, int v2);
void init(int c1, int v1, int c2, int v2); void init(int c1, int v1, int c2, int v2);
+37 -22
View File
@@ -9,6 +9,7 @@
#include "WEvent.h" #include "WEvent.h"
#include "MTGAbility.h" #include "MTGAbility.h"
ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstance * c) ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstance * c)
{ {
ManaCost * manaCost; ManaCost * manaCost;
@@ -234,9 +235,13 @@ ManaCost::ManaCost(int _cost[], int nb_elems)
} }
// pointer copy constructor
ManaCost::ManaCost(ManaCost * manaCost) ManaCost::ManaCost(ManaCost * manaCost)
{ {
init(); init();
if ( !manaCost )
return;
for (int i = 0; i <= Constants::MTG_NB_COLORS; i++) for (int i = 0; i <= Constants::MTG_NB_COLORS; i++)
{ {
cost[i] = manaCost->getCost(i); cost[i] = manaCost->getCost(i);
@@ -245,14 +250,16 @@ ManaCost::ManaCost(ManaCost * manaCost)
hybrids[i] = manaCost->hybrids[i]; hybrids[i] = manaCost->hybrids[i];
nbhybrids = manaCost->nbhybrids; nbhybrids = manaCost->nbhybrids;
kicker = manaCost->kicker;
Retrace = manaCost->Retrace;
BuyBack = manaCost->BuyBack;
alternative = manaCost->alternative;
FlashBack = manaCost->FlashBack;
extraCosts = manaCost->extraCosts;
morph = manaCost->morph;
extraCostsIsCopy = manaCost->extraCostsIsCopy; extraCostsIsCopy = manaCost->extraCostsIsCopy;
kicker = NEW ManaCost( manaCost->kicker );
Retrace = NEW ManaCost( manaCost->Retrace );
BuyBack = NEW ManaCost( manaCost->BuyBack );
alternative = NEW ManaCost( manaCost->alternative );
FlashBack = NEW ManaCost( manaCost->FlashBack );
morph = NEW ManaCost( manaCost->morph );
// TODO: Need to figure out if a deep copy is necessary
extraCosts = manaCost->extraCosts;
} }
// Copy Constructor // Copy Constructor
@@ -265,17 +272,23 @@ ManaCost::ManaCost(const ManaCost& manaCost)
cost[i] = manaCost.cost[i]; cost[i] = manaCost.cost[i];
} }
for (int i = 0 ; i < 10; i++) for (int i = 0 ; i < 10; i++)
hybrids[i] = manaCost.hybrids[i]; {
ManaCostHybrid *hybridCopy = NEW ManaCostHybrid( manaCost.hybrids[i] );
hybrids[i] = hybridCopy;
}
nbhybrids = manaCost.nbhybrids; nbhybrids = manaCost.nbhybrids;
kicker = manaCost.kicker;
Retrace = manaCost.Retrace;
BuyBack = manaCost.BuyBack;
alternative = manaCost.alternative;
FlashBack = manaCost.FlashBack;
morph = manaCost.morph;
extraCosts = manaCost.extraCosts;
extraCostsIsCopy = manaCost.extraCostsIsCopy; extraCostsIsCopy = manaCost.extraCostsIsCopy;
// make new copies of the pointers for the deep copy
kicker = NEW ManaCost( manaCost.kicker );
Retrace = NEW ManaCost( manaCost.Retrace );
BuyBack = NEW ManaCost( manaCost.BuyBack );
alternative = NEW ManaCost( manaCost.alternative );
FlashBack = NEW ManaCost( manaCost.FlashBack );
morph = NEW ManaCost( manaCost.morph );
// TODO: Need to figure out if a deep copy is necessary
extraCosts = manaCost.extraCosts;
} }
// operator= // operator=
@@ -283,21 +296,23 @@ ManaCost & ManaCost::operator= (const ManaCost & manaCost)
{ {
if ( this != &manaCost ) if ( this != &manaCost )
{ {
int * new_array = new int[Constants::MTG_NB_COLORS]; for (int i = 0; i < Constants::MTG_NB_COLORS; i++)
std::memcpy(cost, manaCost.cost, sizeof(new_array)); cost[i] = manaCost.cost[i];
for (int i = 0 ; i < 10; i++)
hybrids[i] = manaCost.hybrids[i];
SAFE_DELETE_ARRAY( new_array );
for (int i = 0 ; i < 10; i++)
{
SAFE_DELETE( hybrids[i] );
hybrids[i] = manaCost.hybrids[i];
}
nbhybrids = manaCost.nbhybrids; nbhybrids = manaCost.nbhybrids;
extraCosts = manaCost.extraCosts;
extraCostsIsCopy = manaCost.extraCostsIsCopy;
kicker = manaCost.kicker; kicker = manaCost.kicker;
Retrace = manaCost.Retrace; Retrace = manaCost.Retrace;
BuyBack = manaCost.BuyBack; BuyBack = manaCost.BuyBack;
alternative = manaCost.alternative; alternative = manaCost.alternative;
FlashBack = manaCost.FlashBack; FlashBack = manaCost.FlashBack;
morph = manaCost.morph; morph = manaCost.morph;
extraCosts = manaCost.extraCosts;
extraCostsIsCopy = manaCost.extraCostsIsCopy;
} }
return *this; return *this;
} }
+22
View File
@@ -8,6 +8,28 @@ ManaCostHybrid::ManaCostHybrid()
init(0, 0, 0, 0); init(0, 0, 0, 0);
} }
ManaCostHybrid::ManaCostHybrid(const ManaCostHybrid& hybridManaCost)
{
color1 = hybridManaCost.color1;
color2 = hybridManaCost.color2;
value1 = hybridManaCost.value1;
value2 = hybridManaCost.value2;
}
ManaCostHybrid::ManaCostHybrid(const ManaCostHybrid* hybridManaCost)
{
if (hybridManaCost)
{
color1 = hybridManaCost->color1;
color2 = hybridManaCost->color2;
value1 = hybridManaCost->value1;
value2 = hybridManaCost->value2;
}
else
color1 = color2 = value1 = value2 = 0;
}
ManaCostHybrid::ManaCostHybrid(int c1, int v1, int c2, int v2) ManaCostHybrid::ManaCostHybrid(int c1, int v1, int c2, int v2)
{ {
init(c1, v1, c2, v2); init(c1, v1, c2, v2);