From 8b7b285503e595cce1f29565a4045836edf162a0 Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 1 Oct 2019 14:50:16 -0300 Subject: [PATCH] hash code and stump of map --- .../java/carpet/script/CarpetExpression.java | 18 ++++++++++ src/main/java/carpet/script/Expression.java | 2 ++ .../java/carpet/script/value/BlockValue.java | 9 +++++ .../java/carpet/script/value/EntityValue.java | 7 ++++ .../script/value/FunctionSignatureValue.java | 6 ++++ .../java/carpet/script/value/GlobalValue.java | 6 ++++ .../carpet/script/value/LazyListValue.java | 12 +++++++ .../java/carpet/script/value/ListValue.java | 13 ++++--- .../java/carpet/script/value/MapValue.java | 34 +++++++++++++++++++ .../java/carpet/script/value/NullValue.java | 6 ++++ .../carpet/script/value/NumericValue.java | 9 +++++ src/main/java/carpet/script/value/Value.java | 8 +++++ 12 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 src/main/java/carpet/script/value/MapValue.java diff --git a/src/main/java/carpet/script/CarpetExpression.java b/src/main/java/carpet/script/CarpetExpression.java index 621a62b2..d2b75ded 100644 --- a/src/main/java/carpet/script/CarpetExpression.java +++ b/src/main/java/carpet/script/CarpetExpression.java @@ -2155,6 +2155,12 @@ public class CarpetExpression y = miny; z = minz; } + + @Override + public String getString() + { + return String.format("rect[(%d,%d,%d),..,(%d,%d,%d)]",minx, miny, minz, maxx, maxy, maxz); + } }; }); @@ -2246,6 +2252,12 @@ public class CarpetExpression curradius = 0; curpos = 0; } + + @Override + public String getString() + { + return String.format("diamond[(%d,%d,%d),%d,0]",cx, cy, cz, width); + } }; } else @@ -2302,6 +2314,12 @@ public class CarpetExpression curpos = 0; curheight = -height; } + + @Override + public String getString() + { + return String.format("diamond[(%d,%d,%d),%d,%d]",cx, cy, cz, width, height); + } }; } }); diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java index 155e7c7f..6b4f22b6 100644 --- a/src/main/java/carpet/script/Expression.java +++ b/src/main/java/carpet/script/Expression.java @@ -2402,6 +2402,8 @@ public class Expression implements Cloneable */ public void SystemFunctions() { + addUnaryFunction("hash_code", v -> new NumericValue(v.hashCode())); + addLazyFunction("bool", 1, (c, t, lv) -> { Value v = lv.get(0).evalValue(c, Context.BOOLEAN); if (v instanceof StringValue) diff --git a/src/main/java/carpet/script/value/BlockValue.java b/src/main/java/carpet/script/value/BlockValue.java index 9818e8ee..c84071bc 100644 --- a/src/main/java/carpet/script/value/BlockValue.java +++ b/src/main/java/carpet/script/value/BlockValue.java @@ -13,6 +13,7 @@ import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.GlobalPos; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -254,6 +255,14 @@ public class BlockValue extends Value return new BlockValue(blockState, world, pos); } + @Override + public int hashCode() + { + if (world != null && pos != null ) + return GlobalPos.create(world.getDimension().getType(), pos).hashCode(); + return ("b"+getString()).hashCode(); + } + public BlockPos getPos() { return pos; diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 52f563e6..9d4d1e71 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -138,6 +138,13 @@ public class EntityValue extends Value return "entity"; } + + @Override + public int hashCode() + { + return entity.hashCode(); + } + public static Pair, Predicate> getPredicate(String who) { Pair, Predicate> res = entityPredicates.get(who); diff --git a/src/main/java/carpet/script/value/FunctionSignatureValue.java b/src/main/java/carpet/script/value/FunctionSignatureValue.java index 73976f6b..48596a49 100644 --- a/src/main/java/carpet/script/value/FunctionSignatureValue.java +++ b/src/main/java/carpet/script/value/FunctionSignatureValue.java @@ -43,5 +43,11 @@ public class FunctionSignatureValue extends Value } public List getGlobals() {return globals;} + @Override + public int hashCode() + { + throw new UnsupportedOperationException("function signature value cannot be used as map key"); + } + } diff --git a/src/main/java/carpet/script/value/GlobalValue.java b/src/main/java/carpet/script/value/GlobalValue.java index 47dcf994..451582d9 100644 --- a/src/main/java/carpet/script/value/GlobalValue.java +++ b/src/main/java/carpet/script/value/GlobalValue.java @@ -19,4 +19,10 @@ public class GlobalValue extends Value { return false; } + + @Override + public int hashCode() + { + throw new UnsupportedOperationException("global value cannot be used as map key"); + } } diff --git a/src/main/java/carpet/script/value/LazyListValue.java b/src/main/java/carpet/script/value/LazyListValue.java index 016d6556..e34a83e7 100644 --- a/src/main/java/carpet/script/value/LazyListValue.java +++ b/src/main/java/carpet/script/value/LazyListValue.java @@ -44,6 +44,12 @@ public abstract class LazyListValue extends AbstractListValue implements Iterato { return stepp > 0?(current < limit):(current > limit); } + + @Override + public String getString() + { + return String.format("[%d, %d, ..., %d]",start, start+stepp, limit); + } }; } @@ -145,4 +151,10 @@ public abstract class LazyListValue extends AbstractListValue implements Iterato ((LazyListValue)copy).reset(); return copy; } + + @Override + public int hashCode() + { + return ("i"+getString()).hashCode(); + } } diff --git a/src/main/java/carpet/script/value/ListValue.java b/src/main/java/carpet/script/value/ListValue.java index 6f0b656c..d24cd39c 100644 --- a/src/main/java/carpet/script/value/ListValue.java +++ b/src/main/java/carpet/script/value/ListValue.java @@ -4,11 +4,7 @@ import carpet.script.exception.InternalExpressionException; import net.minecraft.item.ItemStack; import net.minecraft.util.registry.Registry; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static java.lang.Math.abs; @@ -322,9 +318,16 @@ public class ListValue extends AbstractListValue index = index % numitems; return items.get((int)index); } + @Override public String getTypeString() { return "list"; } + + @Override + public int hashCode() + { + return items.hashCode(); + } } diff --git a/src/main/java/carpet/script/value/MapValue.java b/src/main/java/carpet/script/value/MapValue.java new file mode 100644 index 00000000..57610d09 --- /dev/null +++ b/src/main/java/carpet/script/value/MapValue.java @@ -0,0 +1,34 @@ +package carpet.script.value; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class MapValue extends AbstractListValue +{ + private Map map; + public MapValue() + { + map = new HashMap<>(); + } + + @Override + public Iterator iterator() + { + return map.keySet().iterator(); + } + + @Override + public String getString() + { + return Arrays.toString(map.entrySet().toArray()); + } + + @Override + public boolean getBoolean() + { + return !map.isEmpty(); + } + +} diff --git a/src/main/java/carpet/script/value/NullValue.java b/src/main/java/carpet/script/value/NullValue.java index a749a40b..91994ccd 100644 --- a/src/main/java/carpet/script/value/NullValue.java +++ b/src/main/java/carpet/script/value/NullValue.java @@ -44,4 +44,10 @@ public class NullValue extends NumericValue // TODO check nonsingleton code { return "null"; } + + @Override + public int hashCode() + { + return 0; + } } diff --git a/src/main/java/carpet/script/value/NumericValue.java b/src/main/java/carpet/script/value/NumericValue.java index c47c6ae0..48e90372 100644 --- a/src/main/java/carpet/script/value/NumericValue.java +++ b/src/main/java/carpet/script/value/NumericValue.java @@ -179,4 +179,13 @@ public class NumericValue extends Value return "number"; } + @Override + public int hashCode() + { + if (Math.abs(Math.floor(value + 0.5D)-value) < epsilon) // is sufficiently close to the integer value + return Long.hashCode(getLong()); + return Double.hashCode(value); + } + + } diff --git a/src/main/java/carpet/script/value/Value.java b/src/main/java/carpet/script/value/Value.java index ce061449..c0bffde9 100644 --- a/src/main/java/carpet/script/value/Value.java +++ b/src/main/java/carpet/script/value/Value.java @@ -182,4 +182,12 @@ public abstract class Value implements Comparable, Cloneable { throw new InternalExpressionException("How did you get here? Cannot get type of an intenal type."); } + + @Override + public int hashCode() + { + String stringVal = getString(); + if (stringVal.isEmpty()) return 0; + return ("s"+stringVal).hashCode(); + } }