typedef struct world {
	unsigned int dead;
	unsigned int alive;
	unsigned int rows;
	unsigned int cols;
	unsigned int *cells;
} world;

void cb(int r, int c);

static inline unsigned int *cell(world *w, int r, int c) {
	return w->cells + (r * w->rows) + c;
}

static inline int is_alive(world *w, int r, int c) {
	return *cell(w, r, c) == w->alive;
}

static int live_neighbors(world *w, int r, int c) {
	int nc = (c + 1) & (w->cols - 1);
	int pc = (c - 1) & (w->cols - 1);
	int nr = (r + 1) & (w->rows - 1);
	int pr = (r - 1) & (w->rows - 1);

	return is_alive(w, pr, pc) +
		is_alive(w, pr, c) +
		is_alive(w, pr, nc) +
		is_alive(w, r, pc) +
		is_alive(w, r, nc) +
		is_alive(w, nr, pc) +
		is_alive(w, nr, c) +
		is_alive(w, nr, nc);
}

void mutate(world *w) {
	for (int r = 0; r < w->rows; ++r) {
		for (int c = 0; c < w->cols; ++c) {
			unsigned int v = w->dead;

			switch (live_neighbors(w, r, c)) {
			case 2:
				if (!is_alive(w, r, c)) break;
			case 3:
				v = w->alive;
			}

			*cell(w, r, c) = v;
		}
	}
}
