diff --git a/core/src/main/java/io/parsingdata/metal/Shorthand.java b/core/src/main/java/io/parsingdata/metal/Shorthand.java index 2e739c94..0375a05e 100644 --- a/core/src/main/java/io/parsingdata/metal/Shorthand.java +++ b/core/src/main/java/io/parsingdata/metal/Shorthand.java @@ -45,6 +45,7 @@ import io.parsingdata.metal.expression.value.Cat; import io.parsingdata.metal.expression.value.Const; import io.parsingdata.metal.expression.value.ConstantFactory; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.Elvis; import io.parsingdata.metal.expression.value.Expand; import io.parsingdata.metal.expression.value.FoldCat; @@ -176,7 +177,7 @@ private Shorthand() {} public static ValueExpression con(final String value) { return con(value, DEFAULT_ENCODING); } public static ValueExpression con(final String value, final Encoding encoding) { return con(ConstantFactory.createFromString(value, encoding)); } public static ValueExpression con(final Value value) { return new Const(value); } - public static ValueExpression con(final Encoding encoding, final int... values) { return new Const(new Value(createFromBytes(toByteArray(values)), encoding)); } + public static ValueExpression con(final Encoding encoding, final int... values) { return new Const(new CoreValue(createFromBytes(toByteArray(values)), encoding)); } public static ValueExpression con(final int... values) { return con(DEFAULT_ENCODING, values); } public static ValueExpression con(final byte[] value) { return con(value, DEFAULT_ENCODING); } public static ValueExpression con(final byte[] value, final Encoding encoding) { return con(ConstantFactory.createFromBytes(value, encoding)); } diff --git a/core/src/main/java/io/parsingdata/metal/Util.java b/core/src/main/java/io/parsingdata/metal/Util.java index 96f4728a..f28ec0e6 100644 --- a/core/src/main/java/io/parsingdata/metal/Util.java +++ b/core/src/main/java/io/parsingdata/metal/Util.java @@ -28,6 +28,7 @@ import io.parsingdata.metal.data.ParseState; import io.parsingdata.metal.data.Slice; import io.parsingdata.metal.encoding.Encoding; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.UnaryValueExpression; import io.parsingdata.metal.expression.value.Value; import io.parsingdata.metal.expression.value.ValueExpression; @@ -105,7 +106,7 @@ public Optional eval(final Value value, final ParseState parseState, fina return Optional.empty(); } } - return Optional.of(new Value(Slice.createFromBytes(out.toByteArray()), encoding)); + return Optional.of(new CoreValue(Slice.createFromBytes(out.toByteArray()), encoding)); } }; } diff --git a/core/src/main/java/io/parsingdata/metal/data/ConcatenatedValueSource.java b/core/src/main/java/io/parsingdata/metal/data/ConcatenatedValueSource.java index 8cb8cecc..603b2c7d 100644 --- a/core/src/main/java/io/parsingdata/metal/data/ConcatenatedValueSource.java +++ b/core/src/main/java/io/parsingdata/metal/data/ConcatenatedValueSource.java @@ -24,7 +24,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.format; import static io.parsingdata.metal.data.Selection.reverse; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; @@ -64,7 +64,7 @@ private static Trampoline calculateTotalSize(final ImmutableList ZERO); } - return intermediate(() -> calculateTotalSize(values.tail, size.add(values.head.slice.length))); + return intermediate(() -> calculateTotalSize(values.tail, size.add(values.head.getSlice().length))); } @Override @@ -79,13 +79,13 @@ private Trampoline getData(final ImmutableList values, final BigI if (length.compareTo(ZERO) <= 0) { return complete(() -> output); } - if (currentOffset.add(values.head.slice.length).compareTo(offset) <= 0) { - return intermediate(() -> getData(values.tail, currentOffset.add(values.head.slice.length), currentDest, offset, length, output)); + if (currentOffset.add(values.head.getSlice().length).compareTo(offset) <= 0) { + return intermediate(() -> getData(values.tail, currentOffset.add(values.head.getSlice().length), currentDest, offset, length, output)); } final BigInteger localOffset = offset.subtract(currentOffset).compareTo(ZERO) < 0 ? ZERO : offset.subtract(currentOffset); - final BigInteger toCopy = length.compareTo(values.head.slice.length.subtract(localOffset)) > 0 ? values.head.slice.length.subtract(localOffset) : length; - System.arraycopy(values.head.slice.getData(), localOffset.intValueExact(), output, currentDest.intValueExact(), toCopy.intValueExact()); - return intermediate(() -> getData(values.tail, currentOffset.add(values.head.slice.length), currentDest.add(toCopy), offset, length.subtract(toCopy), output)); + final BigInteger toCopy = length.compareTo(values.head.getSlice().length.subtract(localOffset)) > 0 ? values.head.getSlice().length.subtract(localOffset) : length; + System.arraycopy(values.head.getSlice().getData(), localOffset.intValueExact(), output, currentDest.intValueExact(), toCopy.intValueExact()); + return intermediate(() -> getData(values.tail, currentOffset.add(values.head.getSlice().length), currentDest.add(toCopy), offset, length.subtract(toCopy), output)); } @Override diff --git a/core/src/main/java/io/parsingdata/metal/data/DataExpressionSource.java b/core/src/main/java/io/parsingdata/metal/data/DataExpressionSource.java index 1c5750ad..a9d92939 100644 --- a/core/src/main/java/io/parsingdata/metal/data/DataExpressionSource.java +++ b/core/src/main/java/io/parsingdata/metal/data/DataExpressionSource.java @@ -21,6 +21,7 @@ import static io.parsingdata.metal.Util.checkNotNegative; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.format; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; @@ -71,7 +72,7 @@ private synchronized byte[] getValue() { throw new IllegalStateException(format("ValueExpression dataExpression must yield at least %d results.", index+1)); } final Value cacheValue = getValueAtIndex(results, index, 0).computeResult(); - if (cacheValue == Value.NOT_A_VALUE) { + if (cacheValue == NOT_A_VALUE) { throw new IllegalStateException(format("ValueExpression dataExpression yields empty Value at index %d.", index)); } cache = cacheValue.getValue(); diff --git a/core/src/main/java/io/parsingdata/metal/data/ParseValue.java b/core/src/main/java/io/parsingdata/metal/data/ParseValue.java index 0f2ea7a6..2817bb87 100644 --- a/core/src/main/java/io/parsingdata/metal/data/ParseValue.java +++ b/core/src/main/java/io/parsingdata/metal/data/ParseValue.java @@ -22,10 +22,10 @@ import java.util.Objects; import io.parsingdata.metal.encoding.Encoding; -import io.parsingdata.metal.expression.value.Value; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.token.Token; -public class ParseValue extends Value implements ParseItem { +public class ParseValue extends CoreValue implements ParseItem { public final String name; public final Token definition; diff --git a/core/src/main/java/io/parsingdata/metal/data/Selection.java b/core/src/main/java/io/parsingdata/metal/data/Selection.java index 0e7c72fc..2636cccb 100644 --- a/core/src/main/java/io/parsingdata/metal/data/Selection.java +++ b/core/src/main/java/io/parsingdata/metal/data/Selection.java @@ -57,7 +57,7 @@ public static Trampoline> findItemAtOffset(final ImmutableLi } private static boolean matchesLocation(final ParseValue value, final BigInteger offset, final Source source) { - return value.slice.offset.compareTo(offset) == 0 && value.slice.source.equals(source); + return value.getSlice().offset.compareTo(offset) == 0 && value.getSlice().source.equals(source); } private static Trampoline getLowestOffsetValue(final ImmutableList graphList, final ParseValue lowest) { @@ -77,7 +77,7 @@ private static ParseValue compareIfValue(final ParseValue lowest, final ParseIte } private static ParseValue getLowest(final ParseValue lowest, final ParseValue value) { - return lowest == null || lowest.slice.offset.compareTo(value.slice.offset) > 0 ? value : lowest; + return lowest == null || lowest.getSlice().offset.compareTo(value.getSlice().offset) > 0 ? value : lowest; } private static ImmutableList addIfGraph(final ImmutableList graphList, final ParseItem head) { diff --git a/core/src/main/java/io/parsingdata/metal/expression/comparison/ComparisonExpression.java b/core/src/main/java/io/parsingdata/metal/expression/comparison/ComparisonExpression.java index dda0913b..5bc5dd11 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/comparison/ComparisonExpression.java +++ b/core/src/main/java/io/parsingdata/metal/expression/comparison/ComparisonExpression.java @@ -19,7 +19,7 @@ import static io.parsingdata.metal.Trampoline.complete; import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/expression/comparison/Eq.java b/core/src/main/java/io/parsingdata/metal/expression/comparison/Eq.java index 331a5dee..f79a1c66 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/comparison/Eq.java +++ b/core/src/main/java/io/parsingdata/metal/expression/comparison/Eq.java @@ -40,7 +40,7 @@ public Eq(final ValueExpression value, final ValueExpression predicate) { @Override public boolean compare(final Value left, final Value right) { - return left.slice.length.compareTo(right.slice.length) == 0 + return left.getSlice().length.compareTo(right.getSlice().length) == 0 && Arrays.equals(left.getValue(), right.getValue()); } diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/BinaryValueExpression.java b/core/src/main/java/io/parsingdata/metal/expression/value/BinaryValueExpression.java index 562bb51f..603dcb12 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/BinaryValueExpression.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/BinaryValueExpression.java @@ -20,7 +20,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Selection.reverse; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.Optional; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Bytes.java b/core/src/main/java/io/parsingdata/metal/expression/value/Bytes.java index 8703a047..f8f80222 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Bytes.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Bytes.java @@ -22,7 +22,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Slice.createFromSource; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; @@ -74,7 +74,7 @@ private Trampoline> extractByteValues(final ImmutableList= 0) { return complete(() -> output); } - return intermediate(() -> extractByteValues(output.add(new Value(createFromSource(value.slice.source, value.slice.offset.add(BigInteger.valueOf(i)), ONE).get(), encoding)), value, i + 1, encoding)); + return intermediate(() -> extractByteValues(output.add(new CoreValue(createFromSource(value.getSlice().source, value.getSlice().offset.add(BigInteger.valueOf(i)), ONE).get(), encoding)), value, i + 1, encoding)); } @Override diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Cat.java b/core/src/main/java/io/parsingdata/metal/expression/value/Cat.java index 6f1972f5..03d5c946 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Cat.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Cat.java @@ -40,7 +40,7 @@ public Cat(final ValueExpression left, final ValueExpression right) { public Optional eval(final Value leftValue, final Value rightValue, final ParseState parseState, final Encoding encoding) { return ConcatenatedValueSource.create(ImmutableList.create(leftValue).add(rightValue)) .flatMap(source -> createFromSource(source, ZERO, leftValue.getLength().add(rightValue.getLength()))) - .map(source -> new Value(source, encoding)); + .map(source -> new CoreValue(source, encoding)); } } diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/ConstantFactory.java b/core/src/main/java/io/parsingdata/metal/expression/value/ConstantFactory.java index 0e895099..24d2976e 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/ConstantFactory.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/ConstantFactory.java @@ -29,7 +29,7 @@ public final class ConstantFactory { private ConstantFactory() {} public static Value createFromBytes(final byte[] value, final Encoding encoding) { - return new Value(Slice.createFromBytes(value), encoding); + return new CoreValue(Slice.createFromBytes(value), encoding); } public static Value createFromNumeric(final BigInteger value, final Encoding encoding) { @@ -41,14 +41,14 @@ public static Value createFromNumeric(final long value, final Encoding encoding) } public static Value createFromString(final String value, final Encoding encoding) { - return new Value(Slice.createFromBytes(value.getBytes(encoding.charset)), encoding); + return new CoreValue(Slice.createFromBytes(value.getBytes(encoding.charset)), encoding); } public static Value createFromBitSet(final BitSet value, final int minSize, final Encoding encoding) { final byte[] bytes = ByteOrder.LITTLE_ENDIAN.apply(value.toByteArray()); final byte[] outBytes = new byte[Math.max(minSize, bytes.length)]; System.arraycopy(bytes, 0, outBytes, outBytes.length - bytes.length, bytes.length); - return new Value(Slice.createFromBytes(outBytes), setToBigEndian(encoding)); + return new CoreValue(Slice.createFromBytes(outBytes), setToBigEndian(encoding)); } private static Encoding setToBigEndian(final Encoding encoding) { diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/CoreValue.java b/core/src/main/java/io/parsingdata/metal/expression/value/CoreValue.java new file mode 100644 index 00000000..0fcf7d73 --- /dev/null +++ b/core/src/main/java/io/parsingdata/metal/expression/value/CoreValue.java @@ -0,0 +1,99 @@ +/* + * Copyright 2013-2016 Netherlands Forensic Institute + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.parsingdata.metal.expression.value; + +import static io.parsingdata.metal.Util.bytesToHexString; +import static io.parsingdata.metal.Util.checkNotNull; +import static io.parsingdata.metal.encoding.Encoding.DEFAULT_ENCODING; + +import java.math.BigInteger; +import java.util.BitSet; +import java.util.Objects; + +import io.parsingdata.metal.Util; +import io.parsingdata.metal.data.Slice; +import io.parsingdata.metal.encoding.ByteOrder; +import io.parsingdata.metal.encoding.Encoding; +import io.parsingdata.metal.encoding.Sign; + +public class CoreValue implements Value { + + public static final Value NOT_A_VALUE = new CoreValue(Slice.createFromBytes(new byte[]{}), DEFAULT_ENCODING); + public static final BigInteger TO_STRING_BYTE_COUNT = BigInteger.valueOf(4); + + private final Slice slice; + private final Encoding encoding; + + public CoreValue(final Slice slice, final Encoding encoding) { + this.slice = checkNotNull(slice, "slice"); + this.encoding = checkNotNull(encoding, "encoding"); + } + + @Override + public Slice getSlice() { + return slice; + } + + @Override + public Encoding getEncoding() { + return encoding; + } + + @Override + public byte[] getValue() { + return slice.getData(); + } + + @Override + public BigInteger getLength() { + return slice.length; + } + + @Override + public BigInteger asNumeric() { + return encoding.sign == Sign.SIGNED ? new BigInteger(encoding.byteOrder.apply(getValue())) + : new BigInteger(1, encoding.byteOrder.apply(getValue())); + } + + @Override + public String asString() { + return new String(getValue(), encoding.charset); + } + + @Override + public BitSet asBitSet() { + return BitSet.valueOf(encoding.byteOrder == ByteOrder.BIG_ENDIAN ? ByteOrder.LITTLE_ENDIAN.apply(getValue()) : getValue()); + } + + @Override + public String toString() { + return "0x" + bytesToHexString(slice.getData(TO_STRING_BYTE_COUNT)) + (getLength().compareTo(TO_STRING_BYTE_COUNT) > 0 ? "..." : ""); + } + + @Override + public boolean equals(final Object obj) { + return Util.notNullAndSameClass(this, obj) + && Objects.equals(slice, ((CoreValue)obj).slice) + && Objects.equals(encoding, ((CoreValue)obj).encoding); + } + + @Override + public int hashCode() { + return Objects.hash(getClass(), slice, encoding); + } + +} diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Elvis.java b/core/src/main/java/io/parsingdata/metal/expression/value/Elvis.java index 7624d668..7eb63c1b 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Elvis.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Elvis.java @@ -20,7 +20,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Selection.reverse; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.Optional; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java b/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java index 50caa538..7b9cb3bc 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Expand.java @@ -19,7 +19,7 @@ import static io.parsingdata.metal.Trampoline.complete; import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Fold.java b/core/src/main/java/io/parsingdata/metal/expression/value/Fold.java index fee49abf..97ca85ec 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Fold.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Fold.java @@ -19,7 +19,7 @@ import static io.parsingdata.metal.Trampoline.complete; import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.function.BinaryOperator; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/FoldCat.java b/core/src/main/java/io/parsingdata/metal/expression/value/FoldCat.java index 908d81da..ed1fca5d 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/FoldCat.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/FoldCat.java @@ -47,7 +47,7 @@ public FoldCat(final ValueExpression operand) { public ImmutableList eval(final ParseState parseState, final Encoding encoding) { return ConcatenatedValueSource.create(operand.eval(parseState, encoding)) .flatMap(source -> createFromSource(source, ZERO, source.length)) - .map(slice -> ImmutableList.create(new Value(slice, encoding))) + .map(slice -> ImmutableList.create(new CoreValue(slice, encoding))) .orElseGet(ImmutableList::new); } diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/UnaryValueExpression.java b/core/src/main/java/io/parsingdata/metal/expression/value/UnaryValueExpression.java index fa2aebc2..53a7a72a 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/UnaryValueExpression.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/UnaryValueExpression.java @@ -20,7 +20,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Selection.reverse; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.Optional; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/Value.java b/core/src/main/java/io/parsingdata/metal/expression/value/Value.java index 2ccc0338..9709d927 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/Value.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/Value.java @@ -1,84 +1,19 @@ -/* - * Copyright 2013-2016 Netherlands Forensic Institute - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package io.parsingdata.metal.expression.value; -import static io.parsingdata.metal.Util.bytesToHexString; -import static io.parsingdata.metal.Util.checkNotNull; -import static io.parsingdata.metal.encoding.Encoding.DEFAULT_ENCODING; - import java.math.BigInteger; import java.util.BitSet; -import java.util.Objects; -import io.parsingdata.metal.Util; import io.parsingdata.metal.data.Slice; -import io.parsingdata.metal.encoding.ByteOrder; import io.parsingdata.metal.encoding.Encoding; -import io.parsingdata.metal.encoding.Sign; - -public class Value { - - public static final Value NOT_A_VALUE = new Value(Slice.createFromBytes(new byte[]{}), DEFAULT_ENCODING); - public static final BigInteger TO_STRING_BYTE_COUNT = BigInteger.valueOf(4); - - public final Slice slice; - public final Encoding encoding; - - public Value(final Slice slice, final Encoding encoding) { - this.slice = checkNotNull(slice, "slice"); - this.encoding = checkNotNull(encoding, "encoding"); - } - - public byte[] getValue() { - return slice.getData(); - } - - public BigInteger getLength() { - return slice.length; - } - - public BigInteger asNumeric() { - return encoding.sign == Sign.SIGNED ? new BigInteger(encoding.byteOrder.apply(getValue())) - : new BigInteger(1, encoding.byteOrder.apply(getValue())); - } - - public String asString() { - return new String(getValue(), encoding.charset); - } - - public BitSet asBitSet() { - return BitSet.valueOf(encoding.byteOrder == ByteOrder.BIG_ENDIAN ? ByteOrder.LITTLE_ENDIAN.apply(getValue()) : getValue()); - } - - @Override - public String toString() { - return "0x" + bytesToHexString(slice.getData(TO_STRING_BYTE_COUNT)) + (getLength().compareTo(TO_STRING_BYTE_COUNT) > 0 ? "..." : ""); - } - @Override - public boolean equals(final Object obj) { - return Util.notNullAndSameClass(this, obj) - && Objects.equals(slice, ((Value)obj).slice) - && Objects.equals(encoding, ((Value)obj).encoding); - } +public interface Value { - @Override - public int hashCode() { - return Objects.hash(getClass(), slice, encoding); - } + Slice getSlice(); + Encoding getEncoding(); + byte[] getValue(); + BigInteger getLength(); + BigInteger asNumeric(); + String asString(); + BitSet asBitSet(); } diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Div.java b/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Div.java index 3de12323..f108bfc8 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Div.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Div.java @@ -18,7 +18,7 @@ import static java.math.BigInteger.ZERO; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Optional; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Mod.java b/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Mod.java index e93ccf2c..bec57356 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Mod.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/arithmetic/Mod.java @@ -18,7 +18,7 @@ import static java.math.BigInteger.ZERO; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Optional; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java index 273338d9..163b4e3e 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/CurrentIteration.java @@ -24,7 +24,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.encoding.Encoding.DEFAULT_ENCODING; import static io.parsingdata.metal.expression.value.ConstantFactory.createFromNumeric; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java index ef7257a3..2e53652e 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Nth.java @@ -23,7 +23,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Selection.reverse; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Offset.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Offset.java index cc7646c2..6ae1b535 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Offset.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Offset.java @@ -40,7 +40,7 @@ public class Offset extends UnaryValueExpression { @Override public Optional eval(final Value value, final ParseState parseState, final Encoding encoding) { - return Optional.of(ConstantFactory.createFromNumeric(value.slice.offset, value.encoding)); + return Optional.of(ConstantFactory.createFromNumeric(value.getSlice().offset, value.getEncoding())); } } diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Ref.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Ref.java index 883f87c1..e3781a65 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Ref.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Ref.java @@ -21,7 +21,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.data.Selection.NO_LIMIT; import static io.parsingdata.metal.data.Selection.getAllValues; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.function.Predicate; diff --git a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java index 756e9dc4..d6ce920c 100644 --- a/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java +++ b/core/src/main/java/io/parsingdata/metal/expression/value/reference/Self.java @@ -24,9 +24,8 @@ import io.parsingdata.metal.expression.value.ValueExpression; /** - * A {@link ValueExpression} that represents the - * {@link io.parsingdata.metal.expression.value.Value} most recently added to - * the parse state. + * A {@link ValueExpression} that represents the {@link Value} most recently + * added to the parse state. */ public class Self implements ValueExpression { diff --git a/core/src/main/java/io/parsingdata/metal/token/Def.java b/core/src/main/java/io/parsingdata/metal/token/Def.java index 1661f290..aff4edff 100644 --- a/core/src/main/java/io/parsingdata/metal/token/Def.java +++ b/core/src/main/java/io/parsingdata/metal/token/Def.java @@ -22,7 +22,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.failure; import static io.parsingdata.metal.Util.success; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/token/RepN.java b/core/src/main/java/io/parsingdata/metal/token/RepN.java index 13f64d30..8fecd3eb 100644 --- a/core/src/main/java/io/parsingdata/metal/token/RepN.java +++ b/core/src/main/java/io/parsingdata/metal/token/RepN.java @@ -18,7 +18,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.failure; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/token/Sub.java b/core/src/main/java/io/parsingdata/metal/token/Sub.java index 326cb327..f32c6028 100644 --- a/core/src/main/java/io/parsingdata/metal/token/Sub.java +++ b/core/src/main/java/io/parsingdata/metal/token/Sub.java @@ -21,7 +21,7 @@ import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.success; import static io.parsingdata.metal.data.Selection.hasRootAtOffset; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/main/java/io/parsingdata/metal/token/Tie.java b/core/src/main/java/io/parsingdata/metal/token/Tie.java index f54b6959..e7967d3a 100644 --- a/core/src/main/java/io/parsingdata/metal/token/Tie.java +++ b/core/src/main/java/io/parsingdata/metal/token/Tie.java @@ -20,6 +20,7 @@ import static io.parsingdata.metal.Trampoline.intermediate; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.success; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.util.Objects; import java.util.Optional; @@ -68,7 +69,7 @@ private Trampoline> iterate(final Environment environment, if (values.isEmpty()) { return complete(() -> success(new ParseState(environment.parseState.closeBranch(this).order, returnParseState.source, returnParseState.offset, returnParseState.iterations))); } - if (values.head == Value.NOT_A_VALUE) { + if (values.head == NOT_A_VALUE) { return complete(Util::failure); } return token.parse(environment.withParseState(environment.parseState.withSource(new DataExpressionSource(dataExpression, index, environment.parseState, environment.encoding)))) diff --git a/core/src/main/java/io/parsingdata/metal/token/Until.java b/core/src/main/java/io/parsingdata/metal/token/Until.java index 24552aaa..b964a6ef 100644 --- a/core/src/main/java/io/parsingdata/metal/token/Until.java +++ b/core/src/main/java/io/parsingdata/metal/token/Until.java @@ -24,7 +24,7 @@ import static io.parsingdata.metal.Util.checkNotEmpty; import static io.parsingdata.metal.Util.checkNotNull; import static io.parsingdata.metal.Util.success; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import java.math.BigInteger; import java.util.Objects; diff --git a/core/src/test/java/io/parsingdata/metal/AutoEqualityTest.java b/core/src/test/java/io/parsingdata/metal/AutoEqualityTest.java index 78e60f4c..90099dc8 100644 --- a/core/src/test/java/io/parsingdata/metal/AutoEqualityTest.java +++ b/core/src/test/java/io/parsingdata/metal/AutoEqualityTest.java @@ -79,6 +79,7 @@ import io.parsingdata.metal.expression.value.Cat; import io.parsingdata.metal.expression.value.Const; import io.parsingdata.metal.expression.value.ConstantFactory; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.Elvis; import io.parsingdata.metal.expression.value.Expand; import io.parsingdata.metal.expression.value.FoldCat; @@ -203,7 +204,7 @@ public static Collection data() throws IllegalAccessException, Invocat io.parsingdata.metal.expression.logical.And.class, io.parsingdata.metal.expression.logical.Or.class, io.parsingdata.metal.expression.logical.Not.class, // Data structures - Value.class, ParseValue.class, ParseReference.class, ParseState.class, + CoreValue.class, ParseValue.class, ParseReference.class, ParseState.class, // Inputs ConstantSource.class, DataExpressionSource.class, ByteStreamSource.class, ConcatenatedValueSource.class ); diff --git a/core/src/test/java/io/parsingdata/metal/SubStructTableTest.java b/core/src/test/java/io/parsingdata/metal/SubStructTableTest.java index af9a25d3..72f80b18 100644 --- a/core/src/test/java/io/parsingdata/metal/SubStructTableTest.java +++ b/core/src/test/java/io/parsingdata/metal/SubStructTableTest.java @@ -94,7 +94,7 @@ private void checkStruct(final ParseGraph graph, final int offsetHeader) { assertTrue(graph.head.isGraph()); assertEquals(84, graph.head.asGraph().head.asValue().asNumeric().intValueExact()); assertEquals(42, graph.tail.head.asGraph().head.asValue().asNumeric().intValueExact()); - assertEquals(offsetHeader, graph.tail.head.asGraph().head.asValue().slice.offset.intValueExact()); + assertEquals(offsetHeader, graph.tail.head.asGraph().head.asValue().getSlice().offset.intValueExact()); } } diff --git a/core/src/test/java/io/parsingdata/metal/SubStructTest.java b/core/src/test/java/io/parsingdata/metal/SubStructTest.java index f90e6ff2..e574f579 100644 --- a/core/src/test/java/io/parsingdata/metal/SubStructTest.java +++ b/core/src/test/java/io/parsingdata/metal/SubStructTest.java @@ -148,7 +148,7 @@ private void checkLeaf(final ParseGraph graph, final int graphOffset, final int private void checkValue(final ParseItem item, final int value, final int offset) { assertTrue(item.isValue()); assertEquals(value, item.asValue().asNumeric().intValueExact()); - assertEquals(offset, item.asValue().slice.offset.intValueExact()); + assertEquals(offset, item.asValue().getSlice().offset.intValueExact()); } @Test diff --git a/core/src/test/java/io/parsingdata/metal/ToStringTest.java b/core/src/test/java/io/parsingdata/metal/ToStringTest.java index 4469e928..14ac7f6b 100644 --- a/core/src/test/java/io/parsingdata/metal/ToStringTest.java +++ b/core/src/test/java/io/parsingdata/metal/ToStringTest.java @@ -88,6 +88,7 @@ import io.parsingdata.metal.encoding.Encoding; import io.parsingdata.metal.encoding.Sign; import io.parsingdata.metal.expression.Expression; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.Value; import io.parsingdata.metal.expression.value.ValueExpression; import io.parsingdata.metal.token.Token; @@ -174,7 +175,7 @@ public void data() { final ParseValue pv1 = new ParseValue("name", NONE, createFromBytes(new byte[]{1, 2}), enc()); final String pv1String = "pval(name:0x0102)"; final Optional ov1 = Optional.of(pv1); - final Optional ov2 = Optional.of(new Value(createFromBytes(new byte[]{3}), enc())); + final Optional ov2 = Optional.of(new CoreValue(createFromBytes(new byte[]{3}), enc())); assertEquals(">Optional[0x03]>Optional[" + pv1String + "]", ImmutableList.create(ov1).add(ov2).toString()); final ParseValue pv2 = new ParseValue("two", NONE, createFromBytes(new byte[]{3, 4}), enc()); final String pv2String = "pval(two:0x0304)"; diff --git a/core/src/test/java/io/parsingdata/metal/TreeTest.java b/core/src/test/java/io/parsingdata/metal/TreeTest.java index 67243436..e5dc8796 100644 --- a/core/src/test/java/io/parsingdata/metal/TreeTest.java +++ b/core/src/test/java/io/parsingdata/metal/TreeTest.java @@ -106,7 +106,7 @@ private void checkHeader(final ParseGraph header, final int offset) { assertTrue(head.isValue()); assertTrue(head.asValue().matches("head")); assertEquals(HEAD, head.asValue().asNumeric().intValueExact()); - assertEquals(offset, head.asValue().slice.offset.intValueExact()); + assertEquals(offset, head.asValue().getSlice().offset.intValueExact()); final ParseItem nr = header.head; // head = Def("nr") assertTrue(nr.isValue()); assertTrue(nr.asValue().matches("nr")); diff --git a/core/src/test/java/io/parsingdata/metal/UtilInflateTest.java b/core/src/test/java/io/parsingdata/metal/UtilInflateTest.java index e2a9f80f..30111d7a 100644 --- a/core/src/test/java/io/parsingdata/metal/UtilInflateTest.java +++ b/core/src/test/java/io/parsingdata/metal/UtilInflateTest.java @@ -20,7 +20,7 @@ import static io.parsingdata.metal.Shorthand.con; import static io.parsingdata.metal.Util.inflate; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import static io.parsingdata.metal.util.EncodingFactory.enc; import static io.parsingdata.metal.util.ParseStateFactory.stream; diff --git a/core/src/test/java/io/parsingdata/metal/data/ConcatenatedValueSourceTest.java b/core/src/test/java/io/parsingdata/metal/data/ConcatenatedValueSourceTest.java index 2d15cd1c..ec81a384 100644 --- a/core/src/test/java/io/parsingdata/metal/data/ConcatenatedValueSourceTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/ConcatenatedValueSourceTest.java @@ -31,6 +31,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.Value; @RunWith(Parameterized.class) @@ -46,8 +47,8 @@ private static ImmutableList createValues() { final byte[] twoSliceSource = new byte[] { -1, -1, 5, 6, 7, 8, 9, -1, -1, 10, 11, 12, 13, 14, -1, -1 }; return ImmutableList .create(createFromBytes(new byte[] { 0, 1, 2, 3, 4 }, enc())) - .add(new Value(createFromSource(new ConstantSource(twoSliceSource), BigInteger.valueOf(2), BigInteger.valueOf(5)).get(), enc())) - .add(new Value(createFromSource(new ConstantSource(twoSliceSource), BigInteger.valueOf(9), BigInteger.valueOf(5)).get(), enc())) + .add(new CoreValue(createFromSource(new ConstantSource(twoSliceSource), BigInteger.valueOf(2), BigInteger.valueOf(5)).get(), enc())) + .add(new CoreValue(createFromSource(new ConstantSource(twoSliceSource), BigInteger.valueOf(9), BigInteger.valueOf(5)).get(), enc())) .add(createFromBytes(new byte[] { 15, 16, 17, 18, 19 }, enc())) .add(createFromBytes(new byte[] { 20, 21, 22, 23, 24 }, enc())); } diff --git a/core/src/test/java/io/parsingdata/metal/data/DataExpressionSourceTest.java b/core/src/test/java/io/parsingdata/metal/data/DataExpressionSourceTest.java index 0a05c565..212d6b32 100644 --- a/core/src/test/java/io/parsingdata/metal/data/DataExpressionSourceTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/DataExpressionSourceTest.java @@ -63,8 +63,8 @@ private Optional setupResult() { @Test public void createSliceFromParseValue() { final ParseValue value = setupValue(); - assertTrue(value.slice.source.isAvailable(ZERO, BigInteger.valueOf(4))); - assertFalse(value.slice.source.isAvailable(ZERO, BigInteger.valueOf(5))); + assertTrue(value.getSlice().source.isAvailable(ZERO, BigInteger.valueOf(4))); + assertFalse(value.getSlice().source.isAvailable(ZERO, BigInteger.valueOf(5))); } @Test diff --git a/core/src/test/java/io/parsingdata/metal/data/ParseGraphTest.java b/core/src/test/java/io/parsingdata/metal/data/ParseGraphTest.java index c99cdbab..8a092761 100644 --- a/core/src/test/java/io/parsingdata/metal/data/ParseGraphTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/ParseGraphTest.java @@ -132,7 +132,7 @@ private ParseGraph makeCycleGraph() { .add(a) .addBranch(t) .add(b) - .add(new ParseReference(a.slice.offset, a.slice.source, aDef)) + .add(new ParseReference(a.getSlice().offset, a.getSlice().source, aDef)) .closeBranch(); } diff --git a/core/src/test/java/io/parsingdata/metal/data/ParseValueTest.java b/core/src/test/java/io/parsingdata/metal/data/ParseValueTest.java index 40fafd8e..c98ea9ce 100644 --- a/core/src/test/java/io/parsingdata/metal/data/ParseValueTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/ParseValueTest.java @@ -54,7 +54,7 @@ public void setUp() { public void state() { assertThat(value.name, is("value")); assertThat(value.getDefinition(), is(definition)); - assertThat(value.slice.offset.longValueExact(), is(0L)); + assertThat(value.getSlice().offset.longValueExact(), is(0L)); assertThat(value.getValue(), is(equalTo(new byte[] { 1 }))); } diff --git a/core/src/test/java/io/parsingdata/metal/data/SliceTest.java b/core/src/test/java/io/parsingdata/metal/data/SliceTest.java index ccb1a7a0..0e5e1add 100644 --- a/core/src/test/java/io/parsingdata/metal/data/SliceTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/SliceTest.java @@ -98,10 +98,10 @@ public void retrievePartialDataFromSlice() { @Test public void sliceToString() { final ParseValue pv1 = new ParseValue("name", NONE, createFromBytes(new byte[]{1, 2}), enc()); - assertEquals("Slice(ConstantSource(0x0102)@0:2)", pv1.slice.toString()); + assertEquals("Slice(ConstantSource(0x0102)@0:2)", pv1.getSlice().toString()); final ParseState oneValueParseState = stream().add(pv1); final ParseState twoValueParseState = oneValueParseState.add(new ParseValue("name2", NONE, Slice.createFromSource(new DataExpressionSource(ref("name"), 0, oneValueParseState, enc()), ZERO, BigInteger.valueOf(2)).get(), enc())); - final String dataExpressionSliceString = getValue(twoValueParseState.order, "name2").slice.toString(); + final String dataExpressionSliceString = getValue(twoValueParseState.order, "name2").getSlice().toString(); assertTrue(dataExpressionSliceString.startsWith("Slice(DataExpressionSource(NameRef(name)[0](")); assertTrue(dataExpressionSliceString.endsWith(")@0:2)")); } diff --git a/core/src/test/java/io/parsingdata/metal/data/SourceAndSliceTest.java b/core/src/test/java/io/parsingdata/metal/data/SourceAndSliceTest.java index 5571673f..40aa82b0 100644 --- a/core/src/test/java/io/parsingdata/metal/data/SourceAndSliceTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/SourceAndSliceTest.java @@ -39,6 +39,7 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.Value; import io.parsingdata.metal.util.InMemoryByteStream; @@ -57,7 +58,7 @@ public static Collection data() { { new ConstantSource(DATA) }, { new DataExpressionSource(con(DATA), 0, EMPTY_PARSE_STATE, enc()) }, { new ByteStreamSource(new InMemoryByteStream(DATA)) }, - { ConcatenatedValueSource.create(ImmutableList.create(new Value(createFromSource(new ConstantSource(DATA), ZERO, BigInteger.valueOf(2)).get(), enc())).add(new Value(createFromSource(new ConstantSource(DATA), BigInteger.valueOf(2), BigInteger.valueOf(2)).get(), enc()))).get() } + { ConcatenatedValueSource.create(ImmutableList.create(new CoreValue(createFromSource(new ConstantSource(DATA), ZERO, BigInteger.valueOf(2)).get(), enc())).add(new CoreValue(createFromSource(new ConstantSource(DATA), BigInteger.valueOf(2), BigInteger.valueOf(2)).get(), enc()))).get() } }); } diff --git a/core/src/test/java/io/parsingdata/metal/data/callback/CallbackTest.java b/core/src/test/java/io/parsingdata/metal/data/callback/CallbackTest.java index 190c543b..abf4d183 100644 --- a/core/src/test/java/io/parsingdata/metal/data/callback/CallbackTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/callback/CallbackTest.java @@ -93,7 +93,7 @@ private Callbacks createCallbackList(Token token, final long... offsets) { @Override public void handleSuccess(Token token, ParseState before, ParseState after) { final ImmutableList roots = getAllRoots(after.order, token); - assertEquals(offsets[count++], roots.head.asGraph().tail.head.asValue().slice.offset.longValueExact()); + assertEquals(offsets[count++], roots.head.asGraph().tail.head.asValue().getSlice().offset.longValueExact()); } @Override @@ -130,8 +130,8 @@ public void handleSuccess(Token token, ParseState before, ParseState after) { assertEquals(2, seqRoots.size); // verify order of the two Seq graphs: - assertEquals(2, getValue(seqRoots.head.asGraph(), "a").slice.offset.intValueExact()); - assertEquals(0, getValue(seqRoots.tail.head.asGraph(), "a").slice.offset.intValueExact()); + assertEquals(2, getValue(seqRoots.head.asGraph(), "a").getSlice().offset.intValueExact()); + assertEquals(0, getValue(seqRoots.tail.head.asGraph(), "a").getSlice().offset.intValueExact()); } @Override diff --git a/core/src/test/java/io/parsingdata/metal/data/selection/ByTokenTest.java b/core/src/test/java/io/parsingdata/metal/data/selection/ByTokenTest.java index 0e7e6819..5c4bccaa 100644 --- a/core/src/test/java/io/parsingdata/metal/data/selection/ByTokenTest.java +++ b/core/src/test/java/io/parsingdata/metal/data/selection/ByTokenTest.java @@ -255,7 +255,7 @@ public void getAllRootsSingle() { assertEquals(SMALL_SEQ, seqItems.head.getDefinition()); final ParseValue c = seqItems.head.asGraph().head.asValue(); assertEquals(3, c.asNumeric().intValueExact()); - assertEquals(2, c.slice.offset.intValueExact()); + assertEquals(2, c.getSlice().offset.intValueExact()); } @Test diff --git a/core/src/test/java/io/parsingdata/metal/expression/value/FoldEdgeCaseTest.java b/core/src/test/java/io/parsingdata/metal/expression/value/FoldEdgeCaseTest.java index ac9fae8a..cc550511 100644 --- a/core/src/test/java/io/parsingdata/metal/expression/value/FoldEdgeCaseTest.java +++ b/core/src/test/java/io/parsingdata/metal/expression/value/FoldEdgeCaseTest.java @@ -34,7 +34,7 @@ import static io.parsingdata.metal.data.Slice.createFromBytes; import static io.parsingdata.metal.encoding.Encoding.DEFAULT_ENCODING; import static io.parsingdata.metal.expression.value.BytesTest.EMPTY_PARSE_STATE; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import static io.parsingdata.metal.util.EncodingFactory.enc; import static io.parsingdata.metal.util.EnvironmentFactory.env; import static io.parsingdata.metal.util.ParseStateFactory.stream; @@ -80,7 +80,7 @@ public void foldToEmpty() { @Test public void inputContainsEmptyInTail() { - assertEquals(NOT_A_VALUE, foldRight((parseState, encoding) -> ImmutableList.create(NOT_A_VALUE).add(new Value(createFromBytes(new byte[] { 1, 2 }), enc())), Shorthand::add).eval(stream(0), enc()).head); + assertEquals(NOT_A_VALUE, foldRight((parseState, encoding) -> ImmutableList.create(NOT_A_VALUE).add(new CoreValue(createFromBytes(new byte[] { 1, 2 }), enc())), Shorthand::add).eval(stream(0), enc()).head); } @Test diff --git a/core/src/test/java/io/parsingdata/metal/expression/value/NthExpressionTest.java b/core/src/test/java/io/parsingdata/metal/expression/value/NthExpressionTest.java index 6af5daad..2ebb1c63 100644 --- a/core/src/test/java/io/parsingdata/metal/expression/value/NthExpressionTest.java +++ b/core/src/test/java/io/parsingdata/metal/expression/value/NthExpressionTest.java @@ -25,7 +25,7 @@ import static io.parsingdata.metal.Shorthand.ref; import static io.parsingdata.metal.Shorthand.repn; import static io.parsingdata.metal.Shorthand.seq; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import static io.parsingdata.metal.util.EncodingFactory.enc; import static io.parsingdata.metal.util.EncodingFactory.signed; import static io.parsingdata.metal.util.EnvironmentFactory.env; diff --git a/core/src/test/java/io/parsingdata/metal/expression/value/RefEdgeCaseTest.java b/core/src/test/java/io/parsingdata/metal/expression/value/RefEdgeCaseTest.java index 1a8b191c..287c745b 100644 --- a/core/src/test/java/io/parsingdata/metal/expression/value/RefEdgeCaseTest.java +++ b/core/src/test/java/io/parsingdata/metal/expression/value/RefEdgeCaseTest.java @@ -23,7 +23,7 @@ import static io.parsingdata.metal.Shorthand.exp; import static io.parsingdata.metal.Shorthand.ref; import static io.parsingdata.metal.Shorthand.rep; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import static io.parsingdata.metal.util.EncodingFactory.enc; import static io.parsingdata.metal.util.EnvironmentFactory.env; import static io.parsingdata.metal.util.ParseStateFactory.stream; diff --git a/core/src/test/java/io/parsingdata/metal/expression/value/ValueExpressionEvalEmptyTest.java b/core/src/test/java/io/parsingdata/metal/expression/value/ValueExpressionEvalEmptyTest.java index 68356aae..469ac05c 100644 --- a/core/src/test/java/io/parsingdata/metal/expression/value/ValueExpressionEvalEmptyTest.java +++ b/core/src/test/java/io/parsingdata/metal/expression/value/ValueExpressionEvalEmptyTest.java @@ -21,7 +21,7 @@ import static io.parsingdata.metal.Shorthand.con; import static io.parsingdata.metal.Shorthand.div; import static io.parsingdata.metal.Shorthand.mod; -import static io.parsingdata.metal.expression.value.Value.NOT_A_VALUE; +import static io.parsingdata.metal.expression.value.CoreValue.NOT_A_VALUE; import static io.parsingdata.metal.util.EncodingFactory.enc; import static io.parsingdata.metal.util.EncodingFactory.signed; import static io.parsingdata.metal.util.ParseStateFactory.stream; diff --git a/formats/src/main/java/io/parsingdata/metal/format/Callback.java b/formats/src/main/java/io/parsingdata/metal/format/Callback.java index 00924789..9b4f30b3 100644 --- a/formats/src/main/java/io/parsingdata/metal/format/Callback.java +++ b/formats/src/main/java/io/parsingdata/metal/format/Callback.java @@ -23,6 +23,7 @@ import io.parsingdata.metal.data.ParseState; import io.parsingdata.metal.encoding.Encoding; +import io.parsingdata.metal.expression.value.CoreValue; import io.parsingdata.metal.expression.value.UnaryValueExpression; import io.parsingdata.metal.expression.value.Value; import io.parsingdata.metal.expression.value.ValueExpression; @@ -38,7 +39,7 @@ public Optional eval(final Value value, final ParseState parseState, fina final CRC32 crc = new CRC32(); crc.update(value.getValue()); final long crcValue = crc.getValue(); - return Optional.of(new Value(createFromBytes(encoding.byteOrder.apply(new byte[] { + return Optional.of(new CoreValue(createFromBytes(encoding.byteOrder.apply(new byte[] { (byte)((crcValue & 0xff000000) >> 24), (byte)((crcValue & 0xff0000) >> 16), (byte)((crcValue & 0xff00) >> 8),