View Javadoc
1   package org.woehlke.computer.kurzweil.conwaysgameoflive.model.census;
2   
3   import lombok.EqualsAndHashCode;
4   import lombok.Getter;
5   import lombok.ToString;
6   import lombok.extern.log4j.Log4j2;
7   import org.woehlke.computer.kurzweil.conwaysgameoflive.config.ComputerKurzweilProperties;
8   
9   import java.io.Serializable;
10  import java.util.Stack;
11  
12  /**
13   * Holds Data how many Cells per LifeCycleStatus and how many Cells in the whole Population for a Stack of Generations
14   *
15   * © 2006 - 2008 Thomas Woehlke.
16   * @author Thomas Woehlke
17   *
18   * @see <a href="https://github.com/Computer-Kurzweil/conwaysgameoflife">Github Repository</a>
19   * @see <a href="https://java.woehlke.org/conwaysgameoflife/">Maven Project Repository</a>
20   */
21  @Log4j2
22  @ToString(callSuper = true, exclude={"statistics"})
23  @EqualsAndHashCode(exclude={"statistics"})
24  public class ConwaysGameOfLifePopulationCensusContainer implements Serializable {
25  
26      static final long serialVersionUID = 242L;
27  
28      private final int queueMaxLength;
29  
30      private final Stack<ConwaysGameOfLivePopulationCensus> statistics =
31          new Stack<>();
32  
33      private volatile ConwaysGameOfLivePopulationCensus currentPopulationCensus;
34  
35      @Getter
36      private volatile long worldIteration;
37  
38      public ConwaysGameOfLifePopulationCensusContainer(
39          ComputerKurzweilProperties p
40      ) {
41          this.queueMaxLength = p.getSimulatedevolution().getControl().getQueueMaxLength();
42          this.worldIteration = 0L;
43      }
44  
45      public synchronized void push(ConwaysGameOfLivePopulationCensus populationCensus) {
46          this.currentPopulationCensus = populationCensus;
47          this.worldIteration++;
48          populationCensus.setWorldIteration(worldIteration);
49          statistics.push(populationCensus);
50          if (statistics.size() > queueMaxLength) {
51              statistics.removeElementAt(0);
52          }
53          log.info(worldIteration + " : " + populationCensus.toString());
54      }
55  
56      public synchronized ConwaysGameOfLivePopulationCensus peek() {
57          if(null == this.currentPopulationCensus) {
58              ConwaysGameOfLivePopulationCensus populationCensus = new ConwaysGameOfLivePopulationCensus();
59              populationCensus.setWorldIteration(worldIteration);
60              statistics.push(populationCensus);
61          }
62          return this.currentPopulationCensus;
63      }
64  }