diff --git a/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumn.java b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumn.java new file mode 100644 index 00000000..820dd502 --- /dev/null +++ b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumn.java @@ -0,0 +1,89 @@ +package nu.marginalia.slop.column.primitive; + +import nu.marginalia.slop.desc.ColumnDesc; +import nu.marginalia.slop.storage.Storage; +import nu.marginalia.slop.storage.StorageReader; +import nu.marginalia.slop.storage.StorageWriter; + +import java.io.IOException; +import java.nio.file.Path; + +public class ShortColumn { + + public static ShortColumnReader open(Path path, ColumnDesc columnDesc) throws IOException { + return new Reader(columnDesc, Storage.reader(path, columnDesc, true)); + } + + public static ShortColumnWriter create(Path path, ColumnDesc columnDesc) throws IOException { + return new Writer(columnDesc, Storage.writer(path, columnDesc)); + } + + private static class Writer implements ShortColumnWriter { + private final ColumnDesc columnDesc; + private final StorageWriter storage; + private long position = 0; + + public Writer(ColumnDesc columnDesc, StorageWriter storageWriter) throws IOException { + this.columnDesc = columnDesc; + this.storage = storageWriter; + } + + @Override + public ColumnDesc columnDesc() { + return columnDesc; + } + + public void put(short value) throws IOException { + storage.putShort(value); + position++; + } + + public long position() { + return position; + } + + public void close() throws IOException { + storage.close(); + } + } + + private static class Reader implements ShortColumnReader { + private final ColumnDesc columnDesc; + private final StorageReader storage; + + public Reader(ColumnDesc columnDesc, StorageReader storage) throws IOException { + this.columnDesc = columnDesc; + this.storage = storage; + } + + public short get() throws IOException { + return storage.getShort(); + } + + @Override + public ColumnDesc columnDesc() { + return columnDesc; + } + + @Override + public long position() throws IOException { + return storage.position() / Short.BYTES; + } + + @Override + public void skip(long positions) throws IOException { + storage.skip(positions, Short.BYTES); + } + + + @Override + public boolean hasRemaining() throws IOException { + return storage.hasRemaining(); + } + + @Override + public void close() throws IOException { + storage.close(); + } + } +} diff --git a/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnReader.java b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnReader.java new file mode 100644 index 00000000..0ee240dd --- /dev/null +++ b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnReader.java @@ -0,0 +1,10 @@ +package nu.marginalia.slop.column.primitive; + +import nu.marginalia.slop.column.ColumnReader; + +import java.io.IOException; + +public interface ShortColumnReader extends ColumnReader, AutoCloseable { + short get() throws IOException; + void close() throws IOException; +} diff --git a/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnWriter.java b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnWriter.java new file mode 100644 index 00000000..8fa6b182 --- /dev/null +++ b/code/libraries/slop/java/nu/marginalia/slop/column/primitive/ShortColumnWriter.java @@ -0,0 +1,11 @@ +package nu.marginalia.slop.column.primitive; + +import nu.marginalia.slop.column.ColumnWriter; + +import java.io.IOException; + +public interface ShortColumnWriter extends ColumnWriter, AutoCloseable { + void put(short value) throws IOException; + + void close() throws IOException; +} diff --git a/code/libraries/slop/java/nu/marginalia/slop/desc/ColumnType.java b/code/libraries/slop/java/nu/marginalia/slop/desc/ColumnType.java index 08fe4f2f..5bd8b60f 100644 --- a/code/libraries/slop/java/nu/marginalia/slop/desc/ColumnType.java +++ b/code/libraries/slop/java/nu/marginalia/slop/desc/ColumnType.java @@ -33,6 +33,8 @@ public abstract class ColumnType< public static ColumnType BYTE = register("s8", ByteOrder.nativeOrder(), ByteColumn::open, ByteColumn::create); public static ColumnType CHAR_LE = register("u16le", ByteOrder.LITTLE_ENDIAN, CharColumn::open, CharColumn::create); public static ColumnType CHAR_BE = register("u16be", ByteOrder.BIG_ENDIAN, CharColumn::open, CharColumn::create); + public static ColumnType SHORT_LE = register("s16le", ByteOrder.LITTLE_ENDIAN, ShortColumn::open, ShortColumn::create); + public static ColumnType SHORT_BE = register("s16be", ByteOrder.BIG_ENDIAN, ShortColumn::open, ShortColumn::create); public static ColumnType INT_LE = register("s32le", ByteOrder.LITTLE_ENDIAN, IntColumn::open, IntColumn::create); public static ColumnType INT_BE = register("s32be", ByteOrder.BIG_ENDIAN, IntColumn::open, IntColumn::create); public static ColumnType LONG_LE = register("s64le", ByteOrder.LITTLE_ENDIAN, LongColumn::open, LongColumn::create);