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 | /** |
13 | * <p> This class represents a converter adding a constant offset |
14 | * (approximated as a <code>double</code>) to numeric values.</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 AddConverter extends UnitConverter { |
22 | |
23 | /** |
24 | * Holds the offset. |
25 | */ |
26 | private final double _offset; |
27 | |
28 | /** |
29 | * Creates an add converter with the specified offset. |
30 | * |
31 | * @param offset the offset value. |
32 | * @throws IllegalArgumentException if offset is zero (or close to zero). |
33 | */ |
34 | public AddConverter(double offset) { |
35 | if ((float)offset == 0.0) |
36 | throw new IllegalArgumentException("Identity converter not allowed"); |
37 | _offset = offset; |
38 | } |
39 | |
40 | /** |
41 | * Returns the offset value for this add converter. |
42 | * |
43 | * @return the offset value. |
44 | */ |
45 | public double getOffset() { |
46 | return _offset; |
47 | } |
48 | |
49 | @Override |
50 | public UnitConverter inverse() { |
51 | return new AddConverter(- _offset); |
52 | } |
53 | |
54 | @Override |
55 | public double convert(double amount) { |
56 | return amount + _offset; |
57 | } |
58 | |
59 | @Override |
60 | public boolean isLinear() { |
61 | return false; |
62 | } |
63 | |
64 | @Override |
65 | public UnitConverter concatenate(UnitConverter converter) { |
66 | if (converter instanceof AddConverter) { |
67 | double offset = _offset + ((AddConverter)converter)._offset; |
68 | return valueOf(offset); |
69 | } else { |
70 | return super.concatenate(converter); |
71 | } |
72 | } |
73 | |
74 | private static UnitConverter valueOf(double offset) { |
75 | float asFloat = (float) offset; |
76 | return asFloat == 0.0f ? UnitConverter.IDENTITY : new AddConverter(offset); |
77 | } |
78 | |
79 | private static final long serialVersionUID = 1L; |
80 | } |