package edu.rice.hj.example.applications.crypt; import java.util.concurrent.atomic.AtomicReference; /** *

AtomicDouble class.

* * @author Shams Imam (shams@rice.edu) */ public class AtomicDouble extends Number { private AtomicReference value; /** *

Constructor for AtomicDouble.

*/ public AtomicDouble() { this(0.0); } /** *

Constructor for AtomicDouble.

* * @param initVal a double. */ public AtomicDouble(double initVal) { value = new AtomicReference(new Double(initVal)); } /** *

get.

* * @return a double. */ public double get() { return value.get().doubleValue(); } /** *

set.

* * @param newVal a double. */ public void set(double newVal) { value.set(new Double(newVal)); } /** *

compareAndSet.

* * @param expect a double. * @param update a double. * @return a boolean. */ public boolean compareAndSet(double expect, double update) { Double origVal, newVal; newVal = new Double(update); while (true) { origVal = value.get(); if (Double.compare(origVal.doubleValue(), expect) == 0) { if (value.compareAndSet(origVal, newVal)) { return true; } } else { return false; } } } /** *

weakCompareAndSet.

* * @param expect a double. * @param update a double. * @return a boolean. */ public boolean weakCompareAndSet(double expect, double update) { return compareAndSet(expect, update); } /** *

getAndSet.

* * @param setVal a double. * @return a double. */ public double getAndSet(double setVal) { Double origVal, newVal; newVal = new Double(setVal); while (true) { origVal = value.get(); if (value.compareAndSet(origVal, newVal)) { return origVal.doubleValue(); } } } /** *

getAndAdd.

* * @param delta a double. * @return a double. */ public double getAndAdd(double delta) { Double origVal, newVal; while (true) { origVal = value.get(); newVal = new Double(origVal.doubleValue() + delta); if (value.compareAndSet(origVal, newVal)) { return origVal.doubleValue(); } } } /** *

addAndGet.

* * @param delta a double. * @return a double. */ public double addAndGet(double delta) { Double origVal, newVal; while (true) { origVal = value.get(); newVal = new Double(origVal.doubleValue() + delta); if (value.compareAndSet(origVal, newVal)) { return newVal.doubleValue(); } } } /** *

getAndIncrement.

* * @return a double. */ public double getAndIncrement() { return getAndAdd((double) 1.0); } /** *

getAndDecrement.

* * @return a double. */ public double getAndDecrement() { return getAndAdd((double) -1.0); } /** *

incrementAndGet.

* * @return a double. */ public double incrementAndGet() { return addAndGet((double) 1.0); } /** *

decrementAndGet.

* * @return a double. */ public double decrementAndGet() { return addAndGet((double) -1.0); } /** *

getAndMultiply.

* * @param multiple a double. * @return a double. */ public double getAndMultiply(double multiple) { Double origVal, newVal; while (true) { origVal = value.get(); newVal = new Double(origVal.doubleValue() * multiple); if (value.compareAndSet(origVal, newVal)) { return origVal.doubleValue(); } } } /** *

multiplyAndGet.

* * @param multiple a double. * @return a double. */ public double multiplyAndGet(double multiple) { Double origVal, newVal; while (true) { origVal = value.get(); newVal = new Double(origVal.doubleValue() * multiple); if (value.compareAndSet(origVal, newVal)) { return newVal.doubleValue(); } } } /** *

intValue.

* * @return a int. */ public int intValue() { return DoubleValue().intValue(); } /** *

longValue.

* * @return a long. */ public long longValue() { return DoubleValue().longValue(); } /** *

floatValue.

* * @return a float. */ public float floatValue() { return DoubleValue().floatValue(); } /** *

doubleValue.

* * @return a double. */ public double doubleValue() { return DoubleValue().doubleValue(); } /** *

byteValue.

* * @return a byte. */ public byte byteValue() { return (byte) intValue(); } /** *

shortValue.

* * @return a short. */ public short shortValue() { return (short) intValue(); } /** *

DoubleValue.

* * @return a {@link Double} object. */ public Double DoubleValue() { return value.get(); } /** *

isNaN.

* * @return a boolean. */ public boolean isNaN() { return DoubleValue().isNaN(); } /** *

isInfinite.

* * @return a boolean. */ public boolean isInfinite() { return DoubleValue().isInfinite(); } /** *

toString.

* * @return a {@link String} object. */ public String toString() { return DoubleValue().toString(); } /** *

hashCode.

* * @return a int. */ public int hashCode() { return DoubleValue().hashCode(); } /** * {@inheritDoc} */ public boolean equals(Object obj) { Double origVal = DoubleValue(); return ((obj instanceof Double) && (origVal.equals((Double) obj))) || ((obj instanceof AtomicDouble) && (origVal.equals(((AtomicDouble) obj).DoubleValue()))); } /** *

compareTo.

* * @param aValue a {@link Double} object. * @return a int. */ public int compareTo(Double aValue) { return Double.compare(doubleValue(), aValue.doubleValue()); } /** *

compareTo.

* * @param aValue a {@link edu.rice.hj.example.applications.crypt.AtomicDouble} object. * @return a int. */ public int compareTo(AtomicDouble aValue) { return Double.compare(doubleValue(), aValue.doubleValue()); } }