package water.serial;
import java.nio.channels.FileChannel;
import water.*;
import water.util.Log;
/** Simple wrapper around {@link AutoBuffer}
* which uses class names instead of type ids.
*
* @see AutoBuffer
* @see TypeMap
*/
class AutoBufferWithoutTypeIds extends AutoBuffer {
public AutoBufferWithoutTypeIds() { super(); }
public AutoBufferWithoutTypeIds(byte[] b) { super(b); }
public AutoBufferWithoutTypeIds(FileChannel fc, boolean read) {
super(fc,read, (byte) 0);
}
private static String NULL = "^";
private <T extends Freezable> T newInstance(String klazz) {
try {
return (T) Class.forName(klazz).newInstance();
} catch( Exception e ) {
throw Log.errRTExcept(e);
}
}
@Override public AutoBuffer put(Iced f) {
return put((Freezable) f);
}
@Override public AutoBuffer put(Freezable f) {
if( f == null ) return putStr(NULL);
putStr(f.getClass().getName());
return f.write(this);
}
@Override public <T extends Freezable> T get(Class<T> t) {
String klazz = getStr();
if (NULL.equals(klazz)) return null;
return newInstance(klazz).read(this);
}
@Override public <T extends Iced> T get() {
String klazz = getStr();
if (NULL.equals(klazz)) return null;
return newInstance(klazz).read(this);
}
@Override public AutoBuffer putA(Iced[] fs) {
return super.putA(fs);
}
}