1 /** 2 * Redistribution and use in source and binary forms, with or without 3 * modification, are permitted provided that the following conditions are 4 * met : 5 * 6 * . Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * 9 * . Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * . The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 package cppncss.measure; 30 31 /** 32 * Computes the average of a series of values. 33 * 34 * @author Mathieu Champlon 35 */ 36 public final class Average 37 { 38 private final String label; 39 private float average; 40 private float count; 41 42 /** 43 * Create an average. 44 * 45 * @param label the label of the measurement 46 * @param value the first value of the measurement 47 */ 48 public Average( final String label, final int value ) 49 { 50 this.label = label; 51 this.average = value; 52 this.count = 1; 53 } 54 55 /** 56 * Add a value to the average and recompute it. 57 * <p> 58 * If the label does not match the label given at creation the measurement is ignored. 59 * 60 * @param label the label of the measurement 61 * @param value the value of the measurement 62 * @return whether the measurement has been accepted or not 63 */ 64 public boolean update( final String label, final int value ) 65 { 66 if( !this.label.equals( label ) ) 67 return false; 68 average = (average * count + value) / (count + 1); 69 ++count; 70 return true; 71 } 72 73 /** 74 * Accept a visitor. 75 * 76 * @param observer an average observer 77 */ 78 public void accept( final AverageObserver observer ) 79 { 80 observer.notify( label, average ); 81 } 82 }