-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
With the current API, it is 'tricky' to append byte[]s to an instance of RepeatedBytes without a copy.
The pattern is more or less like
void transfer(RepeatedBytes rb, Collection<byte[]> values) {
rb.reserve(values.size());
for(var value: values) {
rb.next().setInternalArray(value).
}
}It would by nice to have something like
public final void addInternal(RepeatedByte value) {
reserve(1);
array[length++] = value;
}
public final void addInternal(byte[] value) {
addInternal(RepeatedByte.newEmptyInstance().setInternalArray(value));
}
public final void setInternal(int index, RepeatedByte value) {
checkIndex(index);
array[index] = value;
}
public final void setInternal(int index, byte[] value) {
setInternal(index,RepeatedByte.newEmptyInstance().setInternalArray(value));
}When working with direct buffers, we must manifest a byte[] copy to transfer contents to a Message instance. Even though it is possible to avoid a second copy in RepeatedByte via setInternalArray, the same cannot be done in RepeatedBytes. Perhaps some helpers such as
static final byte[] copy(ByteBuffer value) {
var rv = new byte[value.remaining()];
buffer.duplicate().get(rv);
return rv;
}
public final void add(ByteBuffer value) {
addInternal(copy(value));
}
public final void setInternal(int index, ByteBuffer value) {
setInternal(index, copy(value));
}could be useful too.
Metadata
Metadata
Assignees
Labels
No labels