001/*
002 * Units of Measurement API
003 * Copyright (c) 2014-2023, Jean-Marie Dautelle, Werner Keil, Otavio Santana.
004 *
005 * All rights reserved.
006 *
007 * Redistribution and use in source and binary forms, with or without modification,
008 * are permitted provided that the following conditions are met:
009 *
010 * 1. Redistributions of source code must retain the above copyright notice,
011 *    this list of conditions and the following disclaimer.
012 *
013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
014 *    and the following disclaimer in the documentation and/or other materials provided with the distribution.
015 *
016 * 3. Neither the name of JSR-385 nor the names of its contributors may be used to endorse or promote products
017 *    derived from this software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package javax.measure.test.function;
031
032import javax.measure.UnitConverter;
033import javax.measure.test.TestConverter;
034
035import java.util.Objects;
036
037/**
038 * <p>
039 * This class represents a converter multiplying numeric values by a constant scaling factor (<code>double</code> based).
040 * </p>
041 *
042 * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a>
043 * @author <a href="mailto:werner@uom.technology">Werner Keil</a>
044 * @version 1.1, June 28, 2019
045 * @since 2.0
046 */
047public final class MultiplyConverter extends TestConverter implements Comparable<UnitConverter> {
048
049    /**
050     * Holds the scale factor.
051     */
052    private double factor;
053
054    /**
055     * Creates a multiply converter with the specified scale factor.
056     *
057     * @param factor
058     *          the scaling factor.
059     * @throws IllegalArgumentException
060     *           if coefficient is <code>1.0</code> (would result in identity converter)
061     */
062    public MultiplyConverter(double factor) {
063        if (factor == 1.0)
064            throw new IllegalArgumentException("Would result in identity converter");
065        this.factor = factor;
066    }
067    
068    /**
069     * Creates a multiply converter with the specified scale factor.
070     *
071     * @param factor
072     *          the scaling factor.
073     * @throws IllegalArgumentException
074     *           if coefficient is <code>1.0</code> (would result in identity converter)
075     */
076    public MultiplyConverter(Number factor) {
077        this(factor.doubleValue());
078    }
079
080    /**
081     * Returns the scale factor of this converter.
082     *
083     * @return the scale factor.
084     */
085    public double getFactor() {
086        return factor;
087    }
088
089    @Override
090    public UnitConverter concatenate(UnitConverter converter) {
091        if (!(converter instanceof MultiplyConverter))
092            return super.concatenate(converter);
093        double newfactor = factor * ((MultiplyConverter) converter).factor;
094        return newfactor == 1.0 ? IDENTITY : new MultiplyConverter(newfactor);
095    }
096
097    @Override
098    public MultiplyConverter inverse() {
099        return new MultiplyConverter(1.0 / factor);
100    }
101
102    @Override
103    public double convert(double value) {
104        return value * factor;
105    }
106
107    @Override
108    public final String toString() {
109        return MultiplyConverter.class.getSimpleName() + "(" + factor + ")";
110    }
111
112    @Override
113    public boolean equals(Object obj) {
114        if (this == obj) {
115            return true;
116        }
117        if (obj instanceof MultiplyConverter) {
118            MultiplyConverter that = (MultiplyConverter) obj;
119            return Objects.equals(factor, that.factor);
120        }
121        return false;
122    }
123
124    @Override
125    public int hashCode() {
126        return Objects.hashCode(factor);
127    }
128
129    @Override
130    public boolean isLinear() {
131        return true;
132    }
133
134    public Double getValue() {
135        return factor;
136    }
137
138    @Override
139    public int compareTo(UnitConverter o) {
140        if (this == o) {
141            return 0;
142        }
143        if (o instanceof MultiplyConverter) {
144            return getValue().compareTo(((MultiplyConverter) o).getValue());
145        }
146        return -1;
147    }
148}