52
52
using internal::WireFormat;
54
54
void SetCommonFieldVariables(const FieldDescriptor* descriptor,
55
map<string, string>* variables) {
55
map<string, string>* variables,
56
const Options& options) {
56
57
(*variables)["name"] = FieldName(descriptor);
57
58
(*variables)["index"] = SimpleItoa(descriptor->index());
58
59
(*variables)["number"] = SimpleItoa(descriptor->number());
83
FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor)
85
FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor,
86
const Options& options)
84
87
: descriptor_(descriptor),
86
new scoped_ptr<FieldGenerator>[descriptor->field_count()]) {
88
field_generators_(new scoped_ptr<FieldGenerator>[descriptor->field_count()]) {
87
89
// Construct all the FieldGenerators.
88
90
for (int i = 0; i < descriptor->field_count(); i++) {
89
field_generators_[i].reset(MakeGenerator(descriptor->field(i)));
91
field_generators_[i].reset(MakeGenerator(descriptor->field(i), options));
93
FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field) {
95
FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field,
96
const Options& options) {
94
97
if (field->is_repeated()) {
95
98
switch (field->cpp_type()) {
96
99
case FieldDescriptor::CPPTYPE_MESSAGE:
97
return new RepeatedMessageFieldGenerator(field);
100
return new RepeatedMessageFieldGenerator(field, options);
98
101
case FieldDescriptor::CPPTYPE_STRING:
99
102
switch (field->options().ctype()) {
100
103
default: // RepeatedStringFieldGenerator handles unknown ctypes.
101
104
case FieldOptions::STRING:
102
return new RepeatedStringFieldGenerator(field);
105
return new RepeatedStringFieldGenerator(field, options);
104
107
case FieldDescriptor::CPPTYPE_ENUM:
105
return new RepeatedEnumFieldGenerator(field);
108
return new RepeatedEnumFieldGenerator(field, options);
107
return new RepeatedPrimitiveFieldGenerator(field);
110
return new RepeatedPrimitiveFieldGenerator(field, options);
110
113
switch (field->cpp_type()) {
111
114
case FieldDescriptor::CPPTYPE_MESSAGE:
112
return new MessageFieldGenerator(field);
115
return new MessageFieldGenerator(field, options);
113
116
case FieldDescriptor::CPPTYPE_STRING:
114
117
switch (field->options().ctype()) {
115
118
default: // StringFieldGenerator handles unknown ctypes.
116
119
case FieldOptions::STRING:
117
return new StringFieldGenerator(field);
120
return new StringFieldGenerator(field, options);
119
122
case FieldDescriptor::CPPTYPE_ENUM:
120
return new EnumFieldGenerator(field);
123
return new EnumFieldGenerator(field, options);
122
return new PrimitiveFieldGenerator(field);
125
return new PrimitiveFieldGenerator(field, options);