1 package org.djutils.stats.summarizers;
2
3 import org.djutils.exceptions.Throw;
4
5 /**
6 * The Counter class defines a statistics event counter.
7 * <p>
8 * Copyright (c) 2002-2023 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
9 * for project information <a href="https://simulation.tudelft.nl/" target="_blank"> https://simulation.tudelft.nl</a>. The DSOL
10 * project is distributed under a three-clause BSD-style license, which can be found at
11 * <a href="https://simulation.tudelft.nl/dsol/3.0/license.html" target="_blank">
12 * https://simulation.tudelft.nl/dsol/3.0/license.html</a>. <br>
13 * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank"> Alexander Verbraeck</a>
14 * @author <a href="https://www.linkedin.com/in/peterhmjacobs">Peter Jacobs </a>
15 */
16 public class Counter implements Statistic
17 {
18 /** */
19 private static final long serialVersionUID = 20200228L;
20
21 /** count represents the value of the counter. */
22 private long count = 0;
23
24 /** n represents the number of measurements. */
25 private long n = 0;
26
27 /** description refers to the title of this counter. */
28 private String description;
29
30 /** the semaphore. */
31 private Object semaphore = new Object();
32
33 /**
34 * Constructs a new Counter.
35 * @param description String; the description for this counter
36 */
37 public Counter(final String description)
38 {
39 Throw.whenNull(description, "description cannot be null");
40 this.description = description;
41 initialize();
42 }
43
44 /**
45 * Returns the current counter value.
46 * @return long; the counter value
47 */
48 public long getCount()
49 {
50 return this.count;
51 }
52
53 /** {@inheritDoc} */
54 @Override
55 public long getN()
56 {
57 return this.n;
58 }
59
60 /**
61 * Process one observed value.
62 * @param value long; the value to process
63 * @return long; the value
64 */
65 public long register(final long value)
66 {
67 synchronized (this.semaphore)
68 {
69 this.count += value;
70 this.n++;
71 }
72 return value;
73 }
74
75 /**
76 * Initialize the counter.
77 */
78 @Override
79 public void initialize()
80 {
81 synchronized (this.semaphore)
82 {
83 this.n = 0;
84 this.count = 0;
85 }
86 }
87
88 /** {@inheritDoc} */
89 @Override
90 public String getDescription()
91 {
92 return this.description;
93 }
94
95 /**
96 * Return a string representing a header for a textual table with a monospaced font that can contain multiple statistics.
97 * @return String; header for the textual table.
98 */
99 public static String reportHeader()
100 {
101 return "-".repeat(72) + String.format("%n| %-48.48s | %6.6s | %8.8s |%n", "Counter name", "n", "count")
102 + "-".repeat(72);
103 }
104
105 /** {@inheritDoc} */
106 @Override
107 public String reportLine()
108 {
109 return String.format("| %-48.48s | %6d | %8d |", getDescription(), getN(), getCount());
110 }
111
112 /**
113 * Return a string representing a footer for a textual table with a monospaced font that can contain multiple statistics.
114 * @return String; footer for the textual table
115 */
116 public static String reportFooter()
117 {
118 return "-".repeat(72);
119 }
120
121 /** {@inheritDoc} */
122 @Override
123 public String toString()
124 {
125 return "Counter [description=" + this.description + ", n=" + this.n + ", count=" + this.count + "]";
126 }
127
128 }