OBSERVAÇÃO:este site foi descontinuado. O site será desativado após 31 de janeiro de 2023, e o tráfego será redirecionado para o novo site em https://protobuf.dev. Enquanto isso, as atualizações serão feitas apenas para protobuf.dev.

campo_repetido.h

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

#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 arquivo

Essas 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)

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)

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)

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)

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)

Troque todo o conteúdo por "outro".

Se elas forem arenas separadas, copia os dados entre elas.


void RepeatedField::UnsafeArenaSwap(
        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)

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)

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)

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ória

Quando 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)

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)

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)

Troque todo o conteúdo por "outro".

Se eles estiverem em arenas separadas, os dados serão copiados.


void RepeatedPtrField::UnsafeArenaSwap(
        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)

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()

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)

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)

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)

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)

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()

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)

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)

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)

Apenas para uso interno.

Isso é público, porque é chamado pelo código gerado.