fixed VC6 compilation error

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2000-02-09 20:51:09 +00:00
parent d14f4fec2d
commit 4ac99f4bbe

View File

@@ -39,7 +39,7 @@
class CellBox class CellBox
{ {
public: public:
// members // members
inline bool IsAlive(int dx, int dy) const; inline bool IsAlive(int dx, int dy) const;
inline bool SetCell(int dx, int dy, bool alive); inline bool SetCell(int dx, int dy, bool alive);
@@ -98,7 +98,7 @@ bool CellBox::SetCell(int dx, int dy, bool alive)
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
Life::Life() Life::Life()
{ {
m_numcells = 0; m_numcells = 0;
m_boxes = new CellBox *[HASHSIZE]; m_boxes = new CellBox *[HASHSIZE];
m_head = NULL; m_head = NULL;
@@ -117,29 +117,29 @@ Life::~Life()
Clear(); Clear();
delete[] m_boxes; delete[] m_boxes;
delete[] m_cells; delete[] m_cells;
} }
// Clear: // Clear:
// Clears the board, freeing all storage. // Clears the board, freeing all storage.
// //
void Life::Clear() void Life::Clear()
{ {
CellBox *c, *nc; CellBox *c, *nc;
m_numcells = 0; m_numcells = 0;
// clear the hash table pointers // clear the hash table pointers
for (int i = 0; i < HASHSIZE; i++) for (int i = 0; i < HASHSIZE; i++)
m_boxes[i] = NULL; m_boxes[i] = NULL;
// free used boxes // free used boxes
c = m_head; c = m_head;
while (c) while (c)
{ {
nc = c->m_next; nc = c->m_next;
delete c; delete c;
c = nc; c = nc;
} }
m_head = NULL; m_head = NULL;
@@ -149,7 +149,7 @@ void Life::Clear()
{ {
nc = c->m_next; nc = c->m_next;
delete c; delete c;
c = nc; c = nc;
} }
m_available = NULL; m_available = NULL;
} }
@@ -184,7 +184,7 @@ void Life::SetCell(wxInt32 x, wxInt32 y, bool alive)
else else
m_numcells--; m_numcells--;
} }
} }
void Life::SetShape(const LifeShape& shape) void Life::SetShape(const LifeShape& shape)
{ {
@@ -232,9 +232,9 @@ CellBox* Life::CreateBox(wxInt32 x, wxInt32 y, wxUint32 hv)
// the above call should abort, but it doesn't :-? // the above call should abort, but it doesn't :-?
abort(); abort();
break; break;
} }
c->m_next = m_available; c->m_next = m_available;
m_available = c; m_available = c;
} }
@@ -297,13 +297,13 @@ void Life::KillBox(CellBox *c)
else else
m_head = c->m_next; m_head = c->m_next;
// remove from the hash table // remove from the hash table
if (c != m_boxes[hv]) if (c != m_boxes[hv])
c->m_hprev->m_hnext = c->m_hnext; c->m_hprev->m_hnext = c->m_hnext;
else else
m_boxes[hv] = c->m_hnext; m_boxes[hv] = c->m_hnext;
// update neighbours // update neighbours
if (c->m_next) c->m_next->m_prev = c->m_prev; if (c->m_next) c->m_next->m_prev = c->m_prev;
if (c->m_hnext) c->m_hnext->m_hprev = c->m_hprev; if (c->m_hnext) c->m_hnext->m_hprev = c->m_hprev;
if (c->m_up) c->m_up->m_dn = NULL; if (c->m_up) c->m_up->m_dn = NULL;
@@ -339,7 +339,7 @@ void Life::DoLine(wxInt32 i, wxInt32 j, wxUint32 live, wxUint32 old)
live >>= 1; live >>= 1;
} }
} }
// Post eight cells to the cell arrays (alive cells only) // Post eight cells to the cell arrays (alive cells only)
void Life::DoLine(wxInt32 i, wxInt32 j, wxUint32 live) void Life::DoLine(wxInt32 i, wxInt32 j, wxUint32 live)
{ {
@@ -355,7 +355,7 @@ void Life::DoLine(wxInt32 i, wxInt32 j, wxUint32 live)
} }
live >>= 1; live >>= 1;
} }
} }
void Life::BeginFind(wxInt32 i0, wxInt32 j0, wxInt32 i1, wxInt32 j1, bool changed) void Life::BeginFind(wxInt32 i0, wxInt32 j0, wxInt32 i1, wxInt32 j1, bool changed)
{ {
@@ -363,12 +363,12 @@ void Life::BeginFind(wxInt32 i0, wxInt32 j0, wxInt32 i1, wxInt32 j1, bool change
// cellboxes that fit in the specified viewport is smaller // cellboxes that fit in the specified viewport is smaller
// than the current total of boxes; iterating over the list // than the current total of boxes; iterating over the list
// should then be faster than searching in the hash table. // should then be faster than searching in the hash table.
m_i0 = m_i = i0 & 0xfffffff8; m_i0 = m_i = i0 & 0xfffffff8;
m_j0 = m_j = j0 & 0xfffffff8; m_j0 = m_j = j0 & 0xfffffff8;
m_i1 = (i1 + 7) & 0xfffffff8; m_i1 = (i1 + 7) & 0xfffffff8;
m_j1 = (j1 + 7) & 0xfffffff8; m_j1 = (j1 + 7) & 0xfffffff8;
m_findmore = TRUE; m_findmore = TRUE;
m_changed = changed; m_changed = changed;
} }
@@ -386,14 +386,14 @@ bool Life::FindMore(Cell *cells[], size_t *ncells)
{ {
if ((c = LinkBox(m_i, m_j, FALSE)) == NULL) if ((c = LinkBox(m_i, m_j, FALSE)) == NULL)
continue; continue;
// check whether there is enough space left in the array // check whether there is enough space left in the array
if (m_ncells > (ARRAYSIZE - 64)) if (m_ncells > (ARRAYSIZE - 64))
{ {
*ncells = m_ncells; *ncells = m_ncells;
return FALSE; return FALSE;
} }
DoLine(m_i, m_j , c->m_live1, c->m_old1 ); DoLine(m_i, m_j , c->m_live1, c->m_old1 );
DoLine(m_i, m_j + 1, c->m_live1 >> 8, c->m_old1 >> 8 ); DoLine(m_i, m_j + 1, c->m_live1 >> 8, c->m_old1 >> 8 );
DoLine(m_i, m_j + 2, c->m_live1 >> 16, c->m_old1 >> 16); DoLine(m_i, m_j + 2, c->m_live1 >> 16, c->m_old1 >> 16);
@@ -405,20 +405,20 @@ bool Life::FindMore(Cell *cells[], size_t *ncells)
} }
} }
else else
{ {
for ( ; m_j <= m_j1; m_j += 8, m_i = m_i0) for ( ; m_j <= m_j1; m_j += 8, m_i = m_i0)
for ( ; m_i <= m_i1; m_i += 8) for ( ; m_i <= m_i1; m_i += 8)
{ {
if ((c = LinkBox(m_i, m_j, FALSE)) == NULL) if ((c = LinkBox(m_i, m_j, FALSE)) == NULL)
continue; continue;
// check whether there is enough space left in the array // check whether there is enough space left in the array
if (m_ncells > (ARRAYSIZE - 64)) if (m_ncells > (ARRAYSIZE - 64))
{ {
*ncells = m_ncells; *ncells = m_ncells;
return FALSE; return FALSE;
} }
DoLine(m_i, m_j , c->m_live1 ); DoLine(m_i, m_j , c->m_live1 );
DoLine(m_i, m_j + 1, c->m_live1 >> 8 ); DoLine(m_i, m_j + 1, c->m_live1 >> 8 );
DoLine(m_i, m_j + 2, c->m_live1 >> 16); DoLine(m_i, m_j + 2, c->m_live1 >> 16);
@@ -429,12 +429,12 @@ bool Life::FindMore(Cell *cells[], size_t *ncells)
DoLine(m_i, m_j + 7, c->m_live2 >> 24); DoLine(m_i, m_j + 7, c->m_live2 >> 24);
} }
} }
*ncells = m_ncells; *ncells = m_ncells;
m_findmore = FALSE; m_findmore = FALSE;
return TRUE; return TRUE;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Evolution engine // Evolution engine
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -444,20 +444,20 @@ extern int g_tab2[];
// NextTic: // NextTic:
// Advance one step in evolution :-) // Advance one step in evolution :-)
// //
bool Life::NextTic() bool Life::NextTic()
{ {
CellBox *c, *up, *dn, *lf, *rt; CellBox *c, *up, *dn, *lf, *rt;
wxUint32 t1, t2, t3, t4; wxUint32 t1, t2, t3, t4;
bool changed = FALSE; bool changed = FALSE;
m_numcells = 0; m_numcells = 0;
// Stage 1: // Stage 1:
// Compute neighbours of each cell // Compute neighbours of each cell
// //
// WARNING: unrolled loops and lengthy code follows! // WARNING: unrolled loops and lengthy code follows!
// //
c = m_head; c = m_head;
while (c) while (c)
@@ -465,25 +465,25 @@ bool Life::NextTic()
if (! (c->m_live1 || c->m_live2)) if (! (c->m_live1 || c->m_live2))
{ {
c = c->m_next; c = c->m_next;
continue; continue;
} }
up = c->m_up; up = c->m_up;
dn = c->m_dn; dn = c->m_dn;
lf = c->m_lf; lf = c->m_lf;
rt = c->m_rt; rt = c->m_rt;
// up // up
t1 = c->m_live1 & 0x000000ff; t1 = c->m_live1 & 0x000000ff;
if (t1) if (t1)
{ {
if (!up) if (!up)
{ {
up = LinkBox(c->m_x, c->m_y - 8); up = LinkBox(c->m_x, c->m_y - 8);
up->m_dn = c; up->m_dn = c;
} }
t2 = g_tab1[t1]; t2 = g_tab1[t1];
up->m_on[7] += t2; up->m_on[7] += t2;
c->m_on[1] += t2; c->m_on[1] += t2;
c->m_on[0] += g_tab2[t1]; c->m_on[0] += g_tab2[t1];
} }
@@ -494,30 +494,30 @@ bool Life::NextTic()
if (!dn) if (!dn)
{ {
dn = LinkBox(c->m_x, c->m_y + 8); dn = LinkBox(c->m_x, c->m_y + 8);
dn->m_up = c; dn->m_up = c;
} }
t2 = g_tab1[t1]; t2 = g_tab1[t1];
dn->m_on[0] += t2; dn->m_on[0] += t2;
c->m_on[6] += t2; c->m_on[6] += t2;
c->m_on[7] += g_tab2[t1]; c->m_on[7] += g_tab2[t1];
} }
t1 = c->m_live1; t1 = c->m_live1;
t2 = c->m_live2; t2 = c->m_live2;
// left // left
if (t1 & 0x01010101) if (t1 & 0x01010101)
{ {
if (!lf) if (!lf)
{ {
lf = LinkBox(c->m_x - 8, c->m_y); lf = LinkBox(c->m_x - 8, c->m_y);
lf->m_rt = c; lf->m_rt = c;
} }
if (t1 & 0x00000001) if (t1 & 0x00000001)
{ {
if (!lf->m_up) if (!lf->m_up)
{ {
lf->m_up = LinkBox(c->m_x - 8, c->m_y - 8); lf->m_up = LinkBox(c->m_x - 8, c->m_y - 8);
lf->m_up->m_dn = lf; lf->m_up->m_dn = lf;
} }
lf->m_up->m_on[7] += 0x10000000; lf->m_up->m_on[7] += 0x10000000;
@@ -526,53 +526,53 @@ bool Life::NextTic()
} }
if (t1 & 0x00000100) if (t1 & 0x00000100)
{ {
lf->m_on[0] += 0x10000000; lf->m_on[0] += 0x10000000;
lf->m_on[1] += 0x10000000; lf->m_on[1] += 0x10000000;
lf->m_on[2] += 0x10000000; lf->m_on[2] += 0x10000000;
} }
if (t1 & 0x00010000) if (t1 & 0x00010000)
{ {
lf->m_on[1] += 0x10000000; lf->m_on[1] += 0x10000000;
lf->m_on[2] += 0x10000000; lf->m_on[2] += 0x10000000;
lf->m_on[3] += 0x10000000; lf->m_on[3] += 0x10000000;
} }
if (t1 & 0x01000000) if (t1 & 0x01000000)
{ {
lf->m_on[2] += 0x10000000; lf->m_on[2] += 0x10000000;
lf->m_on[3] += 0x10000000; lf->m_on[3] += 0x10000000;
lf->m_on[4] += 0x10000000; lf->m_on[4] += 0x10000000;
} }
} }
if (t2 & 0x01010101) if (t2 & 0x01010101)
{ {
if (!lf) if (!lf)
{ {
lf = LinkBox(c->m_x - 8, c->m_y); lf = LinkBox(c->m_x - 8, c->m_y);
lf->m_rt = c; lf->m_rt = c;
} }
if (t2 & 0x00000001) if (t2 & 0x00000001)
{ {
lf->m_on[3] += 0x10000000; lf->m_on[3] += 0x10000000;
lf->m_on[4] += 0x10000000; lf->m_on[4] += 0x10000000;
lf->m_on[5] += 0x10000000; lf->m_on[5] += 0x10000000;
} }
if (t2 & 0x00000100) if (t2 & 0x00000100)
{ {
lf->m_on[4] += 0x10000000; lf->m_on[4] += 0x10000000;
lf->m_on[5] += 0x10000000; lf->m_on[5] += 0x10000000;
lf->m_on[6] += 0x10000000; lf->m_on[6] += 0x10000000;
} }
if (t2 & 0x00010000) if (t2 & 0x00010000)
{ {
lf->m_on[5] += 0x10000000; lf->m_on[5] += 0x10000000;
lf->m_on[6] += 0x10000000; lf->m_on[6] += 0x10000000;
lf->m_on[7] += 0x10000000; lf->m_on[7] += 0x10000000;
} }
if (t2 & 0x01000000) if (t2 & 0x01000000)
{ {
if (!lf->m_dn) if (!lf->m_dn)
{ {
lf->m_dn = LinkBox(c->m_x - 8, c->m_y + 8); lf->m_dn = LinkBox(c->m_x - 8, c->m_y + 8);
lf->m_dn->m_up = lf; lf->m_dn->m_up = lf;
} }
lf->m_on[6] += 0x10000000; lf->m_on[6] += 0x10000000;
@@ -586,14 +586,14 @@ bool Life::NextTic()
{ {
if (!rt) if (!rt)
{ {
rt = LinkBox(c->m_x + 8, c->m_y); rt = LinkBox(c->m_x + 8, c->m_y);
rt->m_lf = c; rt->m_lf = c;
} }
if (t1 & 0x00000080) if (t1 & 0x00000080)
{ {
if (!rt->m_up) if (!rt->m_up)
{ {
rt->m_up = LinkBox(c->m_x + 8, c->m_y - 8); rt->m_up = LinkBox(c->m_x + 8, c->m_y - 8);
rt->m_up->m_dn = rt; rt->m_up->m_dn = rt;
} }
rt->m_up->m_on[7] += 0x00000001; rt->m_up->m_on[7] += 0x00000001;
@@ -602,53 +602,53 @@ bool Life::NextTic()
} }
if (t1 & 0x00008000) if (t1 & 0x00008000)
{ {
rt->m_on[0] += 0x00000001; rt->m_on[0] += 0x00000001;
rt->m_on[1] += 0x00000001; rt->m_on[1] += 0x00000001;
rt->m_on[2] += 0x00000001; rt->m_on[2] += 0x00000001;
} }
if (t1 & 0x00800000) if (t1 & 0x00800000)
{ {
rt->m_on[1] += 0x00000001; rt->m_on[1] += 0x00000001;
rt->m_on[2] += 0x00000001; rt->m_on[2] += 0x00000001;
rt->m_on[3] += 0x00000001; rt->m_on[3] += 0x00000001;
} }
if (t1 & 0x80000000) if (t1 & 0x80000000)
{ {
rt->m_on[2] += 0x00000001; rt->m_on[2] += 0x00000001;
rt->m_on[3] += 0x00000001; rt->m_on[3] += 0x00000001;
rt->m_on[4] += 0x00000001; rt->m_on[4] += 0x00000001;
} }
} }
if (t2 & 0x80808080) if (t2 & 0x80808080)
{ {
if (!rt) if (!rt)
{ {
rt = LinkBox(c->m_x + 8, c->m_y); rt = LinkBox(c->m_x + 8, c->m_y);
rt->m_lf = c; rt->m_lf = c;
} }
if (t2 & 0x00000080) if (t2 & 0x00000080)
{ {
rt->m_on[3] += 0x00000001; rt->m_on[3] += 0x00000001;
rt->m_on[4] += 0x00000001; rt->m_on[4] += 0x00000001;
rt->m_on[5] += 0x00000001; rt->m_on[5] += 0x00000001;
} }
if (t2 & 0x00008000) if (t2 & 0x00008000)
{ {
rt->m_on[4] += 0x00000001; rt->m_on[4] += 0x00000001;
rt->m_on[5] += 0x00000001; rt->m_on[5] += 0x00000001;
rt->m_on[6] += 0x00000001; rt->m_on[6] += 0x00000001;
} }
if (t2 & 0x00800000) if (t2 & 0x00800000)
{ {
rt->m_on[5] += 0x00000001; rt->m_on[5] += 0x00000001;
rt->m_on[6] += 0x00000001; rt->m_on[6] += 0x00000001;
rt->m_on[7] += 0x00000001; rt->m_on[7] += 0x00000001;
} }
if (t2 & 0x80000000) if (t2 & 0x80000000)
{ {
if (!rt->m_dn) if (!rt->m_dn)
{ {
rt->m_dn = LinkBox(c->m_x + 8, c->m_y + 8); rt->m_dn = LinkBox(c->m_x + 8, c->m_y + 8);
rt->m_dn->m_up = rt; rt->m_dn->m_up = rt;
} }
rt->m_on[6] += 0x00000001; rt->m_on[6] += 0x00000001;
@@ -656,9 +656,10 @@ bool Life::NextTic()
rt->m_dn->m_on[0] += 0x00000001; rt->m_dn->m_on[0] += 0x00000001;
} }
} }
// inner cells // inner cells
for (int i = 1; i <= 3; i++) int i;
for (i = 1; i <= 3; i++)
{ {
t1 = ((c->m_live1) >> (i * 8)) & 0x000000ff; t1 = ((c->m_live1) >> (i * 8)) & 0x000000ff;
if (t1) if (t1)
@@ -668,7 +669,7 @@ bool Life::NextTic()
c->m_on[i + 1] += g_tab1[t1]; c->m_on[i + 1] += g_tab1[t1];
} }
} }
for (int i = 0; i <= 2; i++) for (i = 0; i <= 2; i++)
{ {
t1 = ((c->m_live2) >> (i * 8)) & 0x000000ff; t1 = ((c->m_live2) >> (i * 8)) & 0x000000ff;
if (t1) if (t1)
@@ -690,15 +691,16 @@ bool Life::NextTic()
// Stabilize // Stabilize
// //
// WARNING: to be optimized and unrolled soon. // WARNING: to be optimized and unrolled soon.
// //
c = m_head; c = m_head;
while (c) while (c)
{ {
t1 = c->m_live1; t1 = c->m_live1;
c->m_old1 = t1; c->m_old1 = t1;
t2 = 0; t2 = 0;
for (int i = 0; i <= 3; i++) int i;
for (i = 0; i <= 3; i++)
{ {
t3 = c->m_on[i]; t3 = c->m_on[i];
if (!t3) if (!t3)
@@ -712,13 +714,13 @@ bool Life::NextTic()
{ {
t2 >>= 1; t2 >>= 1;
t4 = t3 & 0x0000000f; t4 = t3 & 0x0000000f;
if ((t4 == 3) || ((t4 == 2) && (t1 & 0x00000001))) if ((t4 == 3) || ((t4 == 2) && (t1 & 0x00000001)))
{ {
t2 |= 0x80000000; t2 |= 0x80000000;
m_numcells++; m_numcells++;
} }
t3 >>= 4; t3 >>= 4;
t1 >>= 1; t1 >>= 1;
} }
@@ -729,7 +731,7 @@ bool Life::NextTic()
t1 = c->m_live2; t1 = c->m_live2;
c->m_old2 = t1; c->m_old2 = t1;
t2 = 0; t2 = 0;
for (int i = 4; i <= 7; i++) for (i = 4; i <= 7; i++)
{ {
t3 = c->m_on[i]; t3 = c->m_on[i];
if (!t3) if (!t3)
@@ -743,13 +745,13 @@ bool Life::NextTic()
{ {
t2 >>= 1; t2 >>= 1;
t4 = t3 & 0x0000000f; t4 = t3 & 0x0000000f;
if ((t4 == 3) || ((t4 == 2) && (t1 & 0x00000001))) if ((t4 == 3) || ((t4 == 2) && (t1 & 0x00000001)))
{ {
t2 |= 0x80000000; t2 |= 0x80000000;
m_numcells++; m_numcells++;
} }
t3 >>= 4; t3 >>= 4;
t1 >>= 1; t1 >>= 1;
} }
@@ -759,7 +761,7 @@ bool Life::NextTic()
// keep track of changes // keep track of changes
changed |= ((c->m_live1 ^ c->m_old1) || (c->m_live2 ^ c->m_old2)); changed |= ((c->m_live1 ^ c->m_old1) || (c->m_live2 ^ c->m_old2));
// mark, and discard if necessary, dead boxes // mark, and discard if necessary, dead boxes
if (c->m_live1 || c->m_live2) if (c->m_live1 || c->m_live2)
{ {
@@ -770,8 +772,8 @@ bool Life::NextTic()
{ {
CellBox *aux = c->m_next; CellBox *aux = c->m_next;
if (c->m_dead++ > MAXDEAD) if (c->m_dead++ > MAXDEAD)
KillBox(c); KillBox(c);
c = aux; c = aux;
} }
} }