DataLayout

パブリックインターフェースDataLayout
既知の間接サブクラス

バッファに格納されているデータを指定された型に変換します。

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()値を読み取り、それらをユーザー タイプの単一の値として返します。

最も適切な方法を使用して、指定されたバッファから変換される値を読み取るのは、このインターフェイスの実装者の責任です。たとえば、単一のlongBigIntegerに変換するレイアウトの場合、

 @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バッファーに書き込まれるシーケンスの開始位置を示します。

パラメーター
バッファ書き込むバッファ
価値変換して書き込むユーザータイプの値
索引変換された値が書き込まれるバッファ内のインデックス