// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/CellFactory.java
// public interface CellFactory<T extends Cell> extends Serializable {
//     T create(int x, int y);
//     int[] flatten(T cell);
//     T inflate(int[] flattened);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/SimpleCell.java
// public class SimpleCell implements Cell {
//     static final AtomicLong NEXT_ID = new AtomicLong(0);
//     final long id = NEXT_ID.getAndIncrement();
//     final int x;
//     final int y;
//     int state;
//     int neighborCount;
//     Overseer overseer;
// 
//     public SimpleCell(int x, int y, int state) {
//         this.x = x;
//         this.y = y;
//         this.state = state;
//     }
// 
//     @Override
//     public void setOverseer(Overseer overseer) {
//         this.overseer = overseer;
//     }
// 
//     @Override
//     public void reset(int state) {
//         this.state = state;
//         neighborCount = 0;
//     }
// 
//     @Override
//     public long getId() {
//         return id;
//     }
// 
//     @Override
//     public int getX() {
//         return x;
//     }
// 
//     @Override
//     public int getY() {
//         return y;
//     }
// 
//     @Override
//     public int getState() {
//         return state;
//     }
// 
//     @Override
//     public void setState(int newState) {
//         int oldState = this.state;
//         this.state = newState;
// 
//         if (newState != oldState && overseer != null) {
//             overseer.onCellStateChanged(new CellStateChange(this));
//         }
//     }
// 
//     @Override
//     public boolean isAlive() {
//         return !isDead();
//     }
// 
//     @Override
//     public boolean isDead() {
//         return state == STATE_DEAD;
//     }
// 
//     @Override
//     public void onNeighborStateChange(int newState) {
//         if (newState == STATE_DEAD) {
//             decreaseNeighborCount();
// 
//         } else {
//             increaseNeighborCount();
//         }
//     }
// 
//     void increaseNeighborCount() {
//         neighborCount++;
//     }
// 
//     void decreaseNeighborCount() {
//         neighborCount--;
//     }
// 
//     public int getNeighborCount() {
//         return neighborCount;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         SimpleCell that = (SimpleCell) o;
// 
//         if (neighborCount != that.neighborCount) return false;
//         if (state != that.state) return false;
//         if (x != that.x) return false;
//         if (y != that.y) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = x;
//         result = 31 * result + y;
//         result = 31 * result + state;
//         result = 31 * result + neighborCount;
//         return result;
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/SimpleCellFactory.java
// public class SimpleCellFactory implements CellFactory<SimpleCell> {
//     @Override
//     public SimpleCell create(int x, int y) {
//         return new SimpleCell(x, y, SimpleCell.STATE_DEAD);
//     }
// 
//     @Override
//     public int[] flatten(SimpleCell cell) {
//         final int[] flattened = new int[4];
//         flattened[0] = cell.x;
//         flattened[1] = cell.y;
//         flattened[2] = cell.state;
//         flattened[3] = cell.neighborCount;
// 
//         return flattened;
//     }
// 
//     @Override
//     public SimpleCell inflate(int[] flattened) {
//         final SimpleCell cell = new SimpleCell(
//                 flattened[0],
//                 flattened[1],
//                 flattened[2]
//         );
// 
//         cell.neighborCount = flattened[3];
// 
//         return cell;
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/rule/ConwaysRule.java
// public class ConwaysRule extends NeighborCountBasedRule {
//     public ConwaysRule() {
//         super("23/3");
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/rule/Rule.java
// public interface Rule<T extends Cell> extends Serializable {
//     int apply(Grid<T> grid, int x, int y);
// }


import android.os.Parcel;
import hu.supercluster.gameoflife.game.cell.CellFactory;
import hu.supercluster.gameoflife.game.cell.SimpleCell;
import hu.supercluster.gameoflife.game.cell.SimpleCellFactory;
import hu.supercluster.gameoflife.game.rule.ConwaysRule;
import hu.supercluster.gameoflife.game.rule.Rule;
package hu.supercluster.gameoflife.game.cellularautomaton;



public class GameOfLife extends AbstractCellularAutomaton<SimpleCell> {
    public GameOfLife(int gridSizeX, int gridSizeY) {
        super(gridSizeX, gridSizeY);
    }

    public GameOfLife(Parcel source) {
        super(source);
    }

    @Override
    protected CellFactory<SimpleCell> getFactory() {
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/CellFactory.java
// public interface CellFactory<T extends Cell> extends Serializable {
//     T create(int x, int y);
//     int[] flatten(T cell);
//     T inflate(int[] flattened);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/SimpleCell.java
// public class SimpleCell implements Cell {
//     static final AtomicLong NEXT_ID = new AtomicLong(0);
//     final long id = NEXT_ID.getAndIncrement();
//     final int x;
//     final int y;
//     int state;
//     int neighborCount;
//     Overseer overseer;
// 
//     public SimpleCell(int x, int y, int state) {
//         this.x = x;
//         this.y = y;
//         this.state = state;
//     }
// 
//     @Override
//     public void setOverseer(Overseer overseer) {
//         this.overseer = overseer;
//     }
// 
//     @Override
//     public void reset(int state) {
//         this.state = state;
//         neighborCount = 0;
//     }
// 
//     @Override
//     public long getId() {
//         return id;
//     }
// 
//     @Override
//     public int getX() {
//         return x;
//     }
// 
//     @Override
//     public int getY() {
//         return y;
//     }
// 
//     @Override
//     public int getState() {
//         return state;
//     }
// 
//     @Override
//     public void setState(int newState) {
//         int oldState = this.state;
//         this.state = newState;
// 
//         if (newState != oldState && overseer != null) {
//             overseer.onCellStateChanged(new CellStateChange(this));
//         }
//     }
// 
//     @Override
//     public boolean isAlive() {
//         return !isDead();
//     }
// 
//     @Override
//     public boolean isDead() {
//         return state == STATE_DEAD;
//     }
// 
//     @Override
//     public void onNeighborStateChange(int newState) {
//         if (newState == STATE_DEAD) {
//             decreaseNeighborCount();
// 
//         } else {
//             increaseNeighborCount();
//         }
//     }
// 
//     void increaseNeighborCount() {
//         neighborCount++;
//     }
// 
//     void decreaseNeighborCount() {
//         neighborCount--;
//     }
// 
//     public int getNeighborCount() {
//         return neighborCount;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         SimpleCell that = (SimpleCell) o;
// 
//         if (neighborCount != that.neighborCount) return false;
//         if (state != that.state) return false;
//         if (x != that.x) return false;
//         if (y != that.y) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = x;
//         result = 31 * result + y;
//         result = 31 * result + state;
//         result = 31 * result + neighborCount;
//         return result;
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cell/SimpleCellFactory.java
// public class SimpleCellFactory implements CellFactory<SimpleCell> {
//     @Override
//     public SimpleCell create(int x, int y) {
//         return new SimpleCell(x, y, SimpleCell.STATE_DEAD);
//     }
// 
//     @Override
//     public int[] flatten(SimpleCell cell) {
//         final int[] flattened = new int[4];
//         flattened[0] = cell.x;
//         flattened[1] = cell.y;
//         flattened[2] = cell.state;
//         flattened[3] = cell.neighborCount;
// 
//         return flattened;
//     }
// 
//     @Override
//     public SimpleCell inflate(int[] flattened) {
//         final SimpleCell cell = new SimpleCell(
//                 flattened[0],
//                 flattened[1],
//                 flattened[2]
//         );
// 
//         cell.neighborCount = flattened[3];
// 
//         return cell;
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/rule/ConwaysRule.java
// public class ConwaysRule extends NeighborCountBasedRule {
//     public ConwaysRule() {
//         super("23/3");
//     }
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/rule/Rule.java
// public interface Rule<T extends Cell> extends Serializable {
//     int apply(Grid<T> grid, int x, int y);
// }


// Path: app/src/main/java/hu/supercluster/gameoflife/game/cellularautomaton/GameOfLife.java
import android.os.Parcel;
import hu.supercluster.gameoflife.game.cell.CellFactory;
import hu.supercluster.gameoflife.game.cell.SimpleCell;
import hu.supercluster.gameoflife.game.cell.SimpleCellFactory;
import hu.supercluster.gameoflife.game.rule.ConwaysRule;
import hu.supercluster.gameoflife.game.rule.Rule;

package hu.supercluster.gameoflife.game.cellularautomaton;



public class GameOfLife extends AbstractCellularAutomaton<SimpleCell> {
    public GameOfLife(int gridSizeX, int gridSizeY) {
        super(gridSizeX, gridSizeY);
    }

    public GameOfLife(Parcel source) {
        super(source);
    }

    @Override
    protected CellFactory<SimpleCell> getFactory() {
        return new SimpleCellFactory();