1 | /* |
2 | * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. |
3 | * Copyright (C) 2006 - JScience (http://jscience.org/) |
4 | * All rights reserved. |
5 | * |
6 | * Permission to use, copy, modify, and distribute this software is |
7 | * freely granted, provided that this notice is preserved. |
8 | */ |
9 | package javax.measure.converter; |
10 | |
11 | /** |
12 | * <p> This class represents a converter multiplying numeric values by a |
13 | * constant scaling factor (approximated as a <code>double</code>). |
14 | * For exact scaling conversions {@link RationalConverter} is preferred.</p> |
15 | * |
16 | * <p> Instances of this class are immutable.</p> |
17 | * |
18 | * @author <a href="mailto:jean-marie@dautelle.com">Jean-Marie Dautelle</a> |
19 | * @version 3.1, April 22, 2006 |
20 | */ |
21 | public final class MultiplyConverter extends UnitConverter { |
22 | |
23 | /** |
24 | * Holds the scale factor. |
25 | */ |
26 | private final double _factor; |
27 | |
28 | /** |
29 | * Creates a multiply converter with the specified scale factor. |
30 | * |
31 | * @param factor the scale factor. |
32 | * @throws IllegalArgumentException if offset is one (or close to one). |
33 | */ |
34 | public MultiplyConverter(double factor) { |
35 | if ((float)factor == 1.0) |
36 | throw new IllegalArgumentException("Identity converter not allowed"); |
37 | _factor = factor; |
38 | } |
39 | |
40 | /** |
41 | * Returns the scale factor. |
42 | * |
43 | * @return the scale factor. |
44 | */ |
45 | public double getFactor() { |
46 | return _factor; |
47 | } |
48 | |
49 | @Override |
50 | public UnitConverter inverse() { |
51 | return new MultiplyConverter(1.0 / _factor); |
52 | } |
53 | |
54 | @Override |
55 | public double convert(double amount) { |
56 | return _factor * amount; |
57 | } |
58 | |
59 | @Override |
60 | public boolean isLinear() { |
61 | return true; |
62 | } |
63 | |
64 | @Override |
65 | public UnitConverter concatenate(UnitConverter converter) { |
66 | if (converter instanceof MultiplyConverter) { |
67 | double factor = _factor * ((MultiplyConverter) converter)._factor; |
68 | return valueOf(factor); |
69 | } else if (converter instanceof RationalConverter) { |
70 | double factor = _factor |
71 | * ((RationalConverter) converter).getDividend() |
72 | / ((RationalConverter) converter).getDivisor(); |
73 | return valueOf(factor); |
74 | } else { |
75 | return super.concatenate(converter); |
76 | } |
77 | } |
78 | |
79 | private static UnitConverter valueOf(double factor) { |
80 | float asFloat = (float) factor; |
81 | return asFloat == 1.0f ? UnitConverter.IDENTITY |
82 | : new MultiplyConverter(factor); |
83 | } |
84 | |
85 | private static final long serialVersionUID = 1L; |
86 | } |