既知の間接サブクラス Bfloat16Layout 、 BoolLayout 、 BooleanDataLayout <S extends DataBuffer <?>>、 ByteDataLayout <S extends DataBuffer <?>>、 DoubleDataLayout <S extends DataBuffer <?>>、 Float16Layout 、 FloatDataLayout <S extends DataBuffer <?>>、 IntDataLayout <S extends DataBuffer <?>>、 LongDataLayout <S extends DataBuffer <?>>、 ShortDataLayout <S extends DataBuffer <?>>、 StringLayout |
バッファに格納されているデータを指定された型に変換します。
DataLayout
インスタンスは、 DataBuffer
のデータを保存および読み取るためのカスタム形式を定義するために使用されます。これらは、バッファに格納されているデータのタイプ (バッファタイプ) とエンド ユーザーによって操作されるデータのタイプ (ユーザータイプ) の間の分離層を提供します。
変換メソッドは書き込まれるか読み取られるすべての値に対して呼び出されるため、データ レイアウトの操作はパフォーマンスに悪影響を与える可能性があるため、可能な限りプリミティブ型を直接使用することを優先する必要があります。
また、不変のデータ レイアウトを実装して、各バッファーに新しいインスタンスを再割り当てせずに複数のバッファーに再適用できるようにすることもお勧めします。例えば:
class BigIntegerBufferAllocator { public DataBuffer<BigInteger> allocate(long size) { return LAYOUT.applyTo(DataBuffers.ofLongs(size * LAYOUT.scale())); // scale is 1 by default } private static final DataLayout<LongDataBuffer, BigInteger> LAYOUT = new DataLayout<LongDataBuffer, BigInteger>() { @Override public void writeObject(LongDataBuffer buffer, BigInteger value, long index) { buffer.setLong(value.longValue(), index); } @Override public BigInteger readObject(LongDataBuffer buffer, long index) { return BigInteger.valueOf(buffer.getLong(index)); } }; }
パブリックメソッド
抽象データバッファ<T> | applyTo (S バッファ) このレイアウトを提供されたバッファーに適用します。 |
抽象的なT | readObject (S バッファ、ロングインデックス) 指定されたインデックスにあるバッファから n = scale() 値を読み取り、それらをユーザー タイプの単一の値として返します。 |
抽象整数 | スケール() 単一のユーザー値を表すために必要なバッファ値の数を示します。デフォルトは 1 です。 |
抽象的な空白 | writeObject (S バッファ、T 値、ロング インデックス) ユーザー値をバッファ型に変換した後、指定されたインデックスでバッファに書き込みます。 |
パブリックメソッド
public abstract DataBuffer <T> applyTo (S バッファ)
このレイアウトを提供されたバッファーに適用します。
返されたDataBuffer
インスタンスは、元のバッファーへの単なるラッパーであり、独自の補助ストレージを持ちません。
パラメータ
バッファ | このレイアウトを適用するターゲットバッファ |
---|
返品
- このレイアウトのバッファ
public abstract T readObject (S バッファ、ロングインデックス)
指定されたインデックスにあるバッファからn = scale()
値を読み取り、それらをユーザー タイプの単一の値として返します。
最も適切な方法を使用して、指定されたバッファから変換される値を読み取るのは、このインターフェイスの実装者の責任です。たとえば、単一のlong
をBigInteger
に変換するレイアウトの場合、
@Override public BigInteger readObject(LongDataBuffer buffer, long index) { return BigInteger.valueOf(buffer.getLong(index)); }単一のユーザー値が複数のバッファー値にまたがる場合、
index
バッファーから読み取られるシーケンスの開始位置を示します。 パラメータ
バッファ | 読み取るバッファ |
---|---|
索引 | バッファ内で読み取るバッファの位置 |
返品
- 換算された値
パブリック抽象 intスケール()
単一のユーザー値を表すために必要なバッファ値の数を示します。デフォルトは 1 です。
スケールは正の整数である必要があります。つまり、バッファ内の単一のバッファ値を使用して複数のユーザー値を表すことはできません。
public abstract void writeObject (S バッファ、T 値、ロングインデックス)
ユーザー値をバッファ型に変換した後、指定されたインデックスでバッファに書き込みます。
この呼び出しが戻る前に、最も適切なメソッドを使用して、変換された値を指定されたバッファに書き込むのは、このインターフェイスの実装者の責任です。たとえば、 BigInteger
単一のlong
に変換するレイアウトの場合、
@Override public void writeObject(LongDataBuffer buffer, BigInteger value, long index) { buffer.setLong(value.longValue(), index); }単一のユーザー値が複数のバッファー値にまたがる場合、
index
バッファーに書き込まれるシーケンスの開始位置を示します。 パラメータ
バッファ | 書き込むバッファ |
---|---|
価値 | 変換して書き込むユーザータイプの値 |
索引 | 変換された値が書き込まれるバッファ内のインデックス |