RepeatedFieldBuilderV3.java
Go to the documentation of this file.
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import static com.google.protobuf.Internal.checkNotNull;
34 
35 import java.util.AbstractList;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.List;
40 
62  MType extends AbstractMessage,
63  BType extends AbstractMessage.Builder,
64  IType extends MessageOrBuilder>
65  implements AbstractMessage.BuilderParent {
66 
67  // Parent to send changes to.
69 
70  // List of messages. Never null. It may be immutable, in which case
71  // isMessagesListMutable will be false. See note below.
72  private List<MType> messages;
73 
74  // Whether messages is an mutable array that can be modified.
75  private boolean isMessagesListMutable;
76 
77  // List of builders. May be null, in which case, no nested builders were
78  // created. If not null, entries represent the builder for that index.
79  private List<SingleFieldBuilderV3<MType, BType, IType>> builders;
80 
81  // Here are the invariants for messages and builders:
82  // 1. messages is never null and its count corresponds to the number of items
83  // in the repeated field.
84  // 2. If builders is non-null, messages and builders MUST always
85  // contain the same number of items.
86  // 3. Entries in either array can be null, but for any index, there MUST be
87  // either a Message in messages or a builder in builders.
88  // 4. If the builder at an index is non-null, the builder is
89  // authoritative. This is the case where a Builder was set on the index.
90  // Any message in the messages array MUST be ignored.
91  // t. If the builder at an index is null, the message in the messages
92  // list is authoritative. This is the case where a Message (not a Builder)
93  // was set directly for an index.
94 
95  // Indicates that we've built a message and so we are now obligated
96  // to dispatch dirty invalidations. See AbstractMessage.BuilderListener.
97  private boolean isClean;
98 
99  // A view of this builder that exposes a List interface of messages. This is
100  // initialized on demand. This is fully backed by this object and all changes
101  // are reflected in it. Access to any item converts it to a message if it
102  // was a builder.
103  private MessageExternalList<MType, BType, IType> externalMessageList;
104 
105  // A view of this builder that exposes a List interface of builders. This is
106  // initialized on demand. This is fully backed by this object and all changes
107  // are reflected in it. Access to any item converts it to a builder if it
108  // was a message.
109  private BuilderExternalList<MType, BType, IType> externalBuilderList;
110 
111  // A view of this builder that exposes a List interface of the interface
112  // implemented by messages and builders. This is initialized on demand. This
113  // is fully backed by this object and all changes are reflected in it.
114  // Access to any item returns either a builder or message depending on
115  // what is most efficient.
116  private MessageOrBuilderExternalList<MType, BType, IType> externalMessageOrBuilderList;
117 
127  List<MType> messages,
128  boolean isMessagesListMutable,
130  boolean isClean) {
131  this.messages = messages;
132  this.isMessagesListMutable = isMessagesListMutable;
133  this.parent = parent;
134  this.isClean = isClean;
135  }
136 
137  public void dispose() {
138  // Null out parent so we stop sending it invalidations.
139  parent = null;
140  }
141 
146  private void ensureMutableMessageList() {
147  if (!isMessagesListMutable) {
148  messages = new ArrayList<MType>(messages);
149  isMessagesListMutable = true;
150  }
151  }
152 
157  private void ensureBuilders() {
158  if (this.builders == null) {
159  this.builders = new ArrayList<SingleFieldBuilderV3<MType, BType, IType>>(messages.size());
160  for (int i = 0; i < messages.size(); i++) {
161  builders.add(null);
162  }
163  }
164  }
165 
171  public int getCount() {
172  return messages.size();
173  }
174 
180  public boolean isEmpty() {
181  return messages.isEmpty();
182  }
183 
192  public MType getMessage(int index) {
193  return getMessage(index, false);
194  }
195 
206  private MType getMessage(int index, boolean forBuild) {
207  if (this.builders == null) {
208  // We don't have any builders -- return the current Message.
209  // This is the case where no builder was created, so we MUST have a
210  // Message.
211  return messages.get(index);
212  }
213 
215  if (builder == null) {
216  // We don't have a builder -- return the current message.
217  // This is the case where no builder was created for the entry at index,
218  // so we MUST have a message.
219  return messages.get(index);
220 
221  } else {
222  return forBuild ? builder.build() : builder.getMessage();
223  }
224  }
225 
233  public BType getBuilder(int index) {
234  ensureBuilders();
236  if (builder == null) {
237  MType message = messages.get(index);
239  builders.set(index, builder);
240  }
241  return builder.getBuilder();
242  }
243 
251  @SuppressWarnings("unchecked")
252  public IType getMessageOrBuilder(int index) {
253  if (this.builders == null) {
254  // We don't have any builders -- return the current Message.
255  // This is the case where no builder was created, so we MUST have a
256  // Message.
257  return (IType) messages.get(index);
258  }
259 
261  if (builder == null) {
262  // We don't have a builder -- return the current message.
263  // This is the case where no builder was created for the entry at index,
264  // so we MUST have a message.
265  return (IType) messages.get(index);
266 
267  } else {
268  return builder.getMessageOrBuilder();
269  }
270  }
271 
280  checkNotNull(message);
282  messages.set(index, message);
283  if (builders != null) {
285  if (entry != null) {
286  entry.dispose();
287  }
288  }
289  onChanged();
291  return this;
292  }
293 
301  checkNotNull(message);
303  messages.add(message);
304  if (builders != null) {
305  builders.add(null);
306  }
307  onChanged();
309  return this;
310  }
311 
322  checkNotNull(message);
324  messages.add(index, message);
325  if (builders != null) {
326  builders.add(index, null);
327  }
328  onChanged();
330  return this;
331  }
332 
341  Iterable<? extends MType> values) {
342  for (final MType value : values) {
343  checkNotNull(value);
344  }
345 
346  // If we can inspect the size, we can more efficiently add messages.
347  int size = -1;
348  if (values instanceof Collection) {
349  @SuppressWarnings("unchecked")
350  final Collection<MType> collection = (Collection<MType>) values;
351  if (collection.size() == 0) {
352  return this;
353  }
354  size = collection.size();
355  }
357 
358  if (size >= 0 && messages instanceof ArrayList) {
359  ((ArrayList<MType>) messages).ensureCapacity(messages.size() + size);
360  }
361 
362  for (MType value : values) {
363  addMessage(value);
364  }
365 
366  onChanged();
368  return this;
369  }
370 
377  public BType addBuilder(MType message) {
379  ensureBuilders();
382  messages.add(null);
383  builders.add(builder);
384  onChanged();
386  return builder.getBuilder();
387  }
388 
397  public BType addBuilder(int index, MType message) {
399  ensureBuilders();
402  messages.add(index, null);
403  builders.add(index, builder);
404  onChanged();
406  return builder.getBuilder();
407  }
408 
416  public void remove(int index) {
418  messages.remove(index);
419  if (builders != null) {
421  if (entry != null) {
422  entry.dispose();
423  }
424  }
425  onChanged();
427  }
428 
430  public void clear() {
431  messages = Collections.emptyList();
432  isMessagesListMutable = false;
433  if (builders != null) {
435  if (entry != null) {
436  entry.dispose();
437  }
438  }
439  builders = null;
440  }
441  onChanged();
443  }
444 
450  public List<MType> build() {
451  // Now that build has been called, we are required to dispatch
452  // invalidations.
453  isClean = true;
454 
455  if (!isMessagesListMutable && builders == null) {
456  // We still have an immutable list and we never created a builder.
457  return messages;
458  }
459 
460  boolean allMessagesInSync = true;
461  if (!isMessagesListMutable) {
462  // We still have an immutable list. Let's see if any of them are out
463  // of sync with their builders.
464  for (int i = 0; i < messages.size(); i++) {
465  Message message = messages.get(i);
467  if (builder != null) {
468  if (builder.build() != message) {
469  allMessagesInSync = false;
470  break;
471  }
472  }
473  }
474  if (allMessagesInSync) {
475  // Immutable list is still in sync.
476  return messages;
477  }
478  }
479 
480  // Need to make sure messages is up to date
482  for (int i = 0; i < messages.size(); i++) {
483  messages.set(i, getMessage(i, true));
484  }
485 
486  // We're going to return our list as immutable so we mark that we can
487  // no longer update it.
488  messages = Collections.unmodifiableList(messages);
489  isMessagesListMutable = false;
490  return messages;
491  }
492 
499  public List<MType> getMessageList() {
500  if (externalMessageList == null) {
501  externalMessageList = new MessageExternalList<MType, BType, IType>(this);
502  }
503  return externalMessageList;
504  }
505 
512  public List<BType> getBuilderList() {
513  if (externalBuilderList == null) {
514  externalBuilderList = new BuilderExternalList<MType, BType, IType>(this);
515  }
516  return externalBuilderList;
517  }
518 
525  public List<IType> getMessageOrBuilderList() {
526  if (externalMessageOrBuilderList == null) {
527  externalMessageOrBuilderList = new MessageOrBuilderExternalList<MType, BType, IType>(this);
528  }
530  }
531 
536  private void onChanged() {
537  if (isClean && parent != null) {
538  parent.markDirty();
539 
540  // Don't keep dispatching invalidations until build is called again.
541  isClean = false;
542  }
543  }
544 
545  @Override
546  public void markDirty() {
547  onChanged();
548  }
549 
554  private void incrementModCounts() {
555  if (externalMessageList != null) {
556  externalMessageList.incrementModCount();
557  }
558  if (externalBuilderList != null) {
559  externalBuilderList.incrementModCount();
560  }
561  if (externalMessageOrBuilderList != null) {
562  externalMessageOrBuilderList.incrementModCount();
563  }
564  }
565 
573  private static class MessageExternalList<
574  MType extends AbstractMessage,
575  BType extends AbstractMessage.Builder,
576  IType extends MessageOrBuilder>
577  extends AbstractList<MType> implements List<MType> {
578 
580 
582  this.builder = builder;
583  }
584 
585  @Override
586  public int size() {
587  return this.builder.getCount();
588  }
589 
590  @Override
591  public MType get(int index) {
592  return builder.getMessage(index);
593  }
594 
595  void incrementModCount() {
596  modCount++;
597  }
598  }
599 
607  private static class BuilderExternalList<
608  MType extends AbstractMessage,
609  BType extends AbstractMessage.Builder,
610  IType extends MessageOrBuilder>
611  extends AbstractList<BType> implements List<BType> {
612 
614 
616  this.builder = builder;
617  }
618 
619  @Override
620  public int size() {
621  return this.builder.getCount();
622  }
623 
624  @Override
625  public BType get(int index) {
626  return builder.getBuilder(index);
627  }
628 
629  void incrementModCount() {
630  modCount++;
631  }
632  }
633 
641  private static class MessageOrBuilderExternalList<
642  MType extends AbstractMessage,
643  BType extends AbstractMessage.Builder,
644  IType extends MessageOrBuilder>
645  extends AbstractList<IType> implements List<IType> {
646 
648 
650  this.builder = builder;
651  }
652 
653  @Override
654  public int size() {
655  return this.builder.getCount();
656  }
657 
658  @Override
659  public IType get(int index) {
660  return builder.getMessageOrBuilder(index);
661  }
662 
663  void incrementModCount() {
664  modCount++;
665  }
666  }
667 }
com.google.protobuf.RepeatedFieldBuilderV3.RepeatedFieldBuilderV3
RepeatedFieldBuilderV3(List< MType > messages, boolean isMessagesListMutable, AbstractMessage.BuilderParent parent, boolean isClean)
Definition: RepeatedFieldBuilderV3.java:126
com.google.protobuf.RepeatedFieldBuilderV3.setMessage
RepeatedFieldBuilderV3< MType, BType, IType > setMessage(int index, MType message)
Definition: RepeatedFieldBuilderV3.java:279
com.google.protobuf.RepeatedFieldBuilderV3.dispose
void dispose()
Definition: RepeatedFieldBuilderV3.java:137
com.google.protobuf.RepeatedFieldBuilderV3.getMessage
MType getMessage(int index)
Definition: RepeatedFieldBuilderV3.java:192
com.google.protobuf.RepeatedFieldBuilderV3.getMessageOrBuilder
IType getMessageOrBuilder(int index)
Definition: RepeatedFieldBuilderV3.java:252
com.google.protobuf.RepeatedFieldBuilderV3.getBuilderList
List< BType > getBuilderList()
Definition: RepeatedFieldBuilderV3.java:512
com.google.protobuf.SingleFieldBuilderV3.getMessage
MType getMessage()
Definition: SingleFieldBuilderV3.java:98
com.google.protobuf.SingleFieldBuilderV3.build
MType build()
Definition: SingleFieldBuilderV3.java:111
com.google.protobuf.RepeatedFieldBuilderV3.externalMessageList
MessageExternalList< MType, BType, IType > externalMessageList
Definition: RepeatedFieldBuilderV3.java:103
com.google.protobuf.RepeatedFieldBuilderV3.onChanged
void onChanged()
Definition: RepeatedFieldBuilderV3.java:536
com.google.protobuf.RepeatedFieldBuilderV3.MessageOrBuilderExternalList
Definition: RepeatedFieldBuilderV3.java:641
com.google.protobuf.RepeatedFieldBuilderV3.addAllMessages
RepeatedFieldBuilderV3< MType, BType, IType > addAllMessages(Iterable<? extends MType > values)
Definition: RepeatedFieldBuilderV3.java:340
com.google.protobuf.RepeatedFieldBuilderV3.getMessageList
List< MType > getMessageList()
Definition: RepeatedFieldBuilderV3.java:499
com.google.protobuf.RepeatedFieldBuilderV3.getBuilder
BType getBuilder(int index)
Definition: RepeatedFieldBuilderV3.java:233
com.google.protobuf.RepeatedFieldBuilderV3.isEmpty
boolean isEmpty()
Definition: RepeatedFieldBuilderV3.java:180
com.google.protobuf
Definition: ProtoCaliperBenchmark.java:2
com.google.protobuf.RepeatedFieldBuilderV3.externalBuilderList
BuilderExternalList< MType, BType, IType > externalBuilderList
Definition: RepeatedFieldBuilderV3.java:109
com.google.protobuf.RepeatedFieldBuilderV3.isMessagesListMutable
boolean isMessagesListMutable
Definition: RepeatedFieldBuilderV3.java:75
com.google.protobuf.RepeatedFieldBuilderV3.ensureBuilders
void ensureBuilders()
Definition: RepeatedFieldBuilderV3.java:157
com.google.protobuf.RepeatedFieldBuilderV3.addBuilder
BType addBuilder(int index, MType message)
Definition: RepeatedFieldBuilderV3.java:397
com.google.protobuf.RepeatedFieldBuilderV3.markDirty
void markDirty()
Definition: RepeatedFieldBuilderV3.java:546
values
GLenum GLsizei GLsizei GLint * values
Definition: glcorearb.h:3591
com.google.protobuf.SingleFieldBuilderV3.dispose
void dispose()
Definition: SingleFieldBuilderV3.java:85
com.google.protobuf.RepeatedFieldBuilderV3.getMessage
MType getMessage(int index, boolean forBuild)
Definition: RepeatedFieldBuilderV3.java:206
com.google.protobuf.RepeatedFieldBuilderV3.build
List< MType > build()
Definition: RepeatedFieldBuilderV3.java:450
com.google.protobuf.RepeatedFieldBuilderV3.MessageExternalList.size
int size()
Definition: RepeatedFieldBuilderV3.java:586
com.google.protobuf.RepeatedFieldBuilderV3.addBuilder
BType addBuilder(MType message)
Definition: RepeatedFieldBuilderV3.java:377
com.google.protobuf.RepeatedFieldBuilderV3.externalMessageOrBuilderList
MessageOrBuilderExternalList< MType, BType, IType > externalMessageOrBuilderList
Definition: RepeatedFieldBuilderV3.java:116
com.google.protobuf.MessageOrBuilder
Definition: MessageOrBuilder.java:42
size
#define size
Definition: glcorearb.h:2944
com.google.protobuf.RepeatedFieldBuilderV3.clear
void clear()
Definition: RepeatedFieldBuilderV3.java:430
com.google.protobuf.RepeatedFieldBuilderV3
Definition: RepeatedFieldBuilderV3.java:61
com.google.protobuf.RepeatedFieldBuilderV3.addMessage
RepeatedFieldBuilderV3< MType, BType, IType > addMessage(int index, MType message)
Definition: RepeatedFieldBuilderV3.java:321
com.google.protobuf.RepeatedFieldBuilderV3.builders
List< SingleFieldBuilderV3< MType, BType, IType > > builders
Definition: RepeatedFieldBuilderV3.java:79
com.google.protobuf.SingleFieldBuilderV3.getBuilder
BType getBuilder()
Definition: SingleFieldBuilderV3.java:125
com.google.protobuf.RepeatedFieldBuilderV3.MessageExternalList
Definition: RepeatedFieldBuilderV3.java:573
Builder
Definition: ruby/ext/google/protobuf_c/protobuf.h:162
i
int i
Definition: gmock-matchers_test.cc:764
java
com.google.protobuf.RepeatedFieldBuilderV3.MessageOrBuilderExternalList.size
int size()
Definition: RepeatedFieldBuilderV3.java:654
com.google.protobuf.RepeatedFieldBuilderV3.addMessage
RepeatedFieldBuilderV3< MType, BType, IType > addMessage(MType message)
Definition: RepeatedFieldBuilderV3.java:300
size
GLsizeiptr size
Definition: glcorearb.h:2943
com.google.protobuf.RepeatedFieldBuilderV3.BuilderExternalList
Definition: RepeatedFieldBuilderV3.java:607
com.google.protobuf.RepeatedFieldBuilderV3.messages
List< MType > messages
Definition: RepeatedFieldBuilderV3.java:72
com.google
com.google.protobuf.RepeatedFieldBuilderV3.ensureMutableMessageList
void ensureMutableMessageList()
Definition: RepeatedFieldBuilderV3.java:146
com
com.google.protobuf.SingleFieldBuilderV3
Definition: SingleFieldBuilderV3.java:55
com.google.protobuf.RepeatedFieldBuilderV3.getMessageOrBuilderList
List< IType > getMessageOrBuilderList()
Definition: RepeatedFieldBuilderV3.java:525
com.google.protobuf.AbstractMessage
Definition: AbstractMessage.java:52
com.google.protobuf.RepeatedFieldBuilderV3.incrementModCounts
void incrementModCounts()
Definition: RepeatedFieldBuilderV3.java:554
com.google.protobuf.Internal
Definition: Internal.java:54
com.google.protobuf.AbstractMessage.BuilderParent
Definition: AbstractMessage.java:65
com.google.protobuf.SingleFieldBuilderV3.getMessageOrBuilder
IType getMessageOrBuilder()
Definition: SingleFieldBuilderV3.java:145
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
index
GLuint index
Definition: glcorearb.h:3055
com.google.protobuf.RepeatedFieldBuilderV3.getCount
int getCount()
Definition: RepeatedFieldBuilderV3.java:171
message
GLenum GLuint GLenum GLsizei const GLchar * message
Definition: glcorearb.h:2695
com.google.protobuf.Message
Definition: Message.java:50
com.google.protobuf.RepeatedFieldBuilderV3.parent
AbstractMessage.BuilderParent parent
Definition: RepeatedFieldBuilderV3.java:68
com.google.protobuf.RepeatedFieldBuilderV3.BuilderExternalList.size
int size()
Definition: RepeatedFieldBuilderV3.java:620
com.google.protobuf.RepeatedFieldBuilderV3.isClean
boolean isClean
Definition: RepeatedFieldBuilderV3.java:97


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58