15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unknown_field_set.h>
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/common.h>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/coded_stream.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/zero_copy_stream.h>
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <google/protobuf/wire_format_lite.h>
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/stl_util.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int StringSpaceUsedExcludingSelf(const string& str) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* start = &str;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* end = &str + 1;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (start <= str.data() && str.data() <= end) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The string's data is stored inside the string object itself.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return str.capacity();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UnknownFieldSet::UnknownFieldSet()
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : fields_(NULL) {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UnknownFieldSet::~UnknownFieldSet() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clear();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete fields_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::ClearFallback() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOOGLE_DCHECK(fields_ != NULL);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < fields_->size(); i++) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*fields_)[i].Delete();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->clear();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UnknownFieldSet::ClearAndFreeMemory() {
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (fields_ != NULL) {
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Clear();
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    delete fields_;
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fields_ = NULL;
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < other.field_count(); i++) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddField(other.field(i));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UnknownFieldSet::SpaceUsedExcludingSelf() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) return 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < fields_->size(); i++) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UnknownField& field = (*fields_)[i];
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (field.type()) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_LENGTH_DELIMITED:
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        total_size += sizeof(*field.length_delimited_.string_value_) +
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      internal::StringSpaceUsedExcludingSelf(
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                          *field.length_delimited_.string_value_);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UnknownField::TYPE_GROUP:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        total_size += field.group_->SpaceUsed();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return total_size;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int UnknownFieldSet::SpaceUsed() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sizeof(*this) + SpaceUsedExcludingSelf();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::AddVarint(int number, uint64 value) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownField field;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.number_ = number;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.type_ = UnknownField::TYPE_VARINT;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.varint_ = value;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::AddFixed32(int number, uint32 value) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownField field;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.number_ = number;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.type_ = UnknownField::TYPE_FIXED32;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.fixed32_ = value;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::AddFixed64(int number, uint64 value) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownField field;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.number_ = number;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.type_ = UnknownField::TYPE_FIXED64;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.fixed64_ = value;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string* UnknownFieldSet::AddLengthDelimited(int number) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownField field;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.number_ = number;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.type_ = UnknownField::TYPE_LENGTH_DELIMITED;
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  field.length_delimited_.string_value_ = new string;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return field.length_delimited_.string_value_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UnknownFieldSet* UnknownFieldSet::AddGroup(int number) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownField field;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.number_ = number;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.type_ = UnknownField::TYPE_GROUP;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.group_ = new UnknownFieldSet;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return field.group_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownFieldSet::AddField(const UnknownField& field) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fields_ == NULL) fields_ = new vector<UnknownField>;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->back().DeepCopy();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UnknownFieldSet::DeleteSubrange(int start, int num) {
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GOOGLE_DCHECK(fields_ != NULL);
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Delete the specified fields.
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < num; ++i) {
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    (*fields_)[i + start].Delete();
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Slide down the remaining fields.
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = start + num; i < fields_->size(); ++i) {
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    (*fields_)[i - num] = (*fields_)[i];
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Pop off the # of deleted fields.
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < num; ++i) {
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fields_->pop_back();
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UnknownFieldSet::DeleteByNumber(int number) {
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (fields_ == NULL) return;
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int left = 0;  // The number of fields left after deletion.
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < fields_->size(); ++i) {
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    UnknownField* field = &(*fields_)[i];
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    if (field->number() == number) {
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      field->Delete();
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    } else {
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (i != left) {
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        (*fields_)[left] = (*fields_)[i];
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ++left;
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  fields_->resize(left);
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UnknownFieldSet::MergeFromCodedStream(io::CodedInputStream* input) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnknownFieldSet other;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internal::WireFormatLite::SkipMessage(input, &other) &&
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input->ConsumedEntireMessage()) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MergeFrom(other);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UnknownFieldSet::ParseFromCodedStream(io::CodedInputStream* input) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clear();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MergeFromCodedStream(input);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UnknownFieldSet::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedInputStream coded_input(input);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ParseFromCodedStream(&coded_input) &&
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    coded_input.ConsumedEntireMessage();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UnknownFieldSet::ParseFromArray(const void* data, int size) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::ArrayInputStream input(data, size);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ParseFromZeroCopyStream(&input);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownField::Delete() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type()) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UnknownField::TYPE_LENGTH_DELIMITED:
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      delete length_delimited_.string_value_;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UnknownField::TYPE_GROUP:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete group_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UnknownField::DeepCopy() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type()) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UnknownField::TYPE_LENGTH_DELIMITED:
250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      length_delimited_.string_value_ = new string(
251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          *length_delimited_.string_value_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UnknownField::TYPE_GROUP: {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UnknownFieldSet* group = new UnknownFieldSet;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group->MergeFrom(*group_);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      group_ = group;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid UnknownField::SerializeLengthDelimitedNoTag(
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    io::CodedOutputStream* output) const {
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string& data = *length_delimited_.string_value_;
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  output->WriteVarint32(data.size());
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  output->WriteString(data);
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochuint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const {
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const string& data = *length_delimited_.string_value_;
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  target = io::CodedOutputStream::WriteStringToArray(data, target);
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return target;
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
283