#include <google/protobuf/repeated_field.h>
namespace google::protobuf
RepeatedField e RepeatedPtrField são usados por classes de mensagem de protocolo geradas para manipular campos repetidos.
Essas classes são muito semelhantes aos vetores do STL, mas incluem várias otimizações úteis principalmente no caso dos buffers de protocolo. RepeatedPtrField é particularmente diferente do vetor STL porque gerencia a propriedade dos ponteiros que ele contém.
Normalmente, os clientes não precisam acessar objetos RepeatedField diretamente, mas precisam usar as funções de acessador geradas automaticamente pelo compilador de protocolo.
Turmas neste arquivo | |
---|---|
O RepeatedField é usado para representar campos repetidos de um tipo primitivo (em outras palavras, tudo, exceto strings e mensagens aninhadas). | |
RepeatedPtrField é como o RepeatedField, mas é usado para strings repetidas ou Mensagens. |
Participantes do arquivoEssas definições não fazem parte de nenhuma classe. | |
---|---|
template internal::RepeatedFieldBackInsertIterator< T > | RepeatedFieldBackInserter(RepeatedField< T > *const mutable_field) Fornece um iterador de inserção para instâncias RepeatedField, semelhante a std::back_inserter(). |
template internal::RepeatedPtrFieldBackInsertIterator< T > | RepeatedPtrFieldBackInserter(RepeatedPtrField< T > *const mutable_field) Fornece um iterador de inserção posterior para instâncias RepeatedPtrField, semelhante a std::back_inserter(). |
template internal::RepeatedPtrFieldBackInsertIterator< T > | RepeatedFieldBackInserter(RepeatedPtrField< T > *const mutable_field) Iterador de inserção especial de retorno para instâncias de RepeatedPtrField, caso uma pessoa queira escrever um código de modelo genérico que possa acessar "RepeatedFields" e "RepeatedPtrFields" usando um nome comum. |
template internal::AllocatedRepeatedPtrFieldBackInsertIterator< T > | AllocatedRepeatedPtrFieldBackInserter(RepeatedPtrField< T > *const mutable_field) Fornece um iterador de inserção posterior para instâncias de RepeatedPtrField semelhante a std::back_inserter(), que transfere a propriedade ao copiar elementos. |
template internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T > | UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(RepeatedPtrField< T > *const mutable_field) Semelhante a AggregatedRepeatedPtrFieldBackInserter, usando UnsafeArenaAdd passará d em vez de AddAloced. mais… |
template internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T >
protobuf::UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
RepeatedPtrField< T > *const mutable_field)
protobuf::UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
RepeatedPtrField< T > *const mutable_field)
Semelhante a AggregatedRepeatedPtrFieldBackInserter, usando UnsafeArenaAdd passará d em vez de AddAloced.
Isso é um pouco mais rápido se for importante. Ele também é útil em códigos legados que usam propriedade temporária para evitar cópias. Exemplo:
RepeatedPtrField<T> temp_field; temp_field.AddAllocated(new T); ... // Do something with temp_field temp_field.ExtractSubrange(0, temp_field.size(), nullptr);
Se você colocar temp_field na arena, isso falhará, porque a propriedade será transferida para a arena na chamada "AddDistributed" e não será mais liberada, causando uma exclusão dupla. Isso vai impedir isso.
classe de modelo RepitaedField
#include <google/protobuf/repeated_field.h>
namespace google::protobuf
template <typename >
O RepeatedField é usado para representar campos repetidos de um tipo primitivo (em outras palavras, tudo, exceto strings e mensagens aninhadas).
A maioria dos usuários nunca usará um RepeatedField diretamente. Eles usarão o get-by-index, o set por índice e os acessadores gerados para todos os campos repetidos.
Participantes | |
---|---|
typedef | Element * iterator Compatibilidade com iterador semelhante a STL. |
typedef | const Element * const_iterator |
typedef | Element value_type |
typedef | value_type & reference |
typedef | const value_type & const_reference |
typedef | value_type * pointer |
typedef | const value_type * const_pointer |
typedef | int size_type |
typedef | ptrdiff_t difference_type |
typedef | std::reverse_iterator< const_iterator > const_reverse_iterator Compatibilidade com iterador reverso. |
typedef | std::reverse_iterator< iterator > reverse_iterator |
constexpr | RepeatedField() |
explicit | RepeatedField(Arena * arena) |
| RepeatedField(const RepeatedField & other) |
template | RepeatedField(Iter begin, Iter end) |
| ~RepeatedField() |
RepeatedField & | operator=(const RepeatedField & other) |
| RepeatedField(RepeatedField && other) |
RepeatedField & | operator=(RepeatedField && other) |
bool | empty() const |
int | size() const |
const Element & | Get(int index) const |
Element * | Mutable(int index) |
const Element & | operator[](int index) const |
Element & | operator[](int index) |
const Element & | at(int index) const |
Element & | at(int index) |
void | Set(int index, const Element & value) |
void | Add(const Element & value) |
Element * | Add() Anexa um novo elemento e retorna um ponteiro para ele. mais… |
template void | Add(Iter begin, Iter end) Anexe elementos no intervalo [[]begin, end) depois de reservar o número adequado de elementos. |
void | RemoveLast() Remova o último elemento da matriz. |
void | ExtractSubrange(int start, int num, Element * elements) Extrair elementos com índices em "[[]start .. start+num-1]". mais… |
void | Clear() |
void | MergeFrom(const RepeatedField & other) |
void | CopyFrom(const RepeatedField & other) |
template void | Assign(Iter begin, Iter end) Substitui o conteúdo porRepeatedField(begin, end). |
void | Reserve(int new_size) Reserve espaço para expandir o campo até o tamanho especificado. mais… |
void | Truncate(int new_size) Redimensione o RepeatedField para um tamanho menor e novo. Isso é O(1). |
void | AddAlreadyReserved(const Element & value) |
Element * | AddAlreadyReserved() Anexa um novo elemento e retorna um ponteiro para ele. mais… |
Element * | AddNAlreadyReserved(int elements) |
int | Capacity() const |
void | Resize(int new_size, const Element & value) Como o redimensionamento do STL. mais… |
Element * | mutable_data() Recebe a matriz subjacente. mais… |
const Element * | data() const |
void | Swap(RepeatedField * other) Troque todo o conteúdo por "outro". mais… |
void | UnsafeArenaSwap(RepeatedField * other) Troque todo o conteúdo por "outro". mais… |
void | SwapElements(int index1, int index2) Troque dois elementos. |
iterator | begin() |
const_iterator | begin() const |
const_iterator | cbegin() const |
iterator | end() |
const_iterator | end() const |
const_iterator | cend() const |
reverse_iterator | rbegin() |
const_reverse_iterator | rbegin() const |
reverse_iterator | rend() |
const_reverse_iterator | rend() const |
size_t | SpaceUsedExcludingSelfLong() const Retorna o número de bytes usados pelo campo repetido, exceto sizeof(*this) |
int | SpaceUsedExcludingSelf() const |
iterator | erase(const_iterator position) Remove o elemento referenciado pela posição. mais… |
iterator | erase(const_iterator first, const_iterator last) Remove os elementos no intervalo [[]first, last). mais… |
Arena * | GetArena() const Acesse a Arena em que o RepeatedField armazena os elementos dele. |
void | InternalSwap(RepeatedField * other) Apenas para uso interno. mais… |
template | RepeatedField(Iter begin, Iter end) |
Element * RepeatedField::Add()
Anexa um novo elemento e retorna um ponteiro para ele.
O novo elemento não vai ser inicializado se |Element| for um tipo de POD.
void RepeatedField::ExtractSubrange(
int start,
int num,
Element * elements)
int start,
int num,
Element * elements)
Extrair elementos com índices em "[[]start .. start+num-1]".
Copie-os em "elementos[[]0 .. num-1]" se "elementos" não for NULL. Cuidado: a implementação também move elementos com índices [[]start+num ..]. Chamar essa rotina em um loop pode causar um comportamento quadrático.
void RepeatedField::Reserve(
int new_size)
int new_size)
Reserve espaço para expandir o campo até o tamanho especificado.
Evite incluir in-line de Reserve(): os elementos novos, copiar e excluir[[]] geram uma quantidade significativa de código excessivo.
Se a matriz for aumentada, sempre terá o dobro do tamanho.
Element * RepeatedField::AddAlreadyReserved()
Anexa um novo elemento e retorna um ponteiro para ele.
O novo elemento não vai ser inicializado se |Element| for um tipo de POD. Só vai ser chamado se capacity() > Size().
void RepeatedField::Resize(
int new_size,
const Element & value)
int new_size,
const Element & value)
Como o redimensionamento do STL.
Usa valor para preencher elementos anexados. Como Truncate() se new_size <= size(), caso contrário, é O(new_size - size()).
Element * RepeatedField::mutable_data()
Recebe a matriz subjacente.
Esse ponteiro pode ser invalidado por qualquer operação de adição ou remoção.
void RepeatedField::Swap(
RepeatedField * other)
RepeatedField * other)
Troque todo o conteúdo por "outro".
Se elas forem arenas separadas, copia os dados entre elas.
void RepeatedField::UnsafeArenaSwap(
RepeatedField * other)
RepeatedField * other)
Troque todo o conteúdo por "outro".
Só vai ser chamado se o autor da chamada puder garantir que os dois campos repetidos estejam na mesma arena ou no heap. A troca entre arenas diferentes não é permitida e detectada por uma GOOGLE_DCHECK (consulte detalhes na API de documentos).
iterator RepeatedField::erase(
const_iterator position)
const_iterator position)
Remove o elemento referenciado pela posição.
Retorna um iterador para o elemento imediatamente após o elemento removido.
Invalida todos os iteradores no ou após o elemento removido, incluindo end().
iterator RepeatedField::erase(
const_iterator first,
const_iterator last)
const_iterator first,
const_iterator last)
Remove os elementos no intervalo [[]first, last).
Retorna um iterador para o elemento imediatamente após o intervalo removido.
Invalida todos os iteradores em ou após o intervalo removido, incluindo end().
void RepeatedField::InternalSwap(
RepeatedField * other)
RepeatedField * other)
Apenas para uso interno.
Isso é público, porque é chamado pelo código gerado.
classe de modelo RepitaedPtrField
#include <google/protobuf/repeated_field.h>
namespace google::protobuf
template <typename >
RepeatedPtrField é como o RepeatedField, mas é usado para strings repetidas ou Mensagens.
Participantes | |
---|---|
typedef | internal::RepeatedPtrIterator< Element > iterator Compatibilidade com iterador semelhante a STL. |
typedef | internal::RepeatedPtrIterator< const Element > const_iterator |
typedef | Element value_type |
typedef | value_type & reference |
typedef | const value_type & const_reference |
typedef | value_type * pointer |
typedef | const value_type * const_pointer |
typedef | int size_type |
typedef | ptrdiff_t difference_type |
typedef | std::reverse_iterator< const_iterator > const_reverse_iterator Compatibilidade com iterador reverso. |
typedef | std::reverse_iterator< iterator > reverse_iterator |
typedef | internal::RepeatedPtrOverPtrsIterator< Element *, void * > pointer_iterator Iterador semelhante a STL que faz a iteração e retorna os ponteiros subjacentes para o elemento em vez do próprio elemento. |
typedef | internal::RepeatedPtrOverPtrsIterator< const Element *const, const void *const > const_pointer_iterator |
constexpr | RepeatedPtrField() |
explicit | RepeatedPtrField(Arena * arena) |
| RepeatedPtrField(const RepeatedPtrField & other) |
template | RepeatedPtrField(Iter begin, Iter end) |
| ~RepeatedPtrField() |
RepeatedPtrField & | operator=(const RepeatedPtrField & other) |
| RepeatedPtrField(RepeatedPtrField && other) |
RepeatedPtrField & | operator=(RepeatedPtrField && other) |
bool | empty() const |
int | size() const |
const Element & | Get(int index) const |
Element * | Mutable(int index) |
Element * | Add() |
void | Add(Element && value) |
template void | Add(Iter begin, Iter end) Anexe elementos no intervalo [[]begin, end) depois de reservar o número adequado de elementos. |
const Element & | operator[](int index) const |
Element & | operator[](int index) |
const Element & | at(int index) const |
Element & | at(int index) |
void | RemoveLast() Remova o último elemento da matriz. mais… |
void | DeleteSubrange(int start, int num) Exclua elementos com índices no intervalo [[]start . mais… |
void | Clear() |
void | MergeFrom(const RepeatedPtrField & other) |
void | CopyFrom(const RepeatedPtrField & other) |
template void | Assign(Iter begin, Iter end) Substitui o conteúdo porRepeatedPtrField(begin, end). |
void | Reserve(int new_size) Reserve espaço para expandir o campo até o tamanho especificado. mais… |
int | Capacity() const |
Element ** | mutable_data() Recebe a matriz subjacente. mais… |
const Element *const * | data() const |
void | Swap(RepeatedPtrField * other) Troque todo o conteúdo por "outro". mais… |
void | UnsafeArenaSwap(RepeatedPtrField * other) Troque todo o conteúdo por "outro". mais… |
void | SwapElements(int index1, int index2) Troque dois elementos. |
iterator | begin() |
const_iterator | begin() const |
const_iterator | cbegin() const |
iterator | end() |
const_iterator | end() const |
const_iterator | cend() const |
reverse_iterator | rbegin() |
const_reverse_iterator | rbegin() const |
reverse_iterator | rend() |
const_reverse_iterator | rend() const |
pointer_iterator | pointer_begin() |
const_pointer_iterator | pointer_begin() const |
pointer_iterator | pointer_end() |
const_pointer_iterator | pointer_end() const |
size_t | SpaceUsedExcludingSelfLong() const Retorna (uma estimativa de) o número de bytes usados pelo campo repetido, excluindo sizeOf(*this). |
int | SpaceUsedExcludingSelf() const |
template | RepeatedPtrField(Iter begin, Iter end) |
Gerenciamento avançado de memóriaQuando o gerenciamento de memória hardcore se torna necessário (como às vezes aqui no Google), os seguintes métodos podem ser úteis. | |
void | AddAllocated(Element * value) Adicione um objeto já alocado e transmita a propriedade para o RepeatedPtrField. mais... |
PROTOBUF_FUTURE_MUST_USE_RESULT Element * | ReleaseLast() Remova o último elemento e o retorne, transmitindo a propriedade ao autor da chamada. mais… |
void | UnsafeArenaAddAllocated(Element * value) Adicione um objeto já alocado e pule as verificações de propriedade de arena. mais… |
Element * | UnsafeArenaReleaseLast() Remova e retorne o último elemento. mais… |
void | ExtractSubrange(int start, int num, Element ** elements) Extraia elementos com índices no intervalo "[[]start .. start+num-1]". mais… |
void | UnsafeArenaExtractSubrange(int start, int num, Element ** elements) Idêntico a ExtractSubrange() descrito acima, exceto que, quando este campo repetido está em uma arena, nenhuma cópia de objeto é realizada. mais... |
int | ClearedCount() const Encontre o número de objetos limpos que estão sendo mantidos para reutilização. |
void | AddCleared(Element * value) Adicione um elemento ao pool de objetos limpos, transmitindo a propriedade para o RepeatedPtrField. mais... |
PROTOBUF_FUTURE_MUST_USE_RESULT Element * | ReleaseCleared() Remova um único elemento do pool limpo e retorne-o, transmitindo a propriedade ao autor da chamada. mais… |
iterator | erase(const_iterator position) Remove o elemento referenciado pela posição. mais… |
iterator | erase(const_iterator first, const_iterator last) Remove os elementos no intervalo [[]first, last). mais… |
Arena * | GetArena() const Recebe a arena em que esse RepeatedPtrField armazena os elementos. |
void | InternalSwap(RepeatedPtrField * other) Apenas para uso interno. mais… |
void RepeatedPtrField::RemoveLast()
Remova o último elemento da matriz.
A propriedade do elemento é retida pela matriz.
void RepeatedPtrField::DeleteSubrange(
int start,
int num)
int start,
int num)
Exclua elementos com índices no intervalo [[]start .
. start+num-1] Cuidado: a implementação move todos os elementos com índices [[]start+num .. ]. Chamar essa rotina em um loop pode causar um comportamento quadrático.
void RepeatedPtrField::Reserve(
int new_size)
int new_size)
Reserve espaço para expandir o campo até o tamanho especificado.
Isso apenas redimensiona a matriz de ponteiro; não aloca nenhum objeto. Se a matriz for aumentada, sempre terá o dobro do tamanho.
Element ** RepeatedPtrField::mutable_data()
Recebe a matriz subjacente.
Esse ponteiro pode ser invalidado por qualquer operação de adição ou remoção.
void RepeatedPtrField::Swap(
RepeatedPtrField * other)
RepeatedPtrField * other)
Troque todo o conteúdo por "outro".
Se eles estiverem em arenas separadas, os dados serão copiados.
void RepeatedPtrField::UnsafeArenaSwap(
RepeatedPtrField * other)
RepeatedPtrField * other)
Troque todo o conteúdo por "outro".
O autor da chamada precisa garantir que ambos os campos estejam na mesma arena ou ambos estejam no heap. A troca entre arenas diferentes com essa função não é permitida e é detectada por GOOGLE_DCHECK.
void RepeatedPtrField::AddAllocated(
Element * value)
Element * value)
Adicione um objeto já alocado e transmita a propriedade para o RepeatedPtrField.
Observe que alguns comportamentos especiais ocorrem em relação às arenas:
(i) if this field holds submessages, the new submessage will be copied if the original is in an arena and this RepeatedPtrField is either in a different arena, or on the heap. (ii) if this field holds strings, the passed-in string *must* be heap-allocated, not arena-allocated. There is no way to dynamically check this at runtime, so User Beware.
PROTOBUF_FUTURE_MUST_USE_RESULT Element *
RepeatedPtrField::ReleaseLast()
RepeatedPtrField::ReleaseLast()
Remova o último elemento e o retorne, transmitindo a propriedade ao autor da chamada.
Requer: size() > 0
Se este RepeatedPtrField estiver em uma arena, será necessário copiar um objeto para transmitir a propriedade de volta ao usuário (para semântica compatível). Use UnsafeArenaReleaseLast() se esse comportamento não for adequado.
void RepeatedPtrField::UnsafeArenaAddAllocated(
Element * value)
Element * value)
Adicione um objeto já alocado e pule as verificações de propriedade de arena.
O usuário precisa garantir que o objeto especificado esteja na mesma arena que esse RepeatedPtrField. Ele também é útil em códigos legados que usam propriedade temporária para evitar cópias. Exemplo:
RepeatedPtrField<T> temp_field; temp_field.AddAllocated(new T); ... // Do something with temp_field temp_field.ExtractSubrange(0, temp_field.size(), nullptr);
Se você colocar temp_field na arena, isso falhará, porque a propriedade será transferida para a arena na chamada "AddDistributed" e não será mais liberada, causando uma exclusão dupla. UnsafeArenaAddAlemão impede isso.
Element * RepeatedPtrField::UnsafeArenaReleaseLast()
Remova e retorne o último elemento.
Só funciona em uma arena. O ponteiro retornado é para o objeto original na arena, portanto, tem o ciclo de vida da arena. Requer: current_size_ > 0
void RepeatedPtrField::ExtractSubrange(
int start,
int num,
Element ** elements)
int start,
int num,
Element ** elements)
Extraia elementos com índices no intervalo "[[]start .. start+num-1]".
O autor da chamada assume a propriedade dos elementos extraídos e é responsável por excluí-los quando não são mais necessários. Se "elementos" não for NULL, os ponteiros para os elementos extraídos serão armazenados em "elementos[[]0 .. num-1]" para facilitar o autor da chamada. Se "elementos" for NULL, o autor da chamada precisará usar algum outro mecanismo para executar outras operações (como exclusão) nesses elementos. Cuidado: a implementação também move elementos com índices [[]start+num ..]. Chamar essa rotina em um loop pode causar um comportamento quadrático.
O comportamento da cópia de memória é idêntico ao ReleaseLast() descrito acima: se esse RepeatedPtrField estiver em uma arena, uma cópia de objeto será realizada para cada elemento retornado, de modo que todos os ponteiros de elemento retornados sejam cópias alocadas em heap. Se essa cópia não for desejada, o usuário precisará chamar UnsafeArenaExtractSubrange().
void RepeatedPtrField::UnsafeArenaExtractSubrange(
int start,
int num,
Element ** elements)
int start,
int num,
Element ** elements)
Idêntico a ExtractSubrange() descrito acima, exceto que, quando este campo repetido está em uma arena, nenhuma cópia de objeto é realizada.
Em vez disso, os ponteiros de objeto bruto são retornados. Assim, se estiver em uma arena, os objetos retornados não poderão ser liberados, porque não serão objetos alocados por heap.
void RepeatedPtrField::AddCleared(
Element * value)
Element * value)
Adicione um elemento ao pool de objetos limpos, transmitindo a propriedade para o RepeatedPtrField.
O elemento precisa ser apagado antes de chamar esse método.
Este método não pode ser chamado quando o campo repetido está em uma arena ou quando |value| está; os dois casos acionarão uma falha GOOGLE_DCHECK.
PROTOBUF_FUTURE_MUST_USE_RESULT Element *
RepeatedPtrField::ReleaseCleared()
RepeatedPtrField::ReleaseCleared()
Remova um único elemento do pool limpo e retorne-o, transmitindo a propriedade ao autor da chamada.
O elemento vai ser apagado. Requer: ClearedCount() > 0
Esse método não pode ser chamado quando o campo repetido está em uma arena. Isso acionará uma falha GOOGLE_DCHECK.
iterator RepeatedPtrField::erase(
const_iterator position)
const_iterator position)
Remove o elemento referenciado pela posição.
Retorna um iterador para o elemento imediatamente após o elemento removido.
Invalida todos os iteradores no ou após o elemento removido, incluindo end().
iterator RepeatedPtrField::erase(
const_iterator first,
const_iterator last)
const_iterator first,
const_iterator last)
Remove os elementos no intervalo [[]first, last).
Retorna um iterador para o elemento imediatamente após o intervalo removido.
Invalida todos os iteradores em ou após o intervalo removido, incluindo end().
void RepeatedPtrField::InternalSwap(
RepeatedPtrField * other)
RepeatedPtrField * other)
Apenas para uso interno.
Isso é público, porque é chamado pelo código gerado.