[llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/Prolangs-C++/life/life.cpp

Chris Lattner lattner at cs.uiuc.edu
Mon Oct 4 13:01:29 PDT 2004



Changes in directory llvm-test/MultiSource/Benchmarks/Prolangs-C++/life:

life.cpp added (r1.1)
---
Log message:

Initial checkin of all of the source


---
Diffs of the changes:  (+181 -0)

Index: llvm-test/MultiSource/Benchmarks/Prolangs-C++/life/life.cpp
diff -c /dev/null llvm-test/MultiSource/Benchmarks/Prolangs-C++/life/life.cpp:1.1
*** /dev/null	Mon Oct  4 15:01:24 2004
--- llvm-test/MultiSource/Benchmarks/Prolangs-C++/life/life.cpp	Mon Oct  4 15:01:14 2004
***************
*** 0 ****
--- 1,181 ----
+ // Section 9.6, "Object-Oriented Programming using C++"
+ // by Ira Pohl.  Benjamin/Cummings Publishing Company, 1993
+ 
+ const int N=40, STATES=4;			// size of square board
+ const int DRAB=3;
+ const int DFOX=8;
+ const int CYCLES=10;
+ enum state { EMPTY, GRASS, RABBIT, FOX };
+ 
+ class living;					// forward decl
+ 
+ typedef living *world[N][N];			// world is simulation
+ 
+ class living {					// what lives in world
+ protected:
+   int row, column;                              // location
+   void sums(world w, int sm[]);           // sm[#states] used by next()
+ public:
+   living (int r, int c) : row(r), column(c) {}
+   virtual state who() = 0;                      // state identification
+   virtual living *next(world w) = 0;            // compute next
+ };
+ 
+ void living::sums(world w, int sm[])
+ {
+   int i,j;
+   sm[EMPTY] = sm[GRASS] = sm[RABBIT] = sm[FOX] = 0;
+ 
+   for (i = -1; i <= 1; ++i)
+     for (j = -1; j <= 1; ++j)
+       sm[w[row+i][column+j]->who()]++;
+ }
+ 
+ class fox : public living {
+ protected:
+   int age;
+ public:
+   fox(int r, int c, int a=0) : living(r,c), age(a) {}
+   state who() {return (FOX);}
+   living *next(world w);
+ };
+ 
+ class rabbit : public living {
+ protected:
+   int age;
+ public:
+   rabbit(int r, int c, int a=0) : living(r,c), age(a) {}
+   state who() {return (RABBIT);}
+   living *next(world w);
+ };
+ 
+ class grass : public living {
+ public:
+   grass(int r, int c) : living(r,c) {}
+   state who() {return (GRASS);}
+   living *next(world w);
+ };
+ 
+ class empty : public living {
+ public:
+   empty(int r, int c) : living(r,c) {}
+   state who() {return (EMPTY);}
+   living *next(world w);
+ };
+ 
+ 
+ living *grass::next(world w)
+ {
+   int sum[STATES];
+   sums(w, sum);
+ 
+   if (sum[GRASS] > sum[RABBIT]) // eat grass
+     return (new grass(row, column));
+   else
+     return (new empty(row, column));
+ }
+ 
+ living *rabbit::next(world w)
+ {
+   int sum[STATES];
+   sums(w, sum);
+ 
+   if (sum[FOX] >= sum[RABBIT]) // eat rabbits
+     return (new empty(row, column));
+   else if (age > DRAB)         // rabbit too old
+     return (new empty(row, column));
+   else
+     return (new rabbit(row, column, age+1));
+ }
+ 
+ living *fox::next(world w)
+ {
+   int sum[STATES];
+   sums(w, sum);
+ 
+   if (sum[FOX] > 5)            // too many foxes
+     return (new empty(row, column));
+   else if (age > DFOX)         // fox too old
+     return (new empty(row, column));
+   else
+     return (new fox(row, column, age+1));
+ }
+ 
+ living *empty::next(world w)
+ {
+   int sum[STATES];
+   sums(w, sum);
+ 
+   if (sum[FOX] > 1)
+     return (new fox(row, column));
+   else if (sum[RABBIT] > 1)         // fox too old
+     return (new rabbit(row, column));
+   else if (sum[GRASS])
+     return (new grass(row, column));
+   else
+     return (new empty(row, column));
+ }
+ 
+ // world is empty
+ void init(world w)
+ {
+   int i,j;
+ 
+   for (i = 0; i < N; ++i)
+     for (j = 0; j < N; ++j)
+       w[i][j] = new empty(i,j);
+ }
+ 
+ // new world from old world
+ void update(world w_new, world w_old)
+ {
+   int i,j;
+ 
+   for (i = 1; i < N-1; ++i)
+     for (j = 1; j < N-1; ++j)
+       w_new[i][j] = w_old[i][j]->next(w_old);
+ }
+ 
+ // clean world up
+ void dele(world w)
+ {
+   int i,j;
+ 
+   for (i = 1; i < N; ++i)
+     for (j = 1; j < N; ++j)
+       delete (w[i][j]);
+ }
+ 
+ void eden(world w)
+ {
+   int i,j;
+ 
+   for (i = 1; i < N; ++i)
+     for (j = 1; j < N; ++j) {
+       if (i == j) w[i][j] = new fox(i,j);
+       else if (i < j) w[i][j] = new rabbit(i,j);
+       else w[i][j] = new grass(i,j);
+     }
+ }
+ 
+ main ()
+ {
+   world odd, even;
+   int i;
+ 
+   init(odd);
+   init(even);
+ 
+   eden(even);
+ 
+   for (i = 0; i < CYCLES; ++i) { // simulation
+     if (i % 2) {
+       update(even,odd);
+       dele(odd);
+     }
+     else {
+       update(odd,even);
+       dele(even);
+     }
+   }
+ }






More information about the llvm-commits mailing list