Skip to content

Commit

Permalink
Refactor routing expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
Sm0keySa1m0n committed Sep 4, 2023
1 parent fdb53ab commit 2cc3e2a
Show file tree
Hide file tree
Showing 19 changed files with 48 additions and 183 deletions.
47 changes: 13 additions & 34 deletions src/main/java/mods/railcraft/util/routing/RoutingLogic.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,11 @@
import mods.railcraft.api.carts.Paintable;
import mods.railcraft.api.carts.RollingStock;
import mods.railcraft.api.carts.Routable;
import mods.railcraft.util.PowerUtil;
import mods.railcraft.util.routing.expression.ConstantExpression;
import mods.railcraft.util.routing.expression.Expression;
import mods.railcraft.util.routing.expression.IF;
import mods.railcraft.util.routing.expression.condition.AND;
import mods.railcraft.util.routing.expression.condition.ColorCondition;
import mods.railcraft.util.routing.expression.condition.Condition;
import mods.railcraft.util.routing.expression.condition.ConstantCondition;
import mods.railcraft.util.routing.expression.condition.DestCondition;
import mods.railcraft.util.routing.expression.condition.LocomotiveCondition;
import mods.railcraft.util.routing.expression.condition.NOT;
import mods.railcraft.util.routing.expression.condition.NameCondition;
import mods.railcraft.util.routing.expression.condition.OR;
import mods.railcraft.util.routing.expression.condition.OwnerCondition;
import mods.railcraft.util.routing.expression.condition.RedstoneCondition;
import mods.railcraft.util.routing.expression.condition.RefuelCondition;
Expand Down Expand Up @@ -75,7 +67,7 @@ private void parseTable(Deque<String> data) throws RoutingLogicException {
expressions = stack;
}

private AbstractMinecart getRoutableCart(AbstractMinecart cart) {
private static AbstractMinecart getRoutableCart(AbstractMinecart cart) {
var rollingStock = RollingStock.getOrThrow(cart);
var train = rollingStock.train();
if (train.size() <= 1) {
Expand All @@ -96,22 +88,16 @@ private AbstractMinecart getRoutableCart(AbstractMinecart cart) {
}

public boolean matches(RouterBlockEntity blockEntityRouting, AbstractMinecart cart) {
return evaluate(blockEntityRouting, cart) != PowerUtil.NO_POWER;
}

public int evaluate(RouterBlockEntity blockEntityRouting, AbstractMinecart cart) {
if (expressions == null) {
return PowerUtil.NO_POWER;
if (this.expressions == null) {
return false;
}
var controllingCart = getRoutableCart(cart);
return expressions.stream()
.mapToInt(expression -> expression.evaluate(blockEntityRouting, controllingCart))
.filter(value -> value != PowerUtil.NO_POWER)
.findFirst()
.orElse(PowerUtil.NO_POWER);
return this.expressions.stream()
.anyMatch(expression -> expression.evaluate(blockEntityRouting, controllingCart));
}

private Expression parseLine(String line, Deque<Expression> stack) throws RoutingLogicException {
private static Expression parseLine(String line, Deque<Expression> stack)
throws RoutingLogicException {
try {
if (line.startsWith("Dest")) {
return new DestCondition(line);
Expand Down Expand Up @@ -146,30 +132,23 @@ private Expression parseLine(String line, Deque<Expression> stack) throws Routin
throw new RoutingLogicException(Translations.RoutingTable.ERROR_MALFORMED_SYNTAX, line);
}
if (line.equals("TRUE")) {
return ConstantCondition.TRUE;
return Expression.TRUE;
}
if (line.equals("FALSE")) {
return ConstantCondition.FALSE;
}
try {
return new ConstantExpression(Integer.parseInt(line));
} catch (NumberFormatException ignored) {
// not an integer; pass through
} catch (IllegalArgumentException ex) {
throw new RoutingLogicException(Translations.RoutingTable.ERROR_INVALID_CONSTANT, line);
return Expression.FALSE;
}
try {
if (line.equals("NOT")) {
return new NOT((Condition) stack.pop());
return stack.pop().negate();
}
if (line.equals("AND")) {
return new AND((Condition) stack.pop(), (Condition) stack.pop());
return stack.pop().and(stack.pop());
}
if (line.equals("OR")) {
return new OR((Condition) stack.pop(), (Condition) stack.pop());
return stack.pop().or(stack.pop());
}
if (line.equals("IF")) {
return new IF((Condition) stack.pop(), stack.pop(), stack.pop());
return stack.pop().select(stack.pop(), stack.pop());
}
} catch (NoSuchElementException ex) {
throw new RoutingLogicException(Translations.RoutingTable.ERROR_INSUFFICIENT_OPERAND, line);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,29 @@
import mods.railcraft.util.routing.RouterBlockEntity;
import net.minecraft.world.entity.vehicle.AbstractMinecart;

@FunctionalInterface
public interface Expression {

int evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart);
Expression FALSE = (router, cart) -> false;
Expression TRUE = (router, cart) -> true;

boolean evaluate(RouterBlockEntity router, AbstractMinecart cart);

default Expression negate() {
return (router, cart) -> !this.evaluate(router, cart);
}

default Expression and(Expression other) {
return (router, cart) -> this.evaluate(router, cart) && other.evaluate(router, cart);
}

default Expression or(Expression other) {
return (router, cart) -> this.evaluate(router, cart) || other.evaluate(router, cart);
}

default Expression select(Expression success, Expression fail) {
return (router, cart) -> this.evaluate(router, cart)
? success.evaluate(router, cart)
: fail.evaluate(router, cart);
}
}
23 changes: 0 additions & 23 deletions src/main/java/mods/railcraft/util/routing/expression/IF.java

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public ColorCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
if (cart instanceof Paintable paintedCart) {
return (primary == null || primary.equals(paintedCart.getPrimaryDyeColor())) &&
(secondary == null || secondary.equals(paintedCart.getSecondaryDyeColor()));
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public DestCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
if (cart instanceof Routable routableCart) {
String cartDest = routableCart.getDestination();
if (StringUtils.equalsIgnoreCase("null", value)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public LocomotiveCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
if (cart instanceof Locomotive loco) {
if (value.equalsIgnoreCase("Electric")) {
return loco.getType() == RailcraftEntityTypes.ELECTRIC_LOCOMOTIVE.get();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public NameCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
if (!cart.hasCustomName()) {
return StringUtils.equalsIgnoreCase("null", value);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public OwnerCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
var owner = CartTools.getCartOwner(cart);
if (owner == null) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
import mods.railcraft.util.routing.RouterBlockEntity;
import mods.railcraft.util.routing.RoutingLogic;
import mods.railcraft.util.routing.RoutingLogicException;
import mods.railcraft.util.routing.expression.Expression;
import net.minecraft.world.entity.vehicle.AbstractMinecart;

public abstract class ParsedCondition implements Condition {
public abstract class ParsedCondition implements Expression {

public final String value;
protected final boolean isRegex;
Expand Down Expand Up @@ -38,5 +39,5 @@ protected void validateRegex(String line) throws RoutingLogicException {
}

@Override
public abstract boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart);
public abstract boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public RedstoneCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
return powered == routerBlockEntity.isPowered();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public RefuelCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
return RollingStock.getOrThrow(cart)
.train()
.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public RiderCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
switch (tokens[0].toLowerCase(Locale.ROOT)) {
case "any" -> {
return !getPassengers(cart).isEmpty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public TypeCondition(String line) throws RoutingLogicException {
}

@Override
public boolean matches(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
public boolean evaluate(RouterBlockEntity routerBlockEntity, AbstractMinecart cart) {
var cartType = ForgeRegistries.ENTITY_TYPES.getKey(cart.getType()).toString();
return value.equalsIgnoreCase(cartType);
}
Expand Down

0 comments on commit 2cc3e2a

Please sign in to comment.