RobotCore 1.0
WPILib port to raspberry Pi
Loading...
Searching...
No Matches
Protobuf.java
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5package org.wpilib.util.protobuf;
6
7import java.lang.reflect.Array;
8import java.util.ArrayList;
9import java.util.List;
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;
17
32public interface Protobuf<T, MessageType extends ProtoMessage<?>> {
38 Class<T> getTypeClass();
39
46 default String getTypeString() {
47 return "proto:" + getDescriptor().getFullName();
48 }
49
55 Descriptor getDescriptor();
56
62 MessageType createMessage();
63
70 T unpack(MessageType msg);
71
79 void pack(MessageType msg, T value);
80
93 default void unpackInto(T out, MessageType msg) {
94 throw new UnsupportedOperationException("object does not support unpackInto");
95 }
96
103 default boolean isImmutable() {
104 return false;
105 }
106
113 default boolean isCloneable() {
114 return false;
115 }
116
126 default T clone(T obj) throws CloneNotSupportedException {
127 throw new CloneNotSupportedException();
128 }
129
136 default void forEachDescriptor(Predicate<String> exists, BiConsumer<String, byte[]> fn) {
137 forEachDescriptorImpl(getDescriptor().getFile(), exists, fn);
138 }
139
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)) {
144 return;
145 }
146 for (FileDescriptor dep : desc.getDependencies()) {
147 forEachDescriptorImpl(dep, exists, fn);
148 }
149 fn.accept(name, desc.toProtoBytes());
150 }
151
161 static <T, MessageType extends ProtoMessage<MessageType>> T[] unpackArray(
162 RepeatedMessage<MessageType> msg, Protobuf<T, MessageType> proto) {
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));
167 }
168 return result;
169 }
170
177 static double[] unpackArray(RepeatedDouble msg) {
178 double[] result = new double[msg.length()];
179 for (int i = 0; i < result.length; i++) {
180 result[i] = msg.get(i);
181 }
182 return result;
183 }
184
194 static <T, MessageType extends ProtoMessage<MessageType>> List<T> unpackList(
195 RepeatedMessage<MessageType> msg, Protobuf<T, MessageType> proto) {
196 ArrayList<T> result = new ArrayList<>(msg.length());
197 for (var item : msg) {
198 result.add(proto.unpack(item));
199 }
200 return result;
201 }
202
212 static <T, MessageType extends ProtoMessage<MessageType>> void packArray(
213 RepeatedMessage<MessageType> msg, T[] arr, Protobuf<T, MessageType> proto) {
214 msg.clear();
215 msg.reserve(arr.length);
216 for (var obj : arr) {
217 proto.pack(msg.next(), obj);
218 }
219 }
220
227 static void packArray(RepeatedDouble msg, double[] arr) {
228 msg.clear();
229 msg.reserve(arr.length);
230 msg.addAll(arr);
231 }
232
242 static <T, MessageType extends ProtoMessage<MessageType>> void packList(
243 RepeatedMessage<MessageType> msg, List<T> list, Protobuf<T, MessageType> proto) {
244 msg.clear();
245 msg.reserve(list.size());
246 for (var obj : list) {
247 proto.pack(msg.next(), obj);
248 }
249 }
250}
static void packArray(RepeatedDouble msg, double[] arr)
default void forEachDescriptor(Predicate< String > exists, BiConsumer< String, byte[]> fn)
static double[] unpackArray(RepeatedDouble msg)
default void unpackInto(T out, MessageType msg)
Definition Protobuf.java:93
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)
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)