All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.l4.vibe.probes.Scale Maven / Gradle / Ivy

There is a newer version: 0.4.0
Show newest version
package se.l4.vibe.probes;

/**
 * Methods for scaling probe values. Useful for example when wanting to measure
 * data in kilobytes instead of bytes.
 * 
 * @author Andreas Holstenson
 *
 */
public class Scale
{
	private Scale()
	{
	}
	
	/**
	 * Scale a number to a number of significant decimals.
	 * 
	 * @param probe
	 * @param decimals
	 * @return
	 */
	public static SampledProbe scale(
			SampledProbe probe,
			int decimals)
	{
		return new ScaledSampledProbe(probe, decimals);
	}
	
	/**
	 * Scale a number to a number of significant decimals.
	 * 
	 * @param probe
	 * @param decimals
	 * @return
	 */
	public static Probe scale(
			Probe probe,
			int decimals)
	{
		return new ScaledProbe(probe, decimals);
	}
	
	/**
	 * Create a new sampled probe that will use another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static SampledProbe divide(
			SampledProbe probe,
			int divisor)
	{
		return new DoubleSampledProbe(probe, 1.0 / divisor);
	}
	
	/**
	 * Create a new sampled probe that will use another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static SampledProbe divideAsLong(
			SampledProbe probe,
			int divisor)
	{
		return new LongSampledProbe(probe, 1.0 / divisor);
	}
	
	/**
	 * Create a new sampled probe that will use another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static SampledProbe multiply(
			SampledProbe probe,
			int multiplier)
	{
		return new DoubleSampledProbe(probe, multiplier);
	}
	
	/**
	 * Create a new sampled probe that will use another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static SampledProbe multiplyAsLong(
			SampledProbe probe,
			int multiplier)
	{
		return new LongSampledProbe(probe, 1.0 / multiplier);
	}
	
	/**
	 * Create a new probe that will divide the value of another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static Probe divide(
			Probe probe,
			int divisor)
	{
		return new DoubleProbe(probe, 1.0 / divisor);
	}
	
	/**
	 * Create a new probe that will divide the value of another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static Probe divideAsLong(
			Probe probe,
			int divisor)
	{
		return new LongProbe(probe, 1.0 / divisor);
	}
	
	/**
	 * Create a new probe that will multiply the value of another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static Probe multiply(
			Probe probe,
			int multiplier)
	{
		return new DoubleProbe(probe, multiplier);
	}
	
	/**
	 * Create a new that will multiply the value of another probe.
	 * 
	 * @param probe
	 * @param divisor
	 * @return
	 */
	public static Probe multiplyAsLong(
			Probe probe,
			int multiplier)
	{
		return new LongProbe(probe, 1.0 / multiplier);
	}
	
	private static class ScaledSampledProbe
		implements SampledProbe
	{
		private final SampledProbe probe;
		private final int scale;

		public ScaledSampledProbe(SampledProbe probe, int scale)
		{
			this.probe = probe;
			this.scale = scale * 10;
		}
		
		private double scale(Number in)
		{
			return (Math.round(in.doubleValue() * scale)) / (double) scale;
		}
		
		@Override
		public Double peek()
		{
			return scale(probe.peek());
		}
		
		@Override
		public Double read()
		{
			return scale(probe.read());
		}
		
		@Override
		public Double sample()
		{
			return scale(probe.sample());
		}
	}
	
	private static class ScaledProbe
		implements Probe
	{
		private final Probe probe;
		private final int scale;
	
		public ScaledProbe(Probe probe, int scale)
		{
			this.probe = probe;
			this.scale = scale * 10;
		}
		
		private double scale(Number in)
		{
			return (Math.round(in.doubleValue() * scale)) / (double) scale;
		}
		
		@Override
		public Double read()
		{
			return scale(probe.read());
		}
	}
	
	private static class DoubleSampledProbe
		implements SampledProbe
	{
		private final SampledProbe probe;
		private final double scale;

		public DoubleSampledProbe(SampledProbe probe, double scale)
		{
			this.probe = probe;
			this.scale = scale;
		}
		
		@Override
		public Double peek()
		{
			return probe.peek().doubleValue() * scale;
		}
		
		@Override
		public Double read()
		{
			return probe.read().doubleValue() * scale;
		}
		
		@Override
		public Double sample()
		{
			return probe.sample().doubleValue() * scale;
		}
	}
	
	private static class LongSampledProbe
		implements SampledProbe
	{
		private final SampledProbe probe;
		private final double scale;
	
		public LongSampledProbe(SampledProbe probe, double scale)
		{
			this.probe = probe;
			this.scale = scale;
		}
		
		@Override
		public Long peek()
		{
			return (long) (probe.peek().doubleValue() * scale);
		}
		
		@Override
		public Long read()
		{
			return (long) (probe.read().doubleValue() * scale);
		}
		
		@Override
		public Long sample()
		{
			return (long) (probe.sample().doubleValue() * scale);
		}
	}
	
	private static class DoubleProbe
		implements Probe
	{
		private final Probe probe;
		private final double scale;
	
		public DoubleProbe(Probe probe, double scale)
		{
			this.probe = probe;
			this.scale = scale;
		}
		
		@Override
		public Double read()
		{
			return probe.read().doubleValue() * scale;
		}
	}
	
	private static class LongProbe
		implements Probe
	{
		private final Probe probe;
		private final double scale;
	
		public LongProbe(Probe probe, double scale)
		{
			this.probe = probe;
			this.scale = scale;
		}
		
		@Override
		public Long read()
		{
			return (long) (probe.read().doubleValue() * scale);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy