/* * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.lang.foreign; import java.lang.invoke.VarHandle; import java.nio.ByteOrder; import jdk.internal.foreign.layout.ValueLayouts; /** * A layout that models values of basic data types. Examples of values modeled by * a value layout are integral values (either signed or unsigned), * floating-point values and address values. *

* Each value layout has a size, an alignment (both expressed in bytes), * a {@linkplain ByteOrder byte order}, and a carrier, that is, the Java type * that should be used when {@linkplain MemorySegment#get(OfInt, long) accessing} a * region of memory using the value layout. *

* This class defines useful value layout constants for Java primitive types and * addresses. * * @apiNote Some characteristics of the Java layout constants are platform-dependent. * For instance, the byte order of these constants is set to the * {@linkplain ByteOrder#nativeOrder() native byte order}, thus making it easy * to work with other APIs, such as arrays and {@link java.nio.ByteBuffer}. * * @implSpec implementing classes and subclasses are immutable, thread-safe and * value-based. * * @sealedGraph * @since 22 */ public sealed interface ValueLayout extends MemoryLayout permits ValueLayout.OfBoolean, ValueLayout.OfByte, ValueLayout.OfChar, ValueLayout.OfShort, ValueLayout.OfInt, ValueLayout.OfFloat, ValueLayout.OfLong, ValueLayout.OfDouble, AddressLayout { /** * {@return the value's byte order} */ ByteOrder order(); /** * {@return a value layout with the same characteristics as this layout, but with the given byte order} * * @param order the desired byte order */ ValueLayout withOrder(ByteOrder order); /** * {@inheritDoc} */ @Override ValueLayout withoutName(); /** * {@return the carrier associated with this value layout} */ Class carrier(); /** * {@inheritDoc} */ @Override ValueLayout withName(String name); /** * {@inheritDoc} * * @throws IllegalArgumentException {@inheritDoc} */ @Override ValueLayout withByteAlignment(long byteAlignment); /** * {@return a var handle which can be used to access values described by this value * layout, in a given memory segment} *

* The returned var handle's {@linkplain VarHandle#varType() var type} is the * {@linkplain ValueLayout#carrier() carrier type} of this value layout, and the * list of coordinate types is {@code (MemorySegment, long)}, where the * memory segment coordinate corresponds to the memory segment to be accessed, and * the {@code long} coordinate corresponds to the byte offset into the accessed * memory segment at which the access occurs. *

* The returned var handle checks that accesses are aligned according to * this value layout's {@linkplain MemoryLayout#byteAlignment() alignment constraint}. * * @apiNote This method is similar, but more efficient than calling * {@code MemoryLayout#varHandle(PathElement...)} with an empty path * element array, as it avoids the creation of the var args array. * * @apiNote The returned var handle features certain * access mode restrictions * common to all memory access var handles derived from memory layouts. * * @see MemoryLayout#varHandle(PathElement...) */ VarHandle varHandle(); /** * A value layout whose carrier is {@code boolean.class}. * * @see #JAVA_BOOLEAN * @since 22 */ sealed interface OfBoolean extends ValueLayout permits ValueLayouts.OfBooleanImpl { /** * {@inheritDoc} */ @Override OfBoolean withName(String name); /** * {@inheritDoc} */ @Override OfBoolean withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfBoolean withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfBoolean withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code byte.class}. * * @see #JAVA_BYTE * @since 22 */ sealed interface OfByte extends ValueLayout permits ValueLayouts.OfByteImpl { /** * {@inheritDoc} */ @Override OfByte withName(String name); /** * {@inheritDoc} */ @Override OfByte withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfByte withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfByte withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code char.class}. * * @see #JAVA_CHAR * @see #JAVA_CHAR_UNALIGNED * @since 22 */ sealed interface OfChar extends ValueLayout permits ValueLayouts.OfCharImpl { /** * {@inheritDoc} */ @Override OfChar withName(String name); /** * {@inheritDoc} */ @Override OfChar withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfChar withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfChar withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code short.class}. * * @see #JAVA_SHORT * @see #JAVA_SHORT_UNALIGNED * @since 22 */ sealed interface OfShort extends ValueLayout permits ValueLayouts.OfShortImpl { /** * {@inheritDoc} */ @Override OfShort withName(String name); /** * {@inheritDoc} */ @Override OfShort withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfShort withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfShort withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code int.class}. * * @see #JAVA_INT * @see #JAVA_INT_UNALIGNED * @since 22 */ sealed interface OfInt extends ValueLayout permits ValueLayouts.OfIntImpl { /** * {@inheritDoc} */ @Override OfInt withName(String name); /** * {@inheritDoc} */ @Override OfInt withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfInt withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfInt withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code float.class}. * * @see #JAVA_FLOAT * @see #JAVA_FLOAT_UNALIGNED * @since 22 */ sealed interface OfFloat extends ValueLayout permits ValueLayouts.OfFloatImpl { /** * {@inheritDoc} */ @Override OfFloat withName(String name); /** * {@inheritDoc} */ @Override OfFloat withoutName(); /** * {@inheritDoc} */ @Override OfFloat withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfFloat withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code long.class}. * * @see #JAVA_LONG * @see #JAVA_LONG_UNALIGNED * @since 22 */ sealed interface OfLong extends ValueLayout permits ValueLayouts.OfLongImpl { /** * {@inheritDoc} */ @Override OfLong withName(String name); /** * {@inheritDoc} */ @Override OfLong withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfLong withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfLong withOrder(ByteOrder order); } /** * A value layout whose carrier is {@code double.class}. * * @see #JAVA_DOUBLE * @see #JAVA_DOUBLE_UNALIGNED * @since 22 */ sealed interface OfDouble extends ValueLayout permits ValueLayouts.OfDoubleImpl { /** * {@inheritDoc} */ @Override OfDouble withName(String name); /** * {@inheritDoc} */ @Override OfDouble withoutName(); /** * {@inheritDoc} * @throws IllegalArgumentException {@inheritDoc} */ @Override OfDouble withByteAlignment(long byteAlignment); /** * {@inheritDoc} */ @Override OfDouble withOrder(ByteOrder order); } /** * An address layout constant whose size is the same as that of a * machine address ({@code size_t}), byte alignment set to {@code sizeof(size_t)}, * byte order set to {@link ByteOrder#nativeOrder()}. */ AddressLayout ADDRESS = ValueLayouts.OfAddressImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code byte}, * byte alignment set to 1, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfByte JAVA_BYTE = ValueLayouts.OfByteImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code boolean}, * byte alignment set to 1, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfBoolean JAVA_BOOLEAN = ValueLayouts.OfBooleanImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code char}, * byte alignment set to 2, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfChar JAVA_CHAR = ValueLayouts.OfCharImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code short}, * byte alignment set to 2, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfShort JAVA_SHORT = ValueLayouts.OfShortImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code int}, * byte alignment set to 4, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfInt JAVA_INT = ValueLayouts.OfIntImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code long}, * byte alignment set to 8, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfLong JAVA_LONG = ValueLayouts.OfLongImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code float}, * byte alignment set to 4, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfFloat JAVA_FLOAT = ValueLayouts.OfFloatImpl.of(ByteOrder.nativeOrder()); /** * A value layout constant whose size is the same as that of a Java {@code double}, * byte alignment set to 8, and byte order set to {@link ByteOrder#nativeOrder()}. */ OfDouble JAVA_DOUBLE = ValueLayouts.OfDoubleImpl.of(ByteOrder.nativeOrder()); /** * An unaligned address layout constant whose size is the same as that of a * machine address ({@code size_t}), and byte order set to * {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * ADDRESS.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ AddressLayout ADDRESS_UNALIGNED = ADDRESS.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code char} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_CHAR.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfChar JAVA_CHAR_UNALIGNED = JAVA_CHAR.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code short} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_SHORT.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfShort JAVA_SHORT_UNALIGNED = JAVA_SHORT.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code int} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_INT.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfInt JAVA_INT_UNALIGNED = JAVA_INT.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code long} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_LONG.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfLong JAVA_LONG_UNALIGNED = JAVA_LONG.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code float} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_FLOAT.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfFloat JAVA_FLOAT_UNALIGNED = JAVA_FLOAT.withByteAlignment(1); /** * An unaligned value layout constant whose size is the same as that of a Java {@code double} * and byte order set to {@link ByteOrder#nativeOrder()}. * Equivalent to the following code: * {@snippet lang=java : * JAVA_DOUBLE.withByteAlignment(1); * } * @apiNote Care should be taken when using unaligned value layouts as they may * induce performance and portability issues. */ OfDouble JAVA_DOUBLE_UNALIGNED = JAVA_DOUBLE.withByteAlignment(1); }