From 9dabcb99f3d1c66c848359e827abbdf017e1c390 Mon Sep 17 00:00:00 2001 From: Alan Everett Date: Wed, 1 Jul 2026 23:03:06 -0700 Subject: [PATCH] [wpiutil] Add protobuf List pack/unpack for Java (#9042) To aid in simplifying the packing/unpacking of Lists to protobuf, this adds helper methods that put the iteration logic in `Protobuf.java`, similar to arrays. This makes packing/unpacking a List a single line, similar to other types. Useful for #8776 and #8172. --- .../trajectory/proto/TrajectoryProto.java | 14 +------ .../org/wpilib/util/protobuf/Protobuf.java | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/wpimath/src/main/java/org/wpilib/math/trajectory/proto/TrajectoryProto.java b/wpimath/src/main/java/org/wpilib/math/trajectory/proto/TrajectoryProto.java index df132f8c04..f1c55475e5 100644 --- a/wpimath/src/main/java/org/wpilib/math/trajectory/proto/TrajectoryProto.java +++ b/wpimath/src/main/java/org/wpilib/math/trajectory/proto/TrajectoryProto.java @@ -4,9 +4,7 @@ package org.wpilib.math.trajectory.proto; -import java.util.ArrayList; import org.wpilib.math.proto.ProtobufTrajectory; -import org.wpilib.math.proto.ProtobufTrajectoryState; import org.wpilib.math.trajectory.Trajectory; import org.wpilib.util.protobuf.Protobuf; import us.hebi.quickbuf.Descriptors.Descriptor; @@ -29,19 +27,11 @@ public class TrajectoryProto implements Protobuf @Override public Trajectory unpack(ProtobufTrajectory msg) { - ArrayList states = new ArrayList<>(msg.getStates().length()); - for (ProtobufTrajectoryState protoState : msg.getStates()) { - states.add(Trajectory.State.proto.unpack(protoState)); - } - - return new Trajectory(states); + return new Trajectory(Protobuf.unpackList(msg.getStates(), Trajectory.State.proto)); } @Override public void pack(ProtobufTrajectory msg, Trajectory value) { - var states = msg.getMutableStates().reserve(value.getStates().size()); - for (var item : value.getStates()) { - Trajectory.State.proto.pack(states.next(), item); - } + Protobuf.packList(msg.getMutableStates(), value.getStates(), Trajectory.State.proto); } } diff --git a/wpiutil/src/main/java/org/wpilib/util/protobuf/Protobuf.java b/wpiutil/src/main/java/org/wpilib/util/protobuf/Protobuf.java index 2fc1378f40..57968a43b0 100644 --- a/wpiutil/src/main/java/org/wpilib/util/protobuf/Protobuf.java +++ b/wpiutil/src/main/java/org/wpilib/util/protobuf/Protobuf.java @@ -5,6 +5,8 @@ package org.wpilib.util.protobuf; import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiConsumer; import java.util.function.Predicate; import us.hebi.quickbuf.Descriptors.Descriptor; @@ -180,6 +182,24 @@ public interface Protobuf> { return result; } + /** + * Unpack a serialized protobuf array message to a list. + * + * @param object type + * @param element type of the protobuf array + * @param msg protobuf array message + * @param proto protobuf implementation + * @return Deserialized list + */ + static > List unpackList( + RepeatedMessage msg, Protobuf proto) { + ArrayList result = new ArrayList<>(msg.length()); + for (var item : msg) { + result.add(proto.unpack(item)); + } + return result; + } + /** * Pack a serialized protobuf array message. * @@ -209,4 +229,22 @@ public interface Protobuf> { msg.reserve(arr.length); msg.addAll(arr); } + + /** + * Pack a serialized protobuf array message to a list. + * + * @param object type + * @param element type of the protobuf array + * @param msg protobuf array message + * @param list list of objects + * @param proto protobuf implementation + */ + static > void packList( + RepeatedMessage msg, List list, Protobuf proto) { + msg.clear(); + msg.reserve(list.size()); + for (var obj : list) { + proto.pack(msg.next(), obj); + } + } }