package org.das2.datum; /** * Divides a given range of input values into useful intervals. This can be * used, for example, to determine the locations of tick marks on an axis. * Implementations will vary their behavior based on a number of factors including * the type of data in question. *
* Note that the intervals need not be uniformly sized. For example, this would * be the case when dividing a time interval into months, or into log spaced * intervals. *
* Implementations should have protected constructors so factory methods in
* DomainDividerUtil
can access them.
*
* @author Ed Jackson
*/
public interface DomainDivider {
/**
* Return a new divider with larger intervals. If the superset
* parameter is true, the interval boundaries of the new divider are
* guaranteed to align with (some) interval boundaries of the existing one.
* In other words, the existing divider will subdivide the new one.
* @param superset true to force boundary alignment with the calling DomainDivider
.
* For a given range, the boundaries will be aligned.
* @return the new DomainDivider object
*/
public DomainDivider coarserDivider(boolean superset);
/**
* Return a new divider with smaller intervals. If the superset
* parameter is true, the interval boundaries of the existing divider are
* guaranteed to align with (some) intervals of the new one. In other
* words, the new divider will subdivide the existing one.
* @param superset true to force boundary alignment with the calling DomainDivider
* For a given range, the boundaries will be aligned.
* @return the new DomainDivider object
*/
public DomainDivider finerDivider(boolean superset);
public final int MAX_BOUNDARIES=1000000;
/**
* Returns the boundaries between intervals on the given data range. When
* min or max lay on a boundary, it should be returned. Note this is
* inconsistent with DatumRange logic, where the max is exclusive.
* If min>&eq;max, then an empty list should be returned.
* @param min the lower bound
* @param max the upper bound
* @return a DatumVector
containing the boundary values
*/
public DatumVector boundaries(Datum min, Datum max);
/**
* Compute the number of intervals produced by this DomainDivider
* on the given range. This allows the DomainDivider to indicate the number
* of intervals (e.g. a zillion) without having to enumerate them. When
* min or max lay on a boundary, it should be counted (inclusive max). If
* min>&eq;max, then zero should be returned.
* @param min
* @param max
* @return
*/
public long boundaryCount(Datum min, Datum max);
/**
* Return a DatumRange
representing the interval containing
* the given value.
* @param v
* @return the range containing a given value.
*/
public DatumRange rangeContaining(Datum v);
}