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
14
15
16
17
18
19
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 }