package water.udf.specialized; import water.fvec.Chunk; import water.fvec.Vec; import water.udf.ColumnFactory; import water.udf.DataChunk; import water.udf.DataColumn; import water.udf.DataColumns; /** * Specialized factory for double numbers */ public class Doubles extends DataColumns.BaseFactory<Double> { public static final water.udf.specialized.Doubles Doubles = new Doubles(); public Doubles() { super(Vec.T_NUM, "Doubles"); } @Override public DataChunk<Double> apply(final Chunk c) { return new DoubleChunk(c); } @Override public DataColumn<Double> newColumn(final Vec vec) { if (vec.get_type() != Vec.T_NUM) throw new IllegalArgumentException("Expected type T_NUM, got " + vec.get_type_str()); return new Column(vec, this); } static class DoubleChunk extends DataChunk<Double> { /** * deserialization wants it */ public DoubleChunk() {} DoubleChunk(Chunk c) { super(c); } @Override public Double get(int idx) { return c.isNA(idx) ? null : c.atd(idx); } @Override public void set(int idx, Double value) { if (value == null) c.setNA(idx); else c.set(idx, value); } public void set(int idx, double value) { c.set(idx, value); } } static class Column extends DataColumn<Double> { /** * deserialization wants it */ public Column() {} Column(Vec vec, ColumnFactory<Double> factory) { super(vec, factory); } public Double get(long idx) { return vec().at(idx); } @Override public Double apply(Long idx) { return get(idx); } @Override public Double apply(long idx) { return get(idx); } @Override public void set(long idx, Double value) { if (value == null) vec().setNA(idx); else vec().set(idx, value); } public void set(long idx, double value) { vec().set(idx, value); } } }