// This file is part of OpenTSDB.
// Copyright (C) 2010-2012  The OpenTSDB Authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or (at your
// option) any later version.  This program is distributed in the hope that it
// will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
// General Public License for more details.  You should have received a copy
// of the GNU Lesser General Public License along with this program.  If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.core;

import java.util.NoSuchElementException;

import net.opentsdb.core.Aggregators.Interpolation;

/**
 * A function capable of aggregating multiple {@link DataPoints} together.
 * <p>
 * All aggregators must be stateless.  All they can do is run through a
 * sequence of {@link Longs Longs} or {@link Doubles Doubles} and return an
 * aggregated value.
 */
public abstract class Aggregator {
  
  /** Interpolation method this aggregator uses across time series */
  private final Interpolation interpolation_method;
  
  /** String name of the aggregator */
  private final String name;

  /**
   * Create a new instance of this class.
   * @param interpolationMethod The interpolation method to use.
   * @param name The name of this aggregator.
   */
  protected Aggregator(final Interpolation interpolationMethod, final String name) {
    this.interpolation_method = interpolationMethod;
    this.name = name;
  }
  
  /**
   * A sequence of {@code long}s.
   * <p>
   * This interface is semantically equivalent to
   * {@code Iterator<long>}.
   */
  public interface Longs {

    /**
     * Returns {@code true} if this sequence has more values.
     * {@code false} otherwise.
     */
    boolean hasNextValue();

    /**
     * Returns the next {@code long} value in this sequence.
     * @throws NoSuchElementException if calling {@link #hasNextValue} returns
     * {@code false}.
     */
    long nextLongValue();

  }

  /**
   * A sequence of {@code double}s.
   * <p>
   * This interface is semantically equivalent to
   * {@code Iterator<double>}.
   */
  public interface Doubles {

    /**
     * Returns {@code true} if this sequence has more values.
     * {@code false} otherwise.
     */
    boolean hasNextValue();

    /**
     * Returns the next {@code double} value in this sequence.
     * @throws NoSuchElementException if calling {@link #hasNextValue} returns
     * {@code false}.
     */
    double nextDoubleValue();

  }

  /**
   * Aggregates a sequence of {@code long}s.
   * @param values The sequence to aggregate.
   * @return The aggregated value.
   */
  abstract long runLong(Longs values);

  /**
   * Aggregates a sequence of {@code double}s.
   * @param values The sequence to aggregate.
   * @return The aggregated value.
   */
  abstract double runDouble(Doubles values);

  /** 
   * Returns the interpolation method to use when working with data points
   * across time series.
   * @return The interpolation method to use
   */
  Interpolation interpolationMethod() {
    return interpolation_method;
  }
  
  @Override
  public String toString() {
    return name;
  }
}

@@ -2854,32 +2854,39 @@
  value.%0A   */%0A  
+public 
 abstract long ru
@@ -3049,16 +3049,23 @@
    */%0A  
+public 
 abstract

Make the runDouble() and runLong() abstract methods public in the Aggregator class so we can implement it in other locations.