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

org.threeten.bp.jdk8.Jdk8Methods Maven / Gradle / Ivy

Go to download

Backport of JSR-310 from JDK 8 to JDK 7 and JDK 6. NOT an implementation of the JSR.

There is a newer version: 1.7.0
Show newest version
/*
 * Copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  * Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 *  * Neither the name of JSR-310 nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.threeten.bp.jdk8;

/**
 * A set of utility methods that provide additional functionality for working
 * with dates and times.
 * 

* The contents of this class replace functionality available in JDK 8. * *

Specification for implementors

* This is a thread-safe utility class. * All returned classes are immutable and thread-safe. */ public final class Jdk8Methods { /** * Private constructor since this is a utility class. */ private Jdk8Methods() { } //----------------------------------------------------------------------- /** * Ensures that the argument is non-null. * * @param the value type * @param value the value to check * @return the checked non-null value * @throws NullPointerException if the value is null */ public static T requireNonNull(T value) { if (value == null) { throw new NullPointerException("Value must not be null"); } return value; } /** * Ensures that the argument is non-null. * * @param the value type * @param value the value to check * @param parameterName the name of the parameter * @return the checked non-null value * @throws NullPointerException if the value is null */ public static T requireNonNull(T value, String parameterName) { if (value == null) { throw new NullPointerException(parameterName + " must not be null"); } return value; } //----------------------------------------------------------------------- /** * Compares two objects. * * @param a the first value * @param b the second value * @return the result */ public static boolean equals(Object a, Object b) { if (a == null) { return b == null; } if (b == null) { return false; } return a.equals(b); } /** * Compares two ints. * * @param a the first value * @param b the second value * @return the result */ public static int compareInts(int a, int b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; } /** * Compares two longs. * * @param a the first value * @param b the second value * @return the result */ public static int compareLongs(long a, long b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; } //----------------------------------------------------------------------- /** * Safely adds two int values. * * @param a the first value * @param b the second value * @return the result * @throws ArithmeticException if the result overflows an int */ public static int safeAdd(int a, int b) { int sum = a + b; // check for a change of sign in the result when the inputs have the same sign if ((a ^ sum) < 0 && (a ^ b) >= 0) { throw new ArithmeticException("Addition overflows an int: " + a + " + " + b); } return sum; } /** * Safely adds two long values. * * @param a the first value * @param b the second value * @return the result * @throws ArithmeticException if the result overflows a long */ public static long safeAdd(long a, long b) { long sum = a + b; // check for a change of sign in the result when the inputs have the same sign if ((a ^ sum) < 0 && (a ^ b) >= 0) { throw new ArithmeticException("Addition overflows a long: " + a + " + " + b); } return sum; } //----------------------------------------------------------------------- /** * Safely subtracts one int from another. * * @param a the first value * @param b the second value to subtract from the first * @return the result * @throws ArithmeticException if the result overflows an int */ public static int safeSubtract(int a, int b) { int result = a - b; // check for a change of sign in the result when the inputs have the different signs if ((a ^ result) < 0 && (a ^ b) < 0) { throw new ArithmeticException("Subtraction overflows an int: " + a + " - " + b); } return result; } /** * Safely subtracts one long from another. * * @param a the first value * @param b the second value to subtract from the first * @return the result * @throws ArithmeticException if the result overflows a long */ public static long safeSubtract(long a, long b) { long result = a - b; // check for a change of sign in the result when the inputs have the different signs if ((a ^ result) < 0 && (a ^ b) < 0) { throw new ArithmeticException("Subtraction overflows a long: " + a + " - " + b); } return result; } //----------------------------------------------------------------------- /** * Safely multiply one int by another. * * @param a the first value * @param b the second value * @return the result * @throws ArithmeticException if the result overflows an int */ public static int safeMultiply(int a, int b) { long total = (long) a * (long) b; if (total < Integer.MIN_VALUE || total > Integer.MAX_VALUE) { throw new ArithmeticException("Multiplication overflows an int: " + a + " * " + b); } return (int) total; } /** * Safely multiply a long by an int. * * @param a the first value * @param b the second value * @return the new total * @throws ArithmeticException if the result overflows a long */ public static long safeMultiply(long a, int b) { switch (b) { case -1: if (a == Long.MIN_VALUE) { throw new ArithmeticException("Multiplication overflows a long: " + a + " * " + b); } return -a; case 0: return 0L; case 1: return a; } long total = a * b; if (total / b != a) { throw new ArithmeticException("Multiplication overflows a long: " + a + " * " + b); } return total; } /** * Multiply two values throwing an exception if overflow occurs. * * @param a the first value * @param b the second value * @return the new total * @throws ArithmeticException if the result overflows a long */ public static long safeMultiply(long a, long b) { if (b == 1) { return a; } if (a == 1) { return b; } if (a == 0 || b == 0) { return 0; } long total = a * b; if (total / b != a || (a == Long.MIN_VALUE && b == -1) || (b == Long.MIN_VALUE && a == -1)) { throw new ArithmeticException("Multiplication overflows a long: " + a + " * " + b); } return total; } //----------------------------------------------------------------------- /** * Safely convert a long to an int. * * @param value the value to convert * @return the int value * @throws ArithmeticException if the result overflows an int */ public static int safeToInt(long value) { if (value > Integer.MAX_VALUE || value < Integer.MIN_VALUE) { throw new ArithmeticException("Calculation overflows an int: " + value); } return (int) value; } //----------------------------------------------------------------------- /** * Returns the floor division. *

* This returns {@code 0} for {@code floorDiv(0, 4)}.
* This returns {@code -1} for {@code floorDiv(-1, 4)}.
* This returns {@code -1} for {@code floorDiv(-2, 4)}.
* This returns {@code -1} for {@code floorDiv(-3, 4)}.
* This returns {@code -1} for {@code floorDiv(-4, 4)}.
* This returns {@code -2} for {@code floorDiv(-5, 4)}.
* * @param a the dividend * @param b the divisor * @return the floor division */ public static long floorDiv(long a, long b) { return (a >= 0 ? a / b : ((a + 1) / b) - 1); } /** * Returns the floor modulus. *

* This returns {@code 0} for {@code floorMod(0, 4)}.
* This returns {@code 1} for {@code floorMod(-1, 4)}.
* This returns {@code 2} for {@code floorMod(-2, 4)}.
* This returns {@code 3} for {@code floorMod(-3, 4)}.
* This returns {@code 0} for {@code floorMod(-4, 4)}.
* * @param a the dividend * @param b the divisor * @return the floor modulus (positive) */ public static long floorMod(long a, long b) { return ((a % b) + b) % b; } /** * Returns the floor modulus. *

* This returns {@code 0} for {@code floorMod(0, 4)}.
* This returns {@code 3} for {@code floorMod(-1, 4)}.
* This returns {@code 2} for {@code floorMod(-2, 4)}.
* This returns {@code 1} for {@code floorMod(-3, 4)}.
* This returns {@code 0} for {@code floorMod(-4, 4)}.
* This returns {@code 3} for {@code floorMod(-5, 4)}.
* * @param a the dividend * @param b the divisor * @return the floor modulus (positive) */ public static int floorMod(long a, int b) { return (int) (((a % b) + b) % b); } /** * Returns the floor division. *

* This returns {@code 1} for {@code floorDiv(3, 3)}.
* This returns {@code 0} for {@code floorDiv(2, 3)}.
* This returns {@code 0} for {@code floorDiv(1, 3)}.
* This returns {@code 0} for {@code floorDiv(0, 3)}.
* This returns {@code -1} for {@code floorDiv(-1, 3)}.
* This returns {@code -1} for {@code floorDiv(-2, 3)}.
* This returns {@code -1} for {@code floorDiv(-3, 3)}.
* This returns {@code -2} for {@code floorDiv(-4, 3)}.
* * @param a the dividend * @param b the divisor * @return the floor division */ public static int floorDiv(int a, int b) { return (a >= 0 ? a / b : ((a + 1) / b) - 1); } /** * Returns the floor modulus. *

* This returns {@code 0} for {@code floorMod(3, 3)}.
* This returns {@code 2} for {@code floorMod(2, 3)}.
* This returns {@code 1} for {@code floorMod(1, 3)}.
* This returns {@code 0} for {@code floorMod(0, 3)}.
* This returns {@code 2} for {@code floorMod(-1, 3)}.
* This returns {@code 1} for {@code floorMod(-2, 3)}.
* This returns {@code 0} for {@code floorMod(-3, 3)}.
* This returns {@code 2} for {@code floorMod(-4, 3)}.
* * @param a the dividend * @param b the divisor * @return the floor modulus (positive) */ public static int floorMod(int a, int b) { return ((a % b) + b) % b; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy