モジュール jdk.incubator.foreign
パッケージ jdk.incubator.foreign

インタフェースMemoryLayout

すべてのスーパー・インタフェース:
Constable
既知のすべての実装クラス:
GroupLayout, SequenceLayout, ValueLayout, ValueLayout.OfAddress, ValueLayout.OfBoolean, ValueLayout.OfByte, ValueLayout.OfChar, ValueLayout.OfDouble, ValueLayout.OfFloat, ValueLayout.OfInt, ValueLayout.OfLong, ValueLayout.OfShort

public sealed interface MemoryLayout extends Constable permits SequenceLayout, GroupLayout, ValueLayout (not exhaustive)
メモリー・レイアウトを使用して、メモリー・セグメントの内容を記述できます。 レイアウト階層には、「値レイアウト」という2つのリーフがあり、特定のサイズおよび使用される種類の(ValueLayoutを参照してください)および「パディング・レイアウト」の値を表すために使用されます。名前の推奨は、内容を無視する必要があるメモリー・セグメントの一部を表し、主に位置合せ(paddingLayout(long)を参照してください)のために存在します。 一般的な値レイアウトの定数の一部は、ValueLayoutクラスで定義されます。

より複雑なレイアウトをより単純なものから導出できます: 「順序レイアウト」は1つ以上の要素レイアウト(SequenceLayoutを参照してください)の繰返しを示し、「グループ・レイアウト」は、(typically)異種メンバーのレイアウト(GroupLayoutを参照してください)の集計を示します。

たとえば、Cでの次の構造体宣言について考えてみます:

typedef struct {
    char kind;
    int value;
} TaggedValues[5];
前述の宣言は、次のようにレイアウト・オブジェクトを使用してモデル化できます:
SequenceLayout taggedValues = MemoryLayout.sequenceLayout(5,
    MemoryLayout.structLayout(
        ValueLayout.JAVA_BYTE.withName("kind"),
        MemoryLayout.paddingLayout(24),
        ValueLayout.JAVA_INT.withName("value")
    )
).withName("TaggedValues");

このインタフェースのすべての実装はvalue-basedである必要があります。プログラマは、equalのインスタンスを交換可能として扱う必要があり、同期にインスタンスを使用しないでください。そうしないと、予期しない動作が発生する可能性があります。 たとえば、将来のリリースでは、同期が失敗する可能性があります。 比較する場合は、equalsメソッドを使用することをお薦めします。

特に指定がないかぎり、null引数、またはこのクラスのメソッドに1つ以上のnull要素を含む配列引数を渡すと、NullPointerExceptionがスローされます。

サイズ、位置合せおよびバイト順序

すべてのレイアウトにはサイズが設定され、値とパディングのレイアウト・サイズは常に明示的に指定されています。これは、使用されているプラットフォームに関係なく、レイアウト摘要が常に同じサイズであることを意味します。 派生レイアウトの場合、サイズは次のように計算されます:
  • 要素レイアウトがEで、サイズがlの「有限」順序レイアウトSの場合、SのサイズはEのサイズにLを乗算した値です
  • 「制限なし」順序レイアウトのサイズは、「不明」です。
  • メンバー・レイアウトM1を含むグループ・レイアウトGの場合、サイズがS1S2、... Sn、それぞれM2、... MnGのサイズは、グループが「構造体」であるかunionであるかに応じて、それぞれS1 + S2 + ... + Snまたはmax(S1, S2, ... Sn)のどちらかになります

さらに、すべてのレイアウトは、次のように推測できる「自然整列」の機能です:

  • パディング・レイアウトLの場合、自然位置合せはサイズに関係なく1です。つまり、明示的位置合せ制約がない場合、パディング・レイアウトはネスト先のグループ・レイアウトの位置合せ制約に影響しません。
  • サイズがNの値レイアウトLの場合、Lの自然位置合せはNです。
  • 要素レイアウトがEである順序レイアウトSの場合、Sでは自然の位置合せがEです。
  • メンバー・レイアウトがM1M2、... Mnのグループ・レイアウトGの場合、位置がA1A2、... 「1つの」となります。Gの自然な位置合せはmax(A1, A2 ... An)です。
必要な(withBitAlignment(long)を参照してください)が必要な場合は、レイアウトの自然位置合せを上書きできます。これは、ハイパーリンク化されたレイアウトを記述するのに役立ちます。

すべての値レイアウトには、レイアウトの作成時に設定されるexplicitバイト順(ByteOrderを参照してください)があります。

レイアウト・パス

「レイアウト・パス」rootレイアウト(通常、グループまたは順序レイアウトです)から派生し、ルート・レイアウト内にネストされたレイアウトで終了 - これはレイアウト・パスによってレイアウトselectedされたものです。 レイアウト・パスは通常、1つ以上のMemoryLayout.PathElementインスタンスのシーケンスとして表現されます。

レイアウト・パスは、たとえば、別のレイアウト内で任意にネストされたレイアウトのoffsetsを取得したり、選択したレイアウトに対応する「メモリー・アクセス・ハンドル」をすばやく取得したり、別のレイアウト内で任意にネストされたレイアウトを「選択」したり、別のレイアウト内でネストされたレイアウト要素をtransformするために役立ちます。

このような「レイアウト・パス」は、このクラスのメソッドを使用してプログラムで作成できます。 たとえば、前述のように構築されたtaggedValuesレイアウト・インスタンスの場合、次のようにfirst順序要素でvalueというメンバー・レイアウトのオフセットをビット単位で取得できます:

long valueOffset = taggedValues.bitOffset(PathElement.sequenceElement(0),
                                          PathElement.groupElement("value")); // yields 32
同様に、valueという名前のメンバー・レイアウトを次のように選択できます:
MemoryLayout value = taggedValues.select(PathElement.sequenceElement(),
                                         PathElement.groupElement("value"));
また、次のように、valueという名前のレイアウトを別のレイアウトに置換することもできます:
MemoryLayout taggedValuesWithHole = taggedValues.map(l -> MemoryLayout.paddingLayout(32),
                                            PathElement.sequenceElement(), PathElement.groupElement("value"));
つまり、前述の宣言は、次のように、より詳細なものと同じです:
MemoryLayout taggedValuesWithHole = MemoryLayout.sequenceLayout(5,
    MemoryLayout.structLayout(
        ValueLayout.JAVA_BYTE.withName("kind"),
        MemoryLayout.paddingLayout(32),
        MemoryLayout.paddingLayout(32)
));
レイアウト・パスには、1つ以上の「フリー・ディメンション」を含めることができます。 たとえば、未指定のシーケンス要素(つまり、パス・コンポーネントの1つがMemoryLayout.PathElement.sequenceElement()メソッドを使用して取得された場合です。)をたどるレイアウト・パスは、実行時にバインドする必要がある追加の空きディメンションを持ちます。 これは、次のコードに示すように、レイアウトからメモリー・アクセス変数ハンドルを取得するときに重要です:
VarHandle valueHandle = taggedValues.varHandle(PathElement.sequenceElement(),
                                               PathElement.groupElement("value"));
前述の例で構築されたレイアウト・パスは、フリー・ディメンション(valueという名前のwhichメンバー・レイアウトを囲みシーケンスのレイアウトから選択する必要があることを指定していないため)を特徴としているため、メモリー・アクセス変数ハンドルvalueHandle「追加」 longアクセス座標を特徴としています。

フリー・ディメンションのレイアウト・パスは、bitOffset(PathElement...)またはbyteOffsetHandle(PathElement...)メソッドを使用したオフセット計算メソッド・ハンドルの作成にも使用できます。 ここでも、フリー・ディメンションは、作成されたメソッド・ハンドルのlongパラメータに変換されます。 メソッド・ハンドルを使用すると、メソッド・ハンドルの起動時にこれらの索引を指定することで、異なる索引で順序の要素のオフセットをコンピュートできます。 次に例を示します。

MethodHandle offsetHandle = taggedValues.byteOffsetHandle(PathElement.sequenceElement(),
                                                          PathElement.groupElement("kind"));
long offset1 = (long) offsetHandle.invokeExact(1L); // 8
long offset2 = (long) offsetHandle.invokeExact(2L); // 16

レイアウト属性

レイアウトは、オプションでnameに関連付けることができます。 レイアウト名は、レイアウト・パスの作成時に参照できます。
実装要件:
このインタフェースの実装は不変、スレッド・セーフ、およびvalue-basedです。
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型
    インタフェース
    説明
    static interface 
    このクラスのインスタンスは、レイアウト・パスの形成に使用されます。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    long
    このレイアウトに関連付けられている配置制約をビット単位で返します。
    default long
    指定されたレイアウト・パスによって選択されたレイアウトのオフセットをビット単位で計算します。この場合、パスはこのレイアウトのルートとみなされます。
    default MethodHandle
    指定されたレイアウト・パスで選択されたレイアウトのオフセットをビット単位でコンピュートするために使用できるメソッド・ハンドルを作成します。この場合、パスはこのレイアウト内でルートとみなされます。
    long
    レイアウト・サイズをビット単位で返します。
    default long
    このレイアウトに関連付けられているバイト単位の配置制約を返します。
    default long
    指定されたレイアウト・パスによって選択されたレイアウトのオフセット(バイト単位)を計算します。この場合、パスはこのレイアウトのルートとみなされます。
    default MethodHandle
    指定されたレイアウト・パスで選択されたレイアウトのオフセットをバイト単位でコンピュートするために使用できるメソッド・ハンドルを作成します。このパスは、このレイアウト内ではルートとみなされます。
    long
    レイアウト・サイズをバイト単位で返します。
    このレイアウトの公称記述子を含むOptional(構成できる場合)または空のOptional(作成できない場合)を返します。
    boolean
    equals(Object that)
    指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。
    int
    このレイアウトのハッシュ・コード値を返します。
    boolean
    このレイアウトに指定したサイズがある場合、trueを返します。
    boolean
    このレイアウトがパディング・レイアウトの場合、trueを返します。
    default MemoryLayout
    このレイアウトのルートにあるパスから選択したレイアウトが、指定された操作の適用結果で置き換えられるこのレイアウトの変換済コピーが作成されます。
    このレイアウトに関連付けられたname (もしあれば)を返します。
    paddingLayout(long size)
    指定したサイズで新しいパディング・レイアウトを作成します。
    default MemoryLayout
    このレイアウトのルートとなっているパスからレイアウトを選択します。
    sequenceLayout(long elementCount, MemoryLayout elementLayout)
    指定された要素レイアウトおよび要素数を使用して、新規順序レイアウトを作成します。
    バインドなし要素カウントと指定された要素レイアウトを使用して、新しい順序レイアウトを作成します。
    default MethodHandle
    メモリー・セグメントが指定されたメソッド・ハンドルを作成し、特定のレイアウト・パスによって選択されたレイアウトに対応するsliceを返します。このレイアウトでは、パスはルートとみなされます。
    指定したメンバー・レイアウトで新しい「構造体」グループ・レイアウトを作成します。
    このレイアウトの文字列表現を返します。
    指定したメンバー・レイアウトで新しいunionグループ・レイアウトを作成します。
    valueLayout(Class<?> carrier, ByteOrder order)
    指定されたJavaキャリアおよびバイト順序の値レイアウトを作成します。
    default VarHandle
    特定のレイアウト・パスで選択されたレイアウトでメモリーを参照解除するために使用できるメモリー・アクセス変数ハンドルを作成します。この場合、パスはこのレイアウトのルートとみなされます。
    withBitAlignment(long bitAlignment)
    目的の位置合せ制約を機能する新しいレイアウトを作成します。
    必要なレイアウトnameが機能する新しいレイアウトを作成します。
  • メソッドの詳細

    • describeConstable

      Optional<? extends DynamicConstantDesc<? extends MemoryLayout>> describeConstable()
      このレイアウトの公称記述子を含むOptional(構成できる場合)または空のOptional(作成できない場合)を返します。
      定義:
      インタフェースConstable内のdescribeConstable
      戻り値:
      このレイアウトの公称記述子を含むOptional(構成可能な場合)、または空のOptional(構成できない場合)
    • hasSize

      boolean hasSize()
      このレイアウトに指定したサイズがある場合、trueを返します。 レイアウトが(次を含む)でサイズが未指定の(SequenceLayout.elementCount()を参照してください)の順序レイアウトである場合、そのレイアウトには指定されたサイズがありません。 値レイアウト(ValueLayoutを参照してください)およびパディングのレイアウト(paddingLayout(long)を参照してください) alwaysには指定されたサイズがあるため、このメソッドは常にtrueを返します。
      戻り値:
      このレイアウトが指定されたサイズの場合、true
    • bitSize

      long bitSize()
      レイアウト・サイズをビット単位で返します。
      戻り値:
      レイアウト・サイズ(ビット単位)
      例外:
      UnsupportedOperationException - レイアウトが、またはレイアウトに含まれている場合、(SequenceLayoutを参照してください)は未指定のサイズの順序レイアウトです。
    • byteSize

      long byteSize()
      レイアウト・サイズをバイト単位で返します。
      戻り値:
      レイアウト・サイズ(バイト)
      例外:
      UnsupportedOperationException - レイアウトが次のものであるか、またはレイアウトが含まれている場合、(SequenceLayoutを参照してください)のサイズが指定されていないシーケンス・レイアウトであるか、bitSize()が8の倍数でないとき。
    • name

      Optional<String> name()
      このレイアウトに関連付けられたname (もしあれば)を返します。
      戻り値:
      このレイアウトに関連付けられたname (もしあれば)
      関連項目:
    • withName

      MemoryLayout withName(String name)
      必要なレイアウトnameが機能する新しいレイアウトを作成します。
      パラメータ:
      name - レイアウト名。
      戻り値:
      このレイアウトと同じ新しいレイアウト(関連付けられているnameを除く)。
      関連項目:
    • bitAlignment

      long bitAlignment()
      このレイアウトに関連付けられている配置制約をビット単位で返します。 レイアウトの位置合せにより、レイアウトのビット単位の位置合せである2つのAの機能が定義されます。 A <= 8の場合、A/8は、このレイアウトを適切にポイントするポインタに対して整列する必要があるバイト数です。 このため、:
      • A=8では、すべての(通常の意味で)がパケットで共有されないことを意味します。
      • A=64は、aligned (on LP64)、A=32 int aligned、A=16 short alignedなどの単語を意味します。
      • A=512は、x86/SV ABI (AVX-512データ)で必要とされる最も厳密な位置合せです。
      このレイアウト(withBitAlignment(long)を参照してください)に明示的な位置合せ制約が設定されていない場合、このメソッドはこのレイアウトに関連付けられた「自然整列」制約(ビット単位)を返します。
      戻り値:
      レイアウト位置合せ制約をビット単位で指定します。
    • byteAlignment

      default long byteAlignment()
      このレイアウトに関連付けられているバイト単位の配置制約を返します。 レイアウトの位置合せでは、レイアウトのバイト単位の位置合せである2つのAの累乗を定義します。Aは、このレイアウトを適切に示すポインタに対して整列する必要があるバイト数です。 このため、:
      • A=1では、すべての(通常の意味で)がパケットで共有されないことを意味します。
      • A=8は、aligned (on LP64)、A=4 int aligned、A=2 short alignedなどの単語を意味します。
      • A=64は、x86/SV ABI (AVX-512データ)で必要とされる最も厳密な位置合せです。
      このレイアウト(withBitAlignment(long)を参照してください)に明示的な位置合せ制約が設定されていない場合、このメソッドはこのレイアウトに関連付けられた「自然整列」制約(バイト単位)を返します。
      戻り値:
      レイアウト位置合せ制約(バイト)。
      例外:
      UnsupportedOperationException - bitAlignment()が8の倍数でない場合。
    • withBitAlignment

      MemoryLayout withBitAlignment(long bitAlignment)
      目的の位置合せ制約を機能する新しいレイアウトを作成します。
      パラメータ:
      bitAlignment - レイアウト位置合せ制約。ビットで表されます。
      戻り値:
      このレイアウトと同じ新しいレイアウトですが、関連付けられている位置合わせの制約を除きます。
      例外:
      IllegalArgumentException - bitAlignmentが2の累乗でない場合、または8未満の場合。
    • bitOffset

      default long bitOffset(MemoryLayout.PathElement... elements)
      指定されたレイアウト・パスによって選択されたレイアウトのオフセットをビット単位で計算します。この場合、パスはこのレイアウトのルートとみなされます。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsのレイアウト・パスで選択されるレイアウトのオフセット(ビット単位)。
      例外:
      IllegalArgumentException - レイアウト・パスで、このレイアウト内にネストされたレイアウトが選択されない場合、または複数の順序要素インデックスを(MemoryLayout.PathElement.sequenceElement()およびMemoryLayout.PathElement.sequenceElement(long, long)を参照してください)で選択する1つ以上のパス要素がレイアウト・パスに含まれている場合。
      UnsupportedOperationException - レイアウト・パスによってトラバースされるレイアウトの1つが未指定のサイズである場合。
      NullPointerException - elements == null、またはelementsの要素のいずれかがnullの場合。
    • bitOffsetHandle

      default MethodHandle bitOffsetHandle(MemoryLayout.PathElement... elements)
      指定されたレイアウト・パスで選択されたレイアウトのオフセットをビット単位でコンピュートするために使用できるメソッド・ハンドルを作成します。この場合、パスはこのレイアウト内でルートとみなされます。

      戻されるメソッド・ハンドルには、戻り型がlongで、指定されたレイアウト・パス(MemoryLayout.PathElement.sequenceElement()を参照してください)に空きディメンションがあるのと同じ数のlongパラメータ・タイプがあり、パラメータの順序はパス要素の順序に対応します。 戻されたメソッド・ハンドルは、bitOffset(PathElement...)と同様のレイアウト・オフセットのコンピュートに使用できますが、一部の順序索引はメソッド・ハンドルの起動時にのみ指定されます。

      メソッド・ハンドルによって返される最後のオフセットは、次のように計算されます:

      
       offset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       
      where x_1x_2、 ... x_nlong引数として指定される「動的」値、c_1c_2、...です。c_mは、staticオフセット定数、s_0s_1、...です。s_nは、レイアウト・パスから導出されるstaticスタイルの定数です。

      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      欠落しているシーケンス要素インデックスで指定された場合に、指定されたレイアウト・パス要素で指定されたレイアウト要素のビット・オフセットをコンピュートするために使用できるメソッド・ハンドル。
      例外:
      IllegalArgumentException - レイアウト・パスに、複数のシーケンス要素索引(MemoryLayout.PathElement.sequenceElement(long, long)を参照してください)を選択する1つ以上のパス要素が含まれている場合。
      UnsupportedOperationException - レイアウト・パスによってトラバースされるレイアウトの1つが未指定のサイズである場合。
    • byteOffset

      default long byteOffset(MemoryLayout.PathElement... elements)
      指定されたレイアウト・パスによって選択されたレイアウトのオフセット(バイト単位)を計算します。この場合、パスはこのレイアウトのルートとみなされます。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsのレイアウト・パスによって選択されたレイアウトのオフセット(バイト単位)。
      例外:
      IllegalArgumentException - レイアウト・パスで、このレイアウト内にネストされたレイアウトが選択されない場合、または複数の順序要素インデックスを(MemoryLayout.PathElement.sequenceElement()およびMemoryLayout.PathElement.sequenceElement(long, long)を参照してください)で選択する1つ以上のパス要素がレイアウト・パスに含まれている場合。
      UnsupportedOperationException - レイアウト・パスによってトラバースされるレイアウトのいずれかのサイズが未指定の場合、またはbitOffset(elements)が8の倍数でない場合。
      NullPointerException - elements == null、またはelementsの要素のいずれかがnullの場合。
    • byteOffsetHandle

      default MethodHandle byteOffsetHandle(MemoryLayout.PathElement... elements)
      指定されたレイアウト・パスで選択されたレイアウトのオフセットをバイト単位でコンピュートするために使用できるメソッド・ハンドルを作成します。このパスは、このレイアウト内ではルートとみなされます。

      戻されるメソッド・ハンドルには、戻り型がlongで、指定されたレイアウト・パス(MemoryLayout.PathElement.sequenceElement()を参照してください)に空きディメンションがあるのと同じ数のlongパラメータ・タイプがあり、パラメータの順序はパス要素の順序に対応します。 戻されたメソッド・ハンドルは、byteOffset(PathElement...)と同様のレイアウト・オフセットのコンピュートに使用できますが、一部の順序索引はメソッド・ハンドルの起動時にのみ指定されます。

      メソッド・ハンドルによって返される最後のオフセットは、次のように計算されます:

      
       bitOffset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       offset = bitOffset / 8
       
      where x_1x_2、 ... x_nlong引数として指定される「動的」値、c_1c_2、...です。c_mは、staticオフセット定数、s_0s_1、...です。s_nは、レイアウト・パスから導出されるstaticスタイルの定数です。

      計算されたビット単位のオフセットが8の倍数でない場合、メソッド・ハンドルはUnsupportedOperationExceptionをスローします。

      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      欠落しているシーケンス要素インデックスで指定された場合に、指定されたレイアウト・パス要素で指定されたレイアウト要素のバイト・オフセットをコンピュートするために使用できるメソッド・ハンドル。
      例外:
      IllegalArgumentException - レイアウト・パスに、複数のシーケンス要素索引(MemoryLayout.PathElement.sequenceElement(long, long)を参照してください)を選択する1つ以上のパス要素が含まれている場合。
      UnsupportedOperationException - レイアウト・パスによってトラバースされるレイアウトの1つが未指定のサイズである場合。
    • varHandle

      default VarHandle varHandle(MemoryLayout.PathElement... elements)
      特定のレイアウト・パスで選択されたレイアウトでメモリーを参照解除するために使用できるメモリー・アクセス変数ハンドルを作成します。この場合、パスはこのレイアウトのルートとみなされます。

      戻されたメモリー・アクセスvarハンドルによってアクセスされる最終的なメモリー・ロケーションは、次のように計算できます:

      
       address = base + offset
       
      ここで、baseMemorySegmentアクセス座標(MemorySegment.address()およびMemoryAddress.toRawLongValue()を参照してください)およびoffsetで表されるベース・アドレスを示し、次の形式で表すことができます:
      
       offset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       
      where x_1x_2、 ... x_nlong引数として指定される「動的」値、c_1c_2、...です。c_mは、staticオフセット定数、s_0s_1、...です。s_nは、レイアウト・パスから導出されるstaticスタイルの定数です。

      APIのノート:
      結果のvarハンドルには、このレイアウト・パスに含まれる未指定の各シーケンス・アクセス・コンポーネントについて、追加のlongアクセス座標があります。 さらに、結果の変数ハンドルは、すべてのメモリー・アクセス変数ハンドルに共通している特定の「アクセス・モード制限」の機能も備えています。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsのレイアウト・パスで選択された(ネストする可能性がある)レイアウトでメモリーを参照解除するために使用できるvarハンドルです。
      例外:
      UnsupportedOperationException - レイアウト・パスに、互換性のない位置合せ制約を持つ1つ以上の要素がある場合、またはレイアウト・パスによってトラバースされるレイアウトの1つが未指定のサイズを持っている場合。
      IllegalArgumentException - elementsのレイアウト・パスで値レイアウト(ValueLayoutを参照してください)が選択されない場合。
    • sliceHandle

      default MethodHandle sliceHandle(MemoryLayout.PathElement... elements)
      メモリー・セグメントが指定されたメソッド・ハンドルを作成し、特定のレイアウト・パスによって選択されたレイアウトに対応するsliceを返します。このレイアウトでは、パスはルートとみなされます。

      戻されるメソッド・ハンドルには、MemorySegmentの戻り型があり、スライスされるセグメントを表す先行パラメータとしてMemorySegmentパラメータと、指定されたレイアウト・パス(MemoryLayout.PathElement.sequenceElement()を参照してください)に空きディメンションがあるときと同じ数の後続のlongパラメータ・タイプがあり、パラメータの順序はパス要素の順序に対応します。 返されるメソッド・ハンドルを使用して、MemorySegment.asSlice(long, long)と同様のスライスを作成できますが、offset引数は、メソッド・ハンドルの起動時に指定されたインデックスに基づいて動的にコンピュートされます。

      返されたセグメントのオフセットは次のように計算されます:

      
       bitOffset = c_1 + c_2 + ... + c_m + (x_1 * s_1) + (x_2 * s_2) + ... + (x_n * s_n)
       offset = bitOffset / 8
       
      where x_1x_2、 ... x_nlong引数として指定される「動的」値、c_1c_2、...です。c_mは、staticオフセット定数、s_0s_1、...です。s_nは、レイアウト・パスから導出されるstaticスタイルの定数です。

      オフセットの計算後、返されたセグメントは、次のようにコールして作成されます:

      segment.asSlice(offset, layout.byteSize());
      
      ここで、segmentはスライスされるセグメントで、layoutは、select(PathElement...)のように、特定のレイアウト・パスによって選択されたレイアウトです。

      計算されたビット単位のオフセットが8の倍数でない場合、メソッド・ハンドルはUnsupportedOperationExceptionをスローします。

      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      セグメントを指定して、選択したレイアウト要素のスライスを作成するために使用できるメソッド・ハンドル。
      例外:
      UnsupportedOperationException - 選択したレイアウトのサイズが8の倍数でない場合。
    • select

      default MemoryLayout select(MemoryLayout.PathElement... elements)
      このレイアウトのルートとなっているパスからレイアウトを選択します。
      パラメータ:
      elements - レイアウト・パスの要素。
      戻り値:
      elementsでレイアウト・パスによって選択されるレイアウト。
      例外:
      IllegalArgumentException - レイアウト・パスがこのレイアウトでネストされたレイアウトを選択しない場合、またはレイアウト・パスに、1つ以上の順序要素インデックスを(MemoryLayout.PathElement.sequenceElement(long)およびMemoryLayout.PathElement.sequenceElement(long, long)を参照してください)で選択する1つ以上のパス要素が含まれている場合。
    • map

      このレイアウトのルートにあるパスから選択したレイアウトが、指定された操作の適用結果で置き換えられるこのレイアウトの変換済コピーが作成されます。
      パラメータ:
      op - 選択したレイアウトに適用される単項操作。
      elements - レイアウト・パスの要素。
      戻り値:
      elementsのレイアウト・パスで選択されたレイアウトが、選択されたレイアウトにopを適用した結果で置き換えられた新しいレイアウト。
      例外:
      IllegalArgumentException - レイアウト・パスがこのレイアウトでネストされたレイアウトを選択しない場合、またはレイアウト・パスに、1つ以上の順序要素インデックスを(MemoryLayout.PathElement.sequenceElement(long)およびMemoryLayout.PathElement.sequenceElement(long, long)を参照してください)で選択する1つ以上のパス要素が含まれている場合。
    • isPadding

      boolean isPadding()
      このレイアウトがパディング・レイアウトの場合、trueを返します。
      戻り値:
      このレイアウトがパディング・レイアウトの場合、true
    • equals

      boolean equals(Object that)
      指定されたオブジェクトをこのレイアウトと比較し、等価性を維持します。 指定されたオブジェクトもレイアウトであり、このレイアウトと等しい場合にのみ、trueを返します。 2つのレイアウトが同じ種類であり、同じサイズ、名前および位置合せ制約を持つ場合は、それらが等価であるとみなされます。 また、レイアウトの種類に応じて、追加の条件を満たす必要があります:
      • 同じバイト順序の(ValueLayout.order()を参照してください)がある場合、2つの値レイアウトが等しいとみなされます。
      • 2つのシーケンス・レイアウトが同じ要素カウント(SequenceLayout.elementCount()を参照してください)を持つ場合、およびその要素レイアウト(SequenceLayout.elementLayout()を参照してください)も同じである場合は、2つのシーケンス・レイアウトが等しいとみなされます
      • 2つのグループ・レイアウトが同じ種類の(GroupLayout.isStruct()GroupLayout.isUnion()を参照してください。)である場合、およびそのメンバー・レイアウト(GroupLayout.memberLayouts()を参照してください)も同じである場合は、等価であるとみなされます。
      オーバーライド:
      equals 、クラス:  Object
      パラメータ:
      that - このレイアウトと等価性を持たせるために比較するオブジェクト。
      戻り値:
      指定されたオブジェクトがこのレイアウトに等しい場合、true
      関連項目:
    • hashCode

      int hashCode()
      このレイアウトのハッシュ・コード値を返します。
      オーバーライド:
      hashCode 、クラス:  Object
      戻り値:
      このレイアウトのハッシュ・コード値
      関連項目:
    • toString

      String toString()
      このレイアウトの文字列表現を返します。
      オーバーライド:
      toString 、クラス:  Object
      戻り値:
      このレイアウトの文字列表現
    • paddingLayout

      static MemoryLayout paddingLayout(long size)
      指定したサイズで新しいパディング・レイアウトを作成します。
      パラメータ:
      size - パディングのサイズ(ビット)。
      戻り値:
      新しいセレクタ・レイアウト。
      例外:
      IllegalArgumentException - size <= 0の場合
    • valueLayout

      static ValueLayout valueLayout(Class<?> carrier, ByteOrder order)
      指定されたJavaキャリアおよびバイト順序の値レイアウトを作成します。 結果値レイアウトのタイプは、指定されたキャリアによって決まります:
      パラメータ:
      carrier - 値レイアウト・キャリア。
      order - 値レイアウトのバイト順。
      戻り値:
      新しい値のレイアウト。
      例外:
      IllegalArgumentException - キャリア・タイプがサポートされていない場合。
    • sequenceLayout

      static SequenceLayout sequenceLayout(long elementCount, MemoryLayout elementLayout)
      指定された要素レイアウトおよび要素数を使用して、新規順序レイアウトを作成します。
      パラメータ:
      elementCount - 順序要素の数。
      elementLayout - 順序要素レイアウト。
      戻り値:
      指定された要素のレイアウトとサイズを使用した新しい順序レイアウト。
      例外:
      IllegalArgumentException - elementCount < 0の場合。
    • sequenceLayout

      static SequenceLayout sequenceLayout(MemoryLayout elementLayout)
      バインドなし要素カウントと指定された要素レイアウトを使用して、新しい順序レイアウトを作成します。
      パラメータ:
      elementLayout - 順序レイアウトの要素レイアウト。
      戻り値:
      指定された要素レイアウトを使用した新しい順序レイアウト。
    • structLayout

      static GroupLayout structLayout(MemoryLayout... elements)
      指定したメンバー・レイアウトで新しい「構造体」グループ・レイアウトを作成します。
      パラメータ:
      elements - 「構造体」グループ・レイアウトのメンバー・レイアウト。
      戻り値:
      指定したメンバー・レイアウトを含む新しい「構造体」グループ・レイアウト。
    • unionLayout

      static GroupLayout unionLayout(MemoryLayout... elements)
      指定したメンバー・レイアウトで新しいunionグループ・レイアウトを作成します。
      パラメータ:
      elements - unionレイアウトのメンバー・レイアウト。
      戻り値:
      指定したメンバー・レイアウトを含む新しいunionグループ・レイアウト。