package water; import water.H2O.H2OCountedCompleter; /** * A typed atomic update. */ public abstract class TAtomic<T extends Iced> extends Atomic<TAtomic<T>> { /** 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 */ public abstract T atomic(T old); public TAtomic(){} public TAtomic(H2OCountedCompleter completer){super(completer);} @Override public Value atomic(Value val) { T old = val == null ? null : (T)(val.get().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:(byte)(val._persist&Value.BACKEND_MASK)); } @Override public void onSuccess( Value old ) { onSuccess(old==null?null:(T)old.get()); } // Upcast the old value to T public void onSuccess( T old ) { } }