diff --git a/benchmark/src/main/java/org/capnproto/benchmark/Common.java b/benchmark/src/main/java/org/capnproto/benchmark/Common.java index 8bcdd89..f9f6ce1 100644 --- a/benchmark/src/main/java/org/capnproto/benchmark/Common.java +++ b/benchmark/src/main/java/org/capnproto/benchmark/Common.java @@ -26,4 +26,20 @@ public class Common { } } + public static int div(int a, int b){ + if (b == 0) return 0x7fffffff; + if (a == 0x80000000 && b == -1) { + return 0x7fffffff; + } + return a / b; + } + + public static int modulus(int a, int b) { + if (b == 0) return 0x7fffffff; + if (a == 0x80000000 && b == -1) { + return 0x7fffffff; + } + return a % b; + } + } diff --git a/benchmark/src/main/java/org/capnproto/benchmark/Eval.java b/benchmark/src/main/java/org/capnproto/benchmark/Eval.java new file mode 100644 index 0000000..7112e31 --- /dev/null +++ b/benchmark/src/main/java/org/capnproto/benchmark/Eval.java @@ -0,0 +1,70 @@ +package org.capnproto.benchmark; + +import org.capnproto.MessageBuilder; +import org.capnproto.StructList; +import org.capnproto.Text; +import org.capnproto.benchmark.EvalSchema.*; + +public class Eval { + public static int makeExpression(Common.FastRand rng, Expression.Builder exp, int depth) { + exp.setOp(Operation.values()[rng.nextLessThan(Operation.values().length)]); + + int left = 0; + if (rng.nextLessThan(8) < depth) { + int tmp = rng.nextLessThan(128) + 1; + exp.getLeft().setValue(tmp); + left = tmp; + } else { + left = makeExpression(rng, exp.getLeft().initExpression(), depth + 1); + } + + int right = 0; + if (rng.nextLessThan(8) < depth) { + int tmp = rng.nextLessThan(128) + 1; + exp.getRight().setValue(tmp); + right = tmp; + } else { + right = makeExpression(rng, exp.getRight().initExpression(), depth + 1); + } + + switch (exp.getOp()) { + case ADD: return left + right; + case SUBTRACT: return left - right; + case MULTIPLY: return left * right; + case DIVIDE: return Common.div(left, right); + case MODULUS: return Common.modulus(left, right); + default: + throw new Error("impossible"); + } + } + + public static int evaluateExpression(Expression.Reader exp) { + int left = 0, right = 0; + + switch (exp.getLeft().which()) { + case VALUE: + left = exp.getLeft().getValue(); + break; + case EXPRESSION: + left = evaluateExpression(exp.getLeft().getExpression()); + } + + switch (exp.getRight().which()) { + case VALUE: + right = exp.getRight().getValue(); + break; + case EXPRESSION: + right = evaluateExpression(exp.getRight().getExpression()); + } + + switch (exp.getOp()) { + case ADD: return left + right; + case SUBTRACT: return left - right; + case MULTIPLY: return left * right; + case DIVIDE: return Common.div(left, right); + case MODULUS: return Common.modulus(left, right); + default: + throw new Error("impossible"); + } + } +} diff --git a/benchmark/src/main/schema/catrank.capnp b/benchmark/src/main/schema/catrank.capnp index 08ecc22..f30e6c3 100644 --- a/benchmark/src/main/schema/catrank.capnp +++ b/benchmark/src/main/schema/catrank.capnp @@ -28,7 +28,7 @@ $Cxx.namespace("capnp::benchmark::capnp"); using Java = import "/java_support/java.capnp"; $Java.package("org.capnproto.benchmark"); -$Java.outerClassname("Catrank"); +$Java.outerClassname("CatrankSchema"); struct SearchResultList { results@0: List(SearchResult); diff --git a/benchmark/src/main/schema/eval.capnp b/benchmark/src/main/schema/eval.capnp index 1fa8948..bebdcb4 100644 --- a/benchmark/src/main/schema/eval.capnp +++ b/benchmark/src/main/schema/eval.capnp @@ -28,7 +28,7 @@ $Cxx.namespace("capnp::benchmark::capnp"); using Java = import "/java_support/java.capnp"; $Java.package("org.capnproto.benchmark"); -$Java.outerClassname("Eval"); +$Java.outerClassname("EvalSchema"); enum Operation { add @0;