MagneticFluxDensityConverter.java

/*
 * Copyright (C) 2020 Alberto Irurueta Carro (alberto@irurueta.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.irurueta.units;

import java.math.BigDecimal;

/**
 * Does magnetic flux density conversions to different units.
 * To prevent loss of accuracy, conversion should only be done as a final step
 * before displaying magnetic flux density measurements.
 */
public class MagneticFluxDensityConverter {

    /**
     * Number of Teslas in one nanotesla.
     */
    static final double TESLAS_PER_NANOTESLA = 1e-9;

    /**
     * Number of Teslas in one microtesla.
     */
    static final double TESLAS_PER_MICROTESLA = 1e-6;

    /**
     * Number of Teslas in one millitesla.
     */
    static final double TESLAS_PER_MILLITESLA = 1e-3;

    /**
     * Number of Teslas in one Kilotesla.
     */
    static final double TESLAS_PER_KILOTESLA = 1e3;

    /**
     * Number of Teslas in one Megatesla.
     */
    static final double TESLAS_PER_MEGATESLA = 1e6;

    /**
     * Number of Teslas in one Gigatesla.
     */
    static final double TESLAS_PER_GIGATESLA = 1e9;

    /**
     * Constructor.
     * Prevents instantiation of helper class.
     */
    private MagneticFluxDensityConverter() {
    }

    /**
     * Converts a magnetic flux density to provided output magnetic flux density unit.
     *
     * @param input  input magnetic flux density to be converted.
     * @param output output magnetic flux density where result will be stored and
     *               containing output unit.
     */
    public static void convert(final MagneticFluxDensity input, final MagneticFluxDensity output) {
        convert(input, output.getUnit(), output);
    }

    /**
     * Converts a magnetic flux density to requested output unit.
     *
     * @param input      input magnetic flux density to be converted.
     * @param outputUnit requested output unit.
     * @return converted magnetic flux density.
     */
    public static MagneticFluxDensity convertAndReturnNew(
            final MagneticFluxDensity input, final MagneticFluxDensityUnit outputUnit) {
        final var result = new MagneticFluxDensity();
        convert(input, outputUnit, result);
        return result;
    }

    /**
     * Converts and updates a magnetic flux density to requested output unit.
     *
     * @param magneticFluxDensity input magnetic flux density to be converted
     *                            and updated.
     * @param outputUnit          requested output unit.
     */
    public static void convert(
            final MagneticFluxDensity magneticFluxDensity, final MagneticFluxDensityUnit outputUnit) {
        convert(magneticFluxDensity, outputUnit, magneticFluxDensity);
    }

    /**
     * Converts a magnetic flux density to requested output unit.
     *
     * @param input      input magnetic flux density to be converted.
     * @param outputUnit requested output unit.
     * @param result     magnetic flux density where result will be stored.
     */
    public static void convert(
            final MagneticFluxDensity input, final MagneticFluxDensityUnit outputUnit,
            final MagneticFluxDensity result) {
        final var value = convert(input.getValue(), input.getUnit(), outputUnit);
        result.setValue(value);
        result.setUnit(outputUnit);
    }

    /**
     * Converts a magnetic flux density value from input unit to provided
     * output unit.
     *
     * @param input      magnetic flux density value.
     * @param inputUnit  input magnetic flux density unit.
     * @param outputUnit output magnetic flux density unit.
     * @return converted magnetic flux density value.
     */
    public static Number convert(
            final Number input, final MagneticFluxDensityUnit inputUnit, final MagneticFluxDensityUnit outputUnit) {
        return BigDecimal.valueOf(convert(input.doubleValue(), inputUnit, outputUnit));
    }

    /**
     * Converts a magnetic flux density value from input unit to provided
     * output unit.
     *
     * @param input      magnetic flux density value.
     * @param inputUnit  input magnetic flux density unit.
     * @param outputUnit output magnetic flux density unit.
     * @return converted magnetic flux density value.
     */
    public static double convert(
            final double input, final MagneticFluxDensityUnit inputUnit, final MagneticFluxDensityUnit outputUnit) {
        // convert to Tesla
        final var tesla = switch (inputUnit) {
            case NANOTESLA -> nanoTeslaToTesla(input);
            case MICROTESLA -> microTeslaToTesla(input);
            case MILLITESLA -> milliTeslaToTesla(input);
            case KILOTESLA -> kiloTeslaToTesla(input);
            case MEGATESLA -> megaTeslaToTesla(input);
            case GIGATESLA -> gigaTeslaToTesla(input);
            default -> input;
        };

        // convert from Tesla to output unit
        return switch (outputUnit) {
            case NANOTESLA -> teslaToNanoTesla(tesla);
            case MICROTESLA -> teslaToMicroTesla(tesla);
            case MILLITESLA -> teslaToMilliTesla(tesla);
            case KILOTESLA -> teslaToKiloTesla(tesla);
            case MEGATESLA -> teslaToMegaTesla(tesla);
            case GIGATESLA -> teslaToGigaTesla(tesla);
            default -> tesla;
        };
    }

    /**
     * Converts provided Tesla value to nanoteslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to nanoteslas.
     */
    public static double teslaToNanoTesla(final double tesla) {
        return tesla / TESLAS_PER_NANOTESLA;
    }

    /**
     * Converts provided Tesla value to microteslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to microteslas.
     */
    public static double teslaToMicroTesla(final double tesla) {
        return tesla / TESLAS_PER_MICROTESLA;
    }

    /**
     * Converts provided Tesla value to milliteslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to milliteslas.
     */
    public static double teslaToMilliTesla(final double tesla) {
        return tesla / TESLAS_PER_MILLITESLA;
    }

    /**
     * Converts provided Tesla value to Kiloteslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to Kiloteslas.
     */
    public static double teslaToKiloTesla(final double tesla) {
        return tesla / TESLAS_PER_KILOTESLA;
    }

    /**
     * Converts provided Tesla value to Megateslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to Megateslas.
     */
    public static double teslaToMegaTesla(final double tesla) {
        return tesla / TESLAS_PER_MEGATESLA;
    }

    /**
     * Converts provided Tesla value to Gigateslas.
     *
     * @param tesla tesla value.
     * @return some amount of magnetic flux density converted to Gigateslas.
     */
    public static double teslaToGigaTesla(final double tesla) {
        return tesla / TESLAS_PER_GIGATESLA;
    }

    /**
     * Converts provided nanotesla value to Teslas.
     *
     * @param nanoTesla nanotesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double nanoTeslaToTesla(final double nanoTesla) {
        return nanoTesla * TESLAS_PER_NANOTESLA;
    }

    /**
     * Converts provided microtesla value to Teslas.
     *
     * @param microTesla microtesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double microTeslaToTesla(final double microTesla) {
        return microTesla * TESLAS_PER_MICROTESLA;
    }

    /**
     * Converts provided millitesla value to Teslas.
     *
     * @param milliTesla millitesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double milliTeslaToTesla(final double milliTesla) {
        return milliTesla * TESLAS_PER_MILLITESLA;
    }

    /**
     * Converts provided Kilotesla value to Teslas.
     *
     * @param kiloTesla Kilotesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double kiloTeslaToTesla(final double kiloTesla) {
        return kiloTesla * TESLAS_PER_KILOTESLA;
    }

    /**
     * Converts provided Megatesla value to Teslas.
     *
     * @param megaTesla Megatesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double megaTeslaToTesla(final double megaTesla) {
        return megaTesla * TESLAS_PER_MEGATESLA;
    }

    /**
     * Converts provided Gigatesla value to Teslas.
     *
     * @param gigaTesla Gigatesla value.
     * @return some amount of magnetic flux density converted to Teslas.
     */
    public static double gigaTeslaToTesla(final double gigaTesla) {
        return gigaTesla * TESLAS_PER_GIGATESLA;
    }
}