package net.semanticmetadata.lire.classifiers;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
public class AtomicDouble extends Number {
private static final long serialVersionUID = 0L;
private transient volatile long value;
private static final AtomicLongFieldUpdater<AtomicDouble> updater = AtomicLongFieldUpdater.newUpdater(AtomicDouble.class, "value");
public AtomicDouble(double initialValue) {
this.value = Double.doubleToRawLongBits(initialValue);
}
public AtomicDouble() {
}
public final double get() {
return Double.longBitsToDouble(this.value);
}
public final void set(double newValue) {
long next = Double.doubleToRawLongBits(newValue);
this.value = next;
}
public final void lazySet(double newValue) {
this.set(newValue);
}
public final double getAndSet(double newValue) {
long next = Double.doubleToRawLongBits(newValue);
return Double.longBitsToDouble(updater.getAndSet(this, next));
}
public final boolean compareAndSet(double expect, double update) {
return updater.compareAndSet(this, Double.doubleToRawLongBits(expect), Double.doubleToRawLongBits(update));
}
public final boolean weakCompareAndSet(double expect, double update) {
return updater.weakCompareAndSet(this, Double.doubleToRawLongBits(expect), Double.doubleToRawLongBits(update));
}
public final double getAndAdd(double delta) {
long current;
double currentVal;
long next;
do {
current = this.value;
currentVal = Double.longBitsToDouble(current);
double nextVal = currentVal + delta;
next = Double.doubleToRawLongBits(nextVal);
} while(!updater.compareAndSet(this, current, next));
return currentVal;
}
public final double addAndGet(double delta) {
long current;
double nextVal;
long next;
do {
current = this.value;
double currentVal = Double.longBitsToDouble(current);
nextVal = currentVal + delta;
next = Double.doubleToRawLongBits(nextVal);
} while(!updater.compareAndSet(this, current, next));
return nextVal;
}
public final double divideAndGet(double divisor){
long current;
double nextVal;
long next;
do {
current = this.value;
double currentVal = Double.longBitsToDouble(current);
nextVal = currentVal / divisor;
next = Double.doubleToRawLongBits(nextVal);
} while(!updater.compareAndSet(this, current, next));
return nextVal;
}
public String toString() {
return Double.toString(this.get());
}
public int intValue() {
return (int)this.get();
}
public long longValue() {
return (long)this.get();
}
public float floatValue() {
return (float)this.get();
}
public double doubleValue() {
return this.get();
}
}