23
24 package org.openjdk.bench.java.lang.foreign.pointers;
25
26 import java.lang.foreign.AddressLayout;
27 import java.lang.foreign.GroupLayout;
28 import java.lang.foreign.MemoryLayout;
29 import java.lang.foreign.ValueLayout;
30
31 public sealed abstract class NativeType<X> {
32
33 public abstract MemoryLayout layout();
34
35 public non-sealed static abstract class OfInt<X> extends NativeType<X> {
36 public abstract ValueLayout.OfInt layout();
37 }
38 public non-sealed static abstract class OfDouble<X> extends NativeType<X> {
39 public abstract ValueLayout.OfDouble layout();
40 }
41
42 private static final AddressLayout UNSAFE_ADDRESS = ValueLayout.ADDRESS
43 .withTargetLayout(MemoryLayout.sequenceLayout(ValueLayout.JAVA_BYTE));
44
45 public final static class OfPointer<X> extends NativeType<X> {
46 public AddressLayout layout() {
47 return UNSAFE_ADDRESS;
48 }
49 }
50
51 public non-sealed static abstract class OfStruct<X> extends NativeType<X> {
52 public abstract GroupLayout layout();
53 public abstract X make(Pointer<X> ptr);
54 }
55
56 public static final OfInt<Integer> C_INT = new OfInt<>() {
57 @Override
58 public ValueLayout.OfInt layout() {
59 return ValueLayout.JAVA_INT;
60 }
61 };
62
63 public static final OfDouble<Double> C_DOUBLE = new OfDouble<>() {
|
23
24 package org.openjdk.bench.java.lang.foreign.pointers;
25
26 import java.lang.foreign.AddressLayout;
27 import java.lang.foreign.GroupLayout;
28 import java.lang.foreign.MemoryLayout;
29 import java.lang.foreign.ValueLayout;
30
31 public sealed abstract class NativeType<X> {
32
33 public abstract MemoryLayout layout();
34
35 public non-sealed static abstract class OfInt<X> extends NativeType<X> {
36 public abstract ValueLayout.OfInt layout();
37 }
38 public non-sealed static abstract class OfDouble<X> extends NativeType<X> {
39 public abstract ValueLayout.OfDouble layout();
40 }
41
42 private static final AddressLayout UNSAFE_ADDRESS = ValueLayout.ADDRESS
43 .withTargetLayout(MemoryLayout.sequenceLayout(Long.MAX_VALUE, ValueLayout.JAVA_BYTE));
44
45 public final static class OfPointer<X> extends NativeType<X> {
46 public AddressLayout layout() {
47 return UNSAFE_ADDRESS;
48 }
49 }
50
51 public non-sealed static abstract class OfStruct<X> extends NativeType<X> {
52 public abstract GroupLayout layout();
53 public abstract X make(Pointer<X> ptr);
54 }
55
56 public static final OfInt<Integer> C_INT = new OfInt<>() {
57 @Override
58 public ValueLayout.OfInt layout() {
59 return ValueLayout.JAVA_INT;
60 }
61 };
62
63 public static final OfDouble<Double> C_DOUBLE = new OfDouble<>() {
|