5package org.wpilib.util.protobuf;
7import java.lang.reflect.Array;
8import java.util.ArrayList;
10import java.util.function.BiConsumer;
11import java.util.function.Predicate;
12import us.hebi.quickbuf.Descriptors.Descriptor;
13import us.hebi.quickbuf.Descriptors.FileDescriptor;
14import us.hebi.quickbuf.ProtoMessage;
15import us.hebi.quickbuf.RepeatedDouble;
16import us.hebi.quickbuf.RepeatedMessage;
32public interface Protobuf<T, MessageType
extends ProtoMessage<?>> {
79 void pack(MessageType msg, T value);
94 throw new UnsupportedOperationException(
"object does not support unpackInto");
126 default T
clone(T obj)
throws CloneNotSupportedException {
127 throw new CloneNotSupportedException();
137 forEachDescriptorImpl(
getDescriptor().getFile(), exists, fn);
140 private static void forEachDescriptorImpl(
141 FileDescriptor desc, Predicate<String> exists, BiConsumer<String,
byte[]> fn) {
142 String name =
"proto:" + desc.getFullName();
143 if (exists.test(name)) {
146 for (FileDescriptor dep : desc.getDependencies()) {
147 forEachDescriptorImpl(dep, exists, fn);
149 fn.accept(name, desc.toProtoBytes());
161 static <T, MessageType extends ProtoMessage<MessageType>> T[]
unpackArray(
163 @SuppressWarnings(
"unchecked")
164 T[] result = (T[]) Array.newInstance(proto.
getTypeClass(), msg.length());
165 for (
int i = 0; i < result.length; i++) {
166 result[i] = proto.
unpack(msg.get(i));
178 double[] result =
new double[msg.length()];
179 for (
int i = 0; i < result.length; i++) {
180 result[i] = msg.get(i);
194 static <T, MessageType extends ProtoMessage<MessageType>> List<T>
unpackList(
196 ArrayList<T> result =
new ArrayList<>(msg.length());
197 for (var item : msg) {
198 result.add(proto.
unpack(item));
212 static <T, MessageType extends ProtoMessage<MessageType>>
void packArray(
215 msg.reserve(arr.length);
216 for (var obj : arr) {
217 proto.
pack(msg.next(), obj);
227 static void packArray(RepeatedDouble msg,
double[] arr) {
229 msg.reserve(arr.length);
242 static <T, MessageType extends ProtoMessage<MessageType>>
void packList(
245 msg.reserve(list.size());
246 for (var obj : list) {
247 proto.
pack(msg.next(), obj);
Descriptor getDescriptor()
static void packArray(RepeatedDouble msg, double[] arr)
default void forEachDescriptor(Predicate< String > exists, BiConsumer< String, byte[]> fn)
default String getTypeString()
static double[] unpackArray(RepeatedDouble msg)
default boolean isImmutable()
T unpack(MessageType msg)
Class< T > getTypeClass()
default void unpackInto(T out, MessageType msg)
static< T, MessageType extends ProtoMessage< MessageType > > T[] unpackArray(RepeatedMessage< MessageType > msg, Protobuf< T, MessageType > proto)
static< T, MessageType extends ProtoMessage< MessageType > > List< T > unpackList(RepeatedMessage< MessageType > msg, Protobuf< T, MessageType > proto)
MessageType createMessage()
static< T, MessageType extends ProtoMessage< MessageType > > void packList(RepeatedMessage< MessageType > msg, List< T > list, Protobuf< T, MessageType > proto)
static< T, MessageType extends ProtoMessage< MessageType > > void packArray(RepeatedMessage< MessageType > msg, T[] arr, Protobuf< T, MessageType > proto)
void pack(MessageType msg, T value)
default boolean isCloneable()