javanano_field.cc revision fea3fd5cb6ff88b51da60b1f33004944d93a9fce
164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Protocol Buffers - Google's data interchange format
264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Copyright 2008 Google Inc.  All rights reserved.
364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// http://code.google.com/p/protobuf/
464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Redistribution and use in source and binary forms, with or without
664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// modification, are permitted provided that the following conditions are
764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// met:
864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions of source code must retain the above copyright
1064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// notice, this list of conditions and the following disclaimer.
1164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions in binary form must reproduce the above
1264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// copyright notice, this list of conditions and the following disclaimer
1364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// in the documentation and/or other materials provided with the
1464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// distribution.
1564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Neither the name of Google Inc. nor the names of its
1664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// contributors may be used to endorse or promote products derived from
1764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// this software without specific prior written permission.
1864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
1964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Author: kenton@google.com (Kenton Varda)
3264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//  Based on original Protocol Buffers design by
3364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//  Sanjay Ghemawat, Jeff Dean, and others.
3464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_field.h>
3664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_helpers.h>
3764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_primitive_field.h>
3864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_enum_field.h>
3964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_message_field.h>
4064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/stubs/common.h>
4164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
4264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace google {
4364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace protobuf {
4464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace compiler {
4564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace javanano {
4664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
4764d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciFieldGenerator::~FieldGenerator() {}
4864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
49fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Caivoid FieldGenerator::GenerateMergingCodeFromPacked(io::Printer* printer) const {
50fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  // Reaching here indicates a bug. Cases are:
51fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  //   - This FieldGenerator should support packing, but this method should be
52fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  //     overridden.
53fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  //   - This FieldGenerator doesn't support packing, and this method should
54fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  //     never have been called.
55fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai  GOOGLE_LOG(FATAL) << "GenerateParsingCodeFromPacked() "
56fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai             << "called on field generator that does not support packing.";
57fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai}
58fea3fd5cb6ff88b51da60b1f33004944d93a9fceMax Cai
5964d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciFieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor, const Params &params)
6064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  : descriptor_(descriptor),
6164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    field_generators_(
6264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new scoped_ptr<FieldGenerator>[descriptor->field_count()]),
6364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    extension_generators_(
6464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      new scoped_ptr<FieldGenerator>[descriptor->extension_count()]) {
6564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
66e74fe623e115237968a3de1143d7cdb4df710858Max Cai  int next_has_bit_index = 0;
6764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  // Construct all the FieldGenerators.
6864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  for (int i = 0; i < descriptor->field_count(); i++) {
69e74fe623e115237968a3de1143d7cdb4df710858Max Cai    field_generators_[i].reset(
70e74fe623e115237968a3de1143d7cdb4df710858Max Cai        MakeGenerator(descriptor->field(i), params, &next_has_bit_index));
7164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
7264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  for (int i = 0; i < descriptor->extension_count(); i++) {
73e74fe623e115237968a3de1143d7cdb4df710858Max Cai    extension_generators_[i].reset(
74e74fe623e115237968a3de1143d7cdb4df710858Max Cai        MakeGenerator(descriptor->extension(i), params, &next_has_bit_index));
7564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
76e74fe623e115237968a3de1143d7cdb4df710858Max Cai  total_bits_ = next_has_bit_index;
7764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
7864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
79e74fe623e115237968a3de1143d7cdb4df710858Max CaiFieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field,
80e74fe623e115237968a3de1143d7cdb4df710858Max Cai    const Params &params, int* next_has_bit_index) {
8164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  if (field->is_repeated()) {
8264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    switch (GetJavaType(field)) {
8364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      case JAVATYPE_MESSAGE:
8464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new RepeatedMessageFieldGenerator(field, params);
8564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      case JAVATYPE_ENUM:
8664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new RepeatedEnumFieldGenerator(field, params);
8764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      default:
8864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new RepeatedPrimitiveFieldGenerator(field, params);
8964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    }
90e74fe623e115237968a3de1143d7cdb4df710858Max Cai  } else if (params.optional_field_accessors() && field->is_optional()) {
91e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // We need a has-bit for each primitive/enum field because their default
92e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // values could be same as explicitly set values. But we don't need it
93e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // for a message field because they have no defaults and Nano uses 'null'
94e74fe623e115237968a3de1143d7cdb4df710858Max Cai    // for unset messages, which cannot be set explicitly.
95e74fe623e115237968a3de1143d7cdb4df710858Max Cai    switch (GetJavaType(field)) {
96e74fe623e115237968a3de1143d7cdb4df710858Max Cai      case JAVATYPE_MESSAGE:
97e74fe623e115237968a3de1143d7cdb4df710858Max Cai        return new AccessorMessageFieldGenerator(field, params);
98e74fe623e115237968a3de1143d7cdb4df710858Max Cai      case JAVATYPE_ENUM:
99e74fe623e115237968a3de1143d7cdb4df710858Max Cai        return new AccessorEnumFieldGenerator(
100e74fe623e115237968a3de1143d7cdb4df710858Max Cai            field, params, (*next_has_bit_index)++);
101e74fe623e115237968a3de1143d7cdb4df710858Max Cai      default:
102e74fe623e115237968a3de1143d7cdb4df710858Max Cai        return new AccessorPrimitiveFieldGenerator(
103e74fe623e115237968a3de1143d7cdb4df710858Max Cai            field, params, (*next_has_bit_index)++);
104e74fe623e115237968a3de1143d7cdb4df710858Max Cai    }
10564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  } else {
10664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    switch (GetJavaType(field)) {
10764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      case JAVATYPE_MESSAGE:
10864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new MessageFieldGenerator(field, params);
10964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      case JAVATYPE_ENUM:
11064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new EnumFieldGenerator(field, params);
11164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      default:
11264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        return new PrimitiveFieldGenerator(field, params);
11364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    }
11464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
11564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
11664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
11764d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciFieldGeneratorMap::~FieldGeneratorMap() {}
11864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
11964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciconst FieldGenerator& FieldGeneratorMap::get(
12064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    const FieldDescriptor* field) const {
12164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);
12264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  return *field_generators_[field->index()];
12364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
12464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
12564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciconst FieldGenerator& FieldGeneratorMap::get_extension(int index) const {
12664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  return *extension_generators_[index];
12764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
12864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
12964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace javanano
13064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace compiler
13164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace protobuf
13264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace google
133