]> git.saurik.com Git - wxWidgets.git/blobdiff - demos/life/game.cpp
make it non mach-o carbon savvy
[wxWidgets.git] / demos / life / game.cpp
index a356f550a1216aadd9fb87ff76c80caef2dc811c..5b7e6ce79aec25985e399d1328206d96bc130f70 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __WIN16__
-#error "Sorry, Life! will not work in 16-bit Windows"
-#endif
-
 // ==========================================================================
 // headers, declarations, constants
 // ==========================================================================
 // ==========================================================================
 // headers, declarations, constants
 // ==========================================================================
@@ -50,7 +46,7 @@
 
 #define HASH(x, y) (((x >> 3) & 0x7f) << 7) + ((y >> 3) & 0x7f)
 
 
 #define HASH(x, y) (((x >> 3) & 0x7f) << 7) + ((y >> 3) & 0x7f)
 
-#define HASHSIZE   32768      // hash table size (do not change!)
+#define HASHSIZE   16384      // hash table size (do not change!)
 #define CELLBOX    8          // cells in a cellbox (do not change!)
 
 
 #define CELLBOX    8          // cells in a cellbox (do not change!)
 
 
@@ -79,9 +75,9 @@ public:
 bool LifeCellBox::IsAlive(int dx, int dy) const
 {
     if (dy > 3)
 bool LifeCellBox::IsAlive(int dx, int dy) const
 {
     if (dy > 3)
-        return (m_live2 & 1 << ((dy - 4) * 8 + dx));
+        return (bool)(m_live2 & 1 << ((dy - 4) * 8 + dx));
     else
     else
-        return (m_live1 & 1 << ((dy) * 8 + dx));
+        return (bool)(m_live1 & 1 << ((dy) * 8 + dx));
 }
 
 // SetCell:
 }
 
 // SetCell:
@@ -879,12 +875,27 @@ bool Life::NextTic()
         c->m_live1 = t1;
         c->m_live2 = t2;
 
         c->m_live1 = t1;
         c->m_live2 = t2;
 
-        // count alive cells (TODO: find a better way to do this)
+        // count alive cells
+#if 1
+        wxUint32 t1_, t2_;
+
+        t1_ = (t1  & 0x55555555) + (t1  >> 1 & 0x55555555);
+        t1_ = (t1_ & 0x33333333) + (t1_ >> 2 & 0x33333333);
+
+        t2_ = (t2  & 0x55555555) + (t2  >> 1 & 0x55555555);
+        t2_ = (t2_ & 0x33333333) + (t2_ >> 2 & 0x33333333) + t1_;
+        t2_ = (t2_ & 0x0F0F0F0F) + (t2_ >> 4 & 0x0F0F0F0F);
+        t2_ = (t2_ & 0x00FF00FF) + (t2_ >> 8 & 0x00FF00FF);
+
+        m_numcells += (t2_ & 0xFF) + (t2_ >> 16 & 0xFF);
+#else
+        // Original, slower code
         for (int i = 0; i < 32; i++)
         {
             if (t1 & (1 << i)) m_numcells++;
             if (t2 & (1 << i)) m_numcells++;
         }
         for (int i = 0; i < 32; i++)
         {
             if (t1 & (1 << i)) m_numcells++;
             if (t2 & (1 << i)) m_numcells++;
         }
+#endif
 
         changed |= ((t1 ^ c->m_old1) || (t2 ^ c->m_old2));
 
 
         changed |= ((t1 ^ c->m_old1) || (t2 ^ c->m_old2));