[epilogue,ntcore,wpiunits] Use pattern matching switch expressions where possible (#8925)

Use [pattern matching switch
expressions](https://docs.oracle.com/en/java/javase/17/language/pattern-matching-switch.html)
where possible. This is a JVM 21+ feature which wasn't available until
recently.

If you look at the Java bytecode, this improves performance from an O(n)
runtime check of literally each of the `if (x instanceof y)` checks to
instead be an O(1) tableswitch.

---------

Signed-off-by: Jonah Snider <jonah@jonahsnider.com>
This commit is contained in:
Jonah Snider
2026-05-27 18:06:15 -07:00
committed by GitHub
parent aedee56e22
commit 7ff32d7756
8 changed files with 377 additions and 614 deletions

View File

@@ -264,42 +264,26 @@ final class GenericEntryImpl extends EntryBase implements GenericEntry {
*/
@Override
public boolean setValue(Object value, long time) {
if (value instanceof NetworkTableValue) {
return set((NetworkTableValue) value);
} else if (value instanceof Boolean) {
return setBoolean((Boolean) value, time);
} else if (value instanceof Long) {
return setInteger((Long) value, time);
} else if (value instanceof Float) {
return setFloat((Float) value, time);
} else if (value instanceof Number) {
return setNumber((Number) value, time);
} else if (value instanceof String) {
return setString((String) value, time);
} else if (value instanceof byte[]) {
return setRaw((byte[]) value, time);
} else if (value instanceof boolean[]) {
return setBooleanArray((boolean[]) value, time);
} else if (value instanceof long[]) {
return setIntegerArray((long[]) value, time);
} else if (value instanceof float[]) {
return setFloatArray((float[]) value, time);
} else if (value instanceof double[]) {
return setDoubleArray((double[]) value, time);
} else if (value instanceof Boolean[]) {
return setBooleanArray((Boolean[]) value, time);
} else if (value instanceof Long[]) {
return setIntegerArray((Long[]) value, time);
} else if (value instanceof Float[]) {
return setFloatArray((Float[]) value, time);
} else if (value instanceof Number[]) {
return setNumberArray((Number[]) value, time);
} else if (value instanceof String[]) {
return setStringArray((String[]) value, time);
} else {
throw new IllegalArgumentException(
return switch (value) {
case NetworkTableValue ntValue -> set(ntValue);
case Boolean v -> setBoolean(v, time);
case Long v -> setInteger(v, time);
case Float v -> setFloat(v, time);
case Number v -> setNumber(v, time);
case String v -> setString(v, time);
case byte[] v -> setRaw(v, time);
case boolean[] v -> setBooleanArray(v, time);
case long[] v -> setIntegerArray(v, time);
case float[] v -> setFloatArray(v, time);
case double[] v -> setDoubleArray(v, time);
case Boolean[] v -> setBooleanArray(v, time);
case Long[] v -> setIntegerArray(v, time);
case Float[] v -> setFloatArray(v, time);
case Number[] v -> setNumberArray(v, time);
case String[] v -> setStringArray(v, time);
default -> throw new IllegalArgumentException(
"Value of type " + value.getClass().getName() + " cannot be put into a table");
}
};
}
@@ -517,35 +501,28 @@ final class GenericEntryImpl extends EntryBase implements GenericEntry {
public boolean setDefault(NetworkTableValue defaultValue) {
long time = defaultValue.getTime();
Object otherValue = defaultValue.getValue();
switch (defaultValue.getType()) {
case BOOLEAN:
return NetworkTablesJNI.setDefaultBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER:
return NetworkTablesJNI.setDefaultInteger(
return switch (defaultValue.getType()) {
case BOOLEAN -> NetworkTablesJNI.setDefaultBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER -> NetworkTablesJNI.setDefaultInteger(
m_handle, time, ((Number) otherValue).longValue());
case FLOAT:
return NetworkTablesJNI.setDefaultFloat(
case FLOAT -> NetworkTablesJNI.setDefaultFloat(
m_handle, time, ((Number) otherValue).floatValue());
case DOUBLE:
return NetworkTablesJNI.setDefaultDouble(
case DOUBLE -> NetworkTablesJNI.setDefaultDouble(
m_handle, time, ((Number) otherValue).doubleValue());
case STRING:
return NetworkTablesJNI.setDefaultString(m_handle, time, (String) otherValue);
case RAW:
return NetworkTablesJNI.setDefaultRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY:
return NetworkTablesJNI.setDefaultBooleanArray(m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY:
return NetworkTablesJNI.setDefaultIntegerArray(m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY:
return NetworkTablesJNI.setDefaultFloatArray(m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY:
return NetworkTablesJNI.setDefaultDoubleArray(m_handle, time, (double[]) otherValue);
case STRING_ARRAY:
return NetworkTablesJNI.setDefaultStringArray(m_handle, time, (String[]) otherValue);
default:
return true;
}
case STRING -> NetworkTablesJNI.setDefaultString(m_handle, time, (String) otherValue);
case RAW -> NetworkTablesJNI.setDefaultRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY -> NetworkTablesJNI.setDefaultBooleanArray(
m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY -> NetworkTablesJNI.setDefaultIntegerArray(
m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY -> NetworkTablesJNI.setDefaultFloatArray(
m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY -> NetworkTablesJNI.setDefaultDoubleArray(
m_handle, time, (double[]) otherValue);
case STRING_ARRAY -> NetworkTablesJNI.setDefaultStringArray(
m_handle, time, (String[]) otherValue);
default -> true;
};
}
/**
@@ -557,42 +534,26 @@ final class GenericEntryImpl extends EntryBase implements GenericEntry {
*/
@Override
public boolean setDefaultValue(Object defaultValue) {
if (defaultValue instanceof NetworkTableValue) {
return setDefault((NetworkTableValue) defaultValue);
} else if (defaultValue instanceof Boolean) {
return setDefaultBoolean((Boolean) defaultValue);
} else if (defaultValue instanceof Integer) {
return setDefaultInteger((Integer) defaultValue);
} else if (defaultValue instanceof Float) {
return setDefaultFloat((Float) defaultValue);
} else if (defaultValue instanceof Number) {
return setDefaultNumber((Number) defaultValue);
} else if (defaultValue instanceof String) {
return setDefaultString((String) defaultValue);
} else if (defaultValue instanceof byte[]) {
return setDefaultRaw((byte[]) defaultValue);
} else if (defaultValue instanceof boolean[]) {
return setDefaultBooleanArray((boolean[]) defaultValue);
} else if (defaultValue instanceof long[]) {
return setDefaultIntegerArray((long[]) defaultValue);
} else if (defaultValue instanceof float[]) {
return setDefaultFloatArray((float[]) defaultValue);
} else if (defaultValue instanceof double[]) {
return setDefaultDoubleArray((double[]) defaultValue);
} else if (defaultValue instanceof Boolean[]) {
return setDefaultBooleanArray((Boolean[]) defaultValue);
} else if (defaultValue instanceof Long[]) {
return setDefaultIntegerArray((Long[]) defaultValue);
} else if (defaultValue instanceof Float[]) {
return setDefaultFloatArray((Float[]) defaultValue);
} else if (defaultValue instanceof Number[]) {
return setDefaultNumberArray((Number[]) defaultValue);
} else if (defaultValue instanceof String[]) {
return setDefaultStringArray((String[]) defaultValue);
} else {
throw new IllegalArgumentException(
return switch (defaultValue) {
case NetworkTableValue ntValue -> setDefault(ntValue);
case Boolean value -> setDefaultBoolean(value);
case Integer value -> setDefaultInteger(value);
case Float value -> setDefaultFloat(value);
case Number value -> setDefaultNumber(value);
case String value -> setDefaultString(value);
case byte[] value -> setDefaultRaw(value);
case boolean[] value -> setDefaultBooleanArray(value);
case long[] value -> setDefaultIntegerArray(value);
case float[] value -> setDefaultFloatArray(value);
case double[] value -> setDefaultDoubleArray(value);
case Boolean[] value -> setDefaultBooleanArray(value);
case Long[] value -> setDefaultIntegerArray(value);
case Float[] value -> setDefaultFloatArray(value);
case Number[] value -> setDefaultNumberArray(value);
case String[] value -> setDefaultStringArray(value);
default -> throw new IllegalArgumentException(
"Value of type " + defaultValue.getClass().getName() + " cannot be put into a table");
}
};
}

View File

@@ -338,21 +338,16 @@ public final class NetworkTableEntry implements Publisher, Subscriber {
* @return true if the data can be placed in an entry, false if it cannot
*/
public static boolean isValidDataType(Object data) {
return data instanceof Number
|| data instanceof Boolean
|| data instanceof String
|| data instanceof long[]
|| data instanceof Long[]
|| data instanceof float[]
|| data instanceof Float[]
|| data instanceof double[]
|| data instanceof Double[]
|| data instanceof Number[]
|| data instanceof boolean[]
|| data instanceof Boolean[]
|| data instanceof String[]
|| data instanceof byte[]
|| data instanceof Byte[];
return switch (data) {
case Number _, Boolean _, String _ -> true;
case byte[] _, Byte[] _ -> true;
case boolean[] _, Boolean[] _ -> true;
case long[] _, Long[] _ -> true;
case float[] _, Float[] _ -> true;
case double[] _, Double[] _, Number[] _ -> true;
case String[] _ -> true;
case null, default -> false;
};
}
/**
@@ -363,72 +358,51 @@ public final class NetworkTableEntry implements Publisher, Subscriber {
* @throws IllegalArgumentException if the value is not a known type
*/
public boolean setDefaultValue(Object defaultValue) {
if (defaultValue instanceof NetworkTableValue) {
long time = ((NetworkTableValue) defaultValue).getTime();
Object otherValue = ((NetworkTableValue) defaultValue).getValue();
switch (((NetworkTableValue) defaultValue).getType()) {
case BOOLEAN:
return NetworkTablesJNI.setDefaultBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER:
return NetworkTablesJNI.setDefaultInteger(
return switch (defaultValue) {
case NetworkTableValue ntValue -> {
long time = ntValue.getTime();
Object otherValue = ntValue.getValue();
yield switch (ntValue.getType()) {
case BOOLEAN -> NetworkTablesJNI.setDefaultBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER -> NetworkTablesJNI.setDefaultInteger(
m_handle, time, ((Number) otherValue).longValue());
case FLOAT:
return NetworkTablesJNI.setDefaultFloat(
case FLOAT -> NetworkTablesJNI.setDefaultFloat(
m_handle, time, ((Number) otherValue).floatValue());
case DOUBLE:
return NetworkTablesJNI.setDefaultDouble(
case DOUBLE -> NetworkTablesJNI.setDefaultDouble(
m_handle, time, ((Number) otherValue).doubleValue());
case STRING:
return NetworkTablesJNI.setDefaultString(m_handle, time, (String) otherValue);
case RAW:
return NetworkTablesJNI.setDefaultRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY:
return NetworkTablesJNI.setDefaultBooleanArray(m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY:
return NetworkTablesJNI.setDefaultIntegerArray(m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY:
return NetworkTablesJNI.setDefaultFloatArray(m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY:
return NetworkTablesJNI.setDefaultDoubleArray(m_handle, time, (double[]) otherValue);
case STRING_ARRAY:
return NetworkTablesJNI.setDefaultStringArray(m_handle, time, (String[]) otherValue);
default:
return true;
case STRING -> NetworkTablesJNI.setDefaultString(m_handle, time, (String) otherValue);
case RAW -> NetworkTablesJNI.setDefaultRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY -> NetworkTablesJNI.setDefaultBooleanArray(
m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY -> NetworkTablesJNI.setDefaultIntegerArray(
m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY -> NetworkTablesJNI.setDefaultFloatArray(
m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY -> NetworkTablesJNI.setDefaultDoubleArray(
m_handle, time, (double[]) otherValue);
case STRING_ARRAY -> NetworkTablesJNI.setDefaultStringArray(
m_handle, time, (String[]) otherValue);
default -> true;
};
}
} else if (defaultValue instanceof Boolean) {
return setDefaultBoolean((Boolean) defaultValue);
} else if (defaultValue instanceof Integer) {
return setDefaultInteger((Integer) defaultValue);
} else if (defaultValue instanceof Float) {
return setDefaultFloat((Float) defaultValue);
} else if (defaultValue instanceof Number) {
return setDefaultNumber((Number) defaultValue);
} else if (defaultValue instanceof String) {
return setDefaultString((String) defaultValue);
} else if (defaultValue instanceof byte[]) {
return setDefaultRaw((byte[]) defaultValue);
} else if (defaultValue instanceof boolean[]) {
return setDefaultBooleanArray((boolean[]) defaultValue);
} else if (defaultValue instanceof long[]) {
return setDefaultIntegerArray((long[]) defaultValue);
} else if (defaultValue instanceof float[]) {
return setDefaultFloatArray((float[]) defaultValue);
} else if (defaultValue instanceof double[]) {
return setDefaultDoubleArray((double[]) defaultValue);
} else if (defaultValue instanceof Boolean[]) {
return setDefaultBooleanArray((Boolean[]) defaultValue);
} else if (defaultValue instanceof Long[]) {
return setDefaultIntegerArray((Long[]) defaultValue);
} else if (defaultValue instanceof Float[]) {
return setDefaultFloatArray((Float[]) defaultValue);
} else if (defaultValue instanceof Number[]) {
return setDefaultNumberArray((Number[]) defaultValue);
} else if (defaultValue instanceof String[]) {
return setDefaultStringArray((String[]) defaultValue);
} else {
throw new IllegalArgumentException(
case Boolean value -> setDefaultBoolean(value);
case Integer value -> setDefaultInteger(value);
case Float value -> setDefaultFloat(value);
case Number value -> setDefaultNumber(value);
case String value -> setDefaultString(value);
case byte[] value -> setDefaultRaw(value);
case boolean[] value -> setDefaultBooleanArray(value);
case long[] value -> setDefaultIntegerArray(value);
case float[] value -> setDefaultFloatArray(value);
case double[] value -> setDefaultDoubleArray(value);
case Boolean[] value -> setDefaultBooleanArray(value);
case Long[] value -> setDefaultIntegerArray(value);
case Float[] value -> setDefaultFloatArray(value);
case Number[] value -> setDefaultNumberArray(value);
case String[] value -> setDefaultStringArray(value);
default -> throw new IllegalArgumentException(
"Value of type " + defaultValue.getClass().getName() + " cannot be put into a table");
}
};
}
/**
@@ -644,72 +618,51 @@ public final class NetworkTableEntry implements Publisher, Subscriber {
* @throws IllegalArgumentException if the value is not a known type
*/
public boolean setValue(Object value) {
if (value instanceof NetworkTableValue) {
long time = ((NetworkTableValue) value).getTime();
Object otherValue = ((NetworkTableValue) value).getValue();
switch (((NetworkTableValue) value).getType()) {
case BOOLEAN:
return NetworkTablesJNI.setBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER:
return NetworkTablesJNI.setInteger(
return switch (value) {
case NetworkTableValue ntValue -> {
long time = ntValue.getTime();
Object otherValue = ntValue.getValue();
yield switch (ntValue.getType()) {
case BOOLEAN -> NetworkTablesJNI.setBoolean(m_handle, time, (Boolean) otherValue);
case INTEGER -> NetworkTablesJNI.setInteger(
m_handle, time, ((Number) otherValue).longValue());
case FLOAT:
return NetworkTablesJNI.setFloat(
case FLOAT -> NetworkTablesJNI.setFloat(
m_handle, time, ((Number) otherValue).floatValue());
case DOUBLE:
return NetworkTablesJNI.setDouble(
case DOUBLE -> NetworkTablesJNI.setDouble(
m_handle, time, ((Number) otherValue).doubleValue());
case STRING:
return NetworkTablesJNI.setString(m_handle, time, (String) otherValue);
case RAW:
return NetworkTablesJNI.setRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY:
return NetworkTablesJNI.setBooleanArray(m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY:
return NetworkTablesJNI.setIntegerArray(m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY:
return NetworkTablesJNI.setFloatArray(m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY:
return NetworkTablesJNI.setDoubleArray(m_handle, time, (double[]) otherValue);
case STRING_ARRAY:
return NetworkTablesJNI.setStringArray(m_handle, time, (String[]) otherValue);
default:
return true;
case STRING -> NetworkTablesJNI.setString(m_handle, time, (String) otherValue);
case RAW -> NetworkTablesJNI.setRaw(m_handle, time, (byte[]) otherValue);
case BOOLEAN_ARRAY -> NetworkTablesJNI.setBooleanArray(
m_handle, time, (boolean[]) otherValue);
case INTEGER_ARRAY -> NetworkTablesJNI.setIntegerArray(
m_handle, time, (long[]) otherValue);
case FLOAT_ARRAY -> NetworkTablesJNI.setFloatArray(
m_handle, time, (float[]) otherValue);
case DOUBLE_ARRAY -> NetworkTablesJNI.setDoubleArray(
m_handle, time, (double[]) otherValue);
case STRING_ARRAY -> NetworkTablesJNI.setStringArray(
m_handle, time, (String[]) otherValue);
default -> true;
};
}
} else if (value instanceof Boolean) {
return setBoolean((Boolean) value);
} else if (value instanceof Long) {
return setInteger((Long) value);
} else if (value instanceof Float) {
return setFloat((Float) value);
} else if (value instanceof Number) {
return setNumber((Number) value);
} else if (value instanceof String) {
return setString((String) value);
} else if (value instanceof byte[]) {
return setRaw((byte[]) value);
} else if (value instanceof boolean[]) {
return setBooleanArray((boolean[]) value);
} else if (value instanceof long[]) {
return setIntegerArray((long[]) value);
} else if (value instanceof float[]) {
return setFloatArray((float[]) value);
} else if (value instanceof double[]) {
return setDoubleArray((double[]) value);
} else if (value instanceof Boolean[]) {
return setBooleanArray((Boolean[]) value);
} else if (value instanceof Long[]) {
return setIntegerArray((Long[]) value);
} else if (value instanceof Float[]) {
return setFloatArray((Float[]) value);
} else if (value instanceof Number[]) {
return setNumberArray((Number[]) value);
} else if (value instanceof String[]) {
return setStringArray((String[]) value);
} else {
throw new IllegalArgumentException(
case Boolean v -> setBoolean(v);
case Long v -> setInteger(v);
case Float v -> setFloat(v);
case Number v -> setNumber(v);
case String v -> setString(v);
case byte[] v -> setRaw(v);
case boolean[] v -> setBooleanArray(v);
case long[] v -> setIntegerArray(v);
case float[] v -> setFloatArray(v);
case double[] v -> setDoubleArray(v);
case Boolean[] v -> setBooleanArray(v);
case Long[] v -> setIntegerArray(v);
case Float[] v -> setFloatArray(v);
case Number[] v -> setNumberArray(v);
case String[] v -> setStringArray(v);
default -> throw new IllegalArgumentException(
"Value of type " + value.getClass().getName() + " cannot be put into a table");
}
};
}
/**