From 10f8f5e7d54311c0c39e49eef05f980ef0ccb764 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Mon, 28 Sep 2020 14:21:31 +0100 Subject: [PATCH] implement import and export tables --- .../main/java/org/capnproto/ExportTable.java | 56 +++++++++++++++++++ .../main/java/org/capnproto/ImportTable.java | 40 +++++++++++++ .../src/main/java/org/capnproto/RpcState.java | 40 ++++++++++++- 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 runtime/src/main/java/org/capnproto/ExportTable.java create mode 100644 runtime/src/main/java/org/capnproto/ImportTable.java diff --git a/runtime/src/main/java/org/capnproto/ExportTable.java b/runtime/src/main/java/org/capnproto/ExportTable.java new file mode 100644 index 0000000..74ae69d --- /dev/null +++ b/runtime/src/main/java/org/capnproto/ExportTable.java @@ -0,0 +1,56 @@ +package org.capnproto; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.function.Consumer; + +abstract class ExportTable implements Iterable { + + final HashMap slots = new HashMap<>(); + final Queue freeIds = new PriorityQueue<>(); + int max = 0; + + protected abstract T newExportable(); + + public T find(int id) { + return slots.get(id); + } + + public T erase(int id, T entry) { + var value = slots.get(id); + if (value == entry) { + freeIds.add(id); + return slots.remove(id); + } else { + return null; + } + } + + public T next() { + if (freeIds.isEmpty()) { + var id = max; + max++; + var value = newExportable(); + slots.put(id, value); + return value; + } else { + var id = freeIds.remove(); + var value = newExportable(); + slots.put(id, value); + return value; + } + } + + @Override + public Iterator iterator() { + return slots.values().iterator(); + } + + @Override + public void forEach(Consumer action) { + slots.values().forEach(action); + } +} + diff --git a/runtime/src/main/java/org/capnproto/ImportTable.java b/runtime/src/main/java/org/capnproto/ImportTable.java new file mode 100644 index 0000000..b15d2ea --- /dev/null +++ b/runtime/src/main/java/org/capnproto/ImportTable.java @@ -0,0 +1,40 @@ +package org.capnproto; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.function.Consumer; + +abstract class ImportTable implements Iterable { + + private final HashMap slots = new HashMap<>(); + + protected abstract T newImportable(); + + public T put(int id) { + return slots.computeIfAbsent(id, key -> newImportable()); + } + + public T find(int id) { + return slots.get(id); + } + + public T erase(int id, T entry) { + var removed = slots.remove(id, entry); + assert removed; + return entry; + } + + public T erase(int id) { + return slots.remove(id); + } + + @Override + public Iterator iterator() { + return slots.values().iterator(); + } + + @Override + public void forEach(Consumer action) { + slots.values().forEach(action); + } +} diff --git a/runtime/src/main/java/org/capnproto/RpcState.java b/runtime/src/main/java/org/capnproto/RpcState.java index a2e4581..bc47a24 100644 --- a/runtime/src/main/java/org/capnproto/RpcState.java +++ b/runtime/src/main/java/org/capnproto/RpcState.java @@ -1,7 +1,8 @@ package org.capnproto; -import java.util.List; +import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; final class RpcState { @@ -46,6 +47,43 @@ final class RpcState { CompletableFuture fulfiller; } + private final ExportTable exports = new ExportTable() { + @Override + protected Export newExportable() { + return new Export(); + } + }; + + private final ExportTable questions = new ExportTable() { + @Override + protected Question newExportable() { + return new Question(); + } + }; + + private final ImportTable answers = new ImportTable() { + @Override + protected Answer newImportable() { + return new Answer(); + } + }; + + private final ImportTable imports = new ImportTable() { + @Override + protected Import newImportable() { + return new Import(); + } + }; + + private final ExportTable embargos = new ExportTable() { + @Override + protected Embargo newExportable() { + return new Embargo(); + } + }; + + private final HashMap exportsByCap = new HashMap<>(); + interface RpcResponse extends ResponseHook { AnyPointer.Reader getResults(); }