From 939896862cf34cafa81b96a6f07edad0a04c1e2b Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 7 Mar 2026 18:37:16 +0000 Subject: [PATCH] added Intrinsecs as DenseTable --- .../source/identifiers/IntrinsicId.java | 17 +++++++++++ .../source/tables/IntrinsicReference.java | 18 +++++++++++ .../source/tables/IntrinsicTable.java | 16 ++++++++++ .../source/tables/IntrinsicTableReader.java | 6 ++++ .../source/tables/IntrinsicTableTest.java | 30 +++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/identifiers/IntrinsicId.java create mode 100644 prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicReference.java create mode 100644 prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTable.java create mode 100644 prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTableReader.java create mode 100644 prometeu-compiler/prometeu-compiler-core/src/test/java/p/studio/compiler/source/tables/IntrinsicTableTest.java diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/identifiers/IntrinsicId.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/identifiers/IntrinsicId.java new file mode 100644 index 00000000..43ff536d --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/identifiers/IntrinsicId.java @@ -0,0 +1,17 @@ +package p.studio.compiler.source.identifiers; + +public class IntrinsicId extends SourceIdentifier { + public static final IntrinsicId NONE = new IntrinsicId(-1); + + public IntrinsicId(final int id) { + super(id); + } + + public static IntrinsicId none() { + return NONE; + } + + public boolean isNone() { + return this == NONE; + } +} diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicReference.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicReference.java new file mode 100644 index 00000000..dc75ea90 --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicReference.java @@ -0,0 +1,18 @@ +package p.studio.compiler.source.tables; + +import java.util.Objects; + +public record IntrinsicReference( + String canonicalName, + long canonicalVersion) { + + public IntrinsicReference { + canonicalName = Objects.requireNonNull(canonicalName, "canonicalName"); + if (canonicalName.isBlank()) { + throw new IllegalArgumentException("canonicalName must not be blank"); + } + if (canonicalVersion < 0) { + throw new IllegalArgumentException("canonicalVersion must be non-negative"); + } + } +} diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTable.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTable.java new file mode 100644 index 00000000..48156e73 --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTable.java @@ -0,0 +1,16 @@ +package p.studio.compiler.source.tables; + +import p.studio.compiler.source.identifiers.IntrinsicId; + +public class IntrinsicTable extends InternTable implements IntrinsicTableReader { + + public IntrinsicTable() { + super(IntrinsicId::new); + } + + public IntrinsicId register( + final String canonicalName, + final long canonicalVersion) { + return register(new IntrinsicReference(canonicalName, canonicalVersion)); + } +} diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTableReader.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTableReader.java new file mode 100644 index 00000000..101e6909 --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/IntrinsicTableReader.java @@ -0,0 +1,6 @@ +package p.studio.compiler.source.tables; + +import p.studio.compiler.source.identifiers.IntrinsicId; + +public interface IntrinsicTableReader extends InternTableReader { +} diff --git a/prometeu-compiler/prometeu-compiler-core/src/test/java/p/studio/compiler/source/tables/IntrinsicTableTest.java b/prometeu-compiler/prometeu-compiler-core/src/test/java/p/studio/compiler/source/tables/IntrinsicTableTest.java new file mode 100644 index 00000000..8d5804b2 --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/test/java/p/studio/compiler/source/tables/IntrinsicTableTest.java @@ -0,0 +1,30 @@ +package p.studio.compiler.source.tables; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class IntrinsicTableTest { + + @Test + void shouldInternEqualIntrinsicReferencesToSameIdentifier() { + final var table = new IntrinsicTable(); + + final var first = table.register("core.color.pack", 1); + final var second = table.register("core.color.pack", 1); + final var third = table.register("core.input.poll", 1); + + assertEquals(first, second); + assertEquals(2, table.size()); + assertTrue(table.containsKey(new IntrinsicReference("core.color.pack", 1))); + assertEquals("core.input.poll", table.get(third).canonicalName()); + } + + @Test + void shouldRejectInvalidIntrinsicReferenceContract() { + assertThrows(IllegalArgumentException.class, () -> new IntrinsicReference("", 1)); + assertThrows(IllegalArgumentException.class, () -> new IntrinsicReference("core.color.pack", -1)); + } +}