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>
363d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
373d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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>
423d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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)
793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid UnknownFieldSet::ClearAndFreeMemory() {
803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  if (fields_ != NULL) {
813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    Clear();
823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    delete fields_;
833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    fields_ = NULL;
843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  }
853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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:
1013d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        total_size += sizeof(*field.length_delimited_.string_value_) +
1023d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch                      internal::StringSpaceUsedExcludingSelf(
1033d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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;
1513d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  field.length_delimited_.string_value_ = new string;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fields_->push_back(field);
1533d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  return field.length_delimited_.string_value_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1563d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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)
1733d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid UnknownFieldSet::DeleteSubrange(int start, int num) {
1743d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  GOOGLE_DCHECK(fields_ != NULL);
1753d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // Delete the specified fields.
1763d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  for (int i = 0; i < num; ++i) {
1773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    (*fields_)[i + start].Delete();
1783d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  }
1793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // Slide down the remaining fields.
1803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  for (int i = start + num; i < fields_->size(); ++i) {
1813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    (*fields_)[i - num] = (*fields_)[i];
1823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  }
1833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // Pop off the # of deleted fields.
1843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  for (int i = 0; i < num; ++i) {
1853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    fields_->pop_back();
1863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  }
1873d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
1883d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
1893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid UnknownFieldSet::DeleteByNumber(int number) {
1903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  if (fields_ == NULL) return;
1913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  int left = 0;  // The number of fields left after deletion.
1923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  for (int i = 0; i < fields_->size(); ++i) {
1933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    UnknownField* field = &(*fields_)[i];
1943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    if (field->number() == number) {
1953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      field->Delete();
1963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    } else {
1973d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      if (i != left) {
1983d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        (*fields_)[left] = (*fields_)[i];
1993d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      }
2003d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      ++left;
2013d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    }
2023d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  }
2033d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  fields_->resize(left);
2043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
2053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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:
2373d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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:
2503d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      length_delimited_.string_value_ = new string(
2513d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben 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)
2643d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
2653d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid UnknownField::SerializeLengthDelimitedNoTag(
2663d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    io::CodedOutputStream* output) const {
2673d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
2683d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  const string& data = *length_delimited_.string_value_;
2693d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  output->WriteVarint32(data.size());
2703d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  output->WriteString(data);
2713d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
2723d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
2733d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochuint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const {
2743d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
2753d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  const string& data = *length_delimited_.string_value_;
2763d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
2773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  target = io::CodedOutputStream::WriteStringToArray(data, target);
2783d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  return target;
2793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
2803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
283