package water;
/**
* A typed atomic update.
*/
public abstract class TAtomic<T extends Freezable> extends Atomic<TAtomic<T>> {
public TAtomic(){}
public TAtomic(H2O.H2OCountedCompleter completer){super(completer);}
/** Atomically update an old value to a new one.
* @param old The old value, it may be null. It is a defensive copy.
* @return The new value; if null if this atomic update no longer needs to be run
*/
protected abstract T atomic(T old);
@Override protected Value atomic(Value val) {
T old = val == null || val.isNull() ? null : (T)(val.getFreezable().clone());
T nnn = atomic(old);
// Atomic operation changes the data, so it can not be performed over
// values persisted on read-only data source as we would not be able to
// write those changes back.
assert val == null || val.onICE() || !val.isPersisted();
return nnn == null ? null : new Value(_key,nnn,val==null?Value.ICE:val.backend());
}
@Override protected void onSuccess( Value old ) { onSuccess(old==null?null:(T)old.getFreezable()); }
// Upcast the old value to T
public void onSuccess( T old ) { }
}