| 299 | } |
| 300 | |
| 301 | bool gen_struct_i(AST_Structure* node, const std::string& type_name, |
| 302 | bool use_cxx11, ExtensibilityKind ek, FieldFilter field_filter) |
| 303 | { |
| 304 | const std::string wrapped_name = key_only_type_name(node, type_name, field_filter, false); |
| 305 | Function read("vread", "bool"); |
| 306 | read.addArg("value_reader", "OpenDDS::DCPS::ValueReader&"); |
| 307 | read.addArg("value", wrapped_name); |
| 308 | read.endArgs(); |
| 309 | |
| 310 | be_global->impl_ << |
| 311 | " static const ListMemberHelper::Pair pairs[] = {"; |
| 312 | |
| 313 | const std::string value_prefix = field_filter == FieldFilter_All ? "value." : "value.value."; |
| 314 | const Fields fields(node, field_filter); |
| 315 | |
| 316 | // KeyOnly wrapper has no field if there is no explicit key. |
| 317 | bool has_field = false; |
| 318 | for (Fields::Iterator it = fields.begin(); it != fields.end(); ++it) { |
| 319 | AST_Field* const field = *it; |
| 320 | be_global->impl_ << |
| 321 | "{\"" << canonical_name(field) << "\"," << be_global->get_id(field) << "},"; |
| 322 | has_field = true; |
| 323 | } |
| 324 | |
| 325 | be_global->impl_ << |
| 326 | "{0,0}};\n" |
| 327 | " ListMemberHelper helper(pairs);\n"; |
| 328 | |
| 329 | be_global->impl_ << |
| 330 | " if (!value_reader.begin_struct(" << extensibility_kind(ek) << ")) return false;\n"; |
| 331 | |
| 332 | if (has_field) { |
| 333 | be_global->impl_ << |
| 334 | " XTypes::MemberId member_id;\n" |
| 335 | " while (value_reader.members_remaining()) {\n" |
| 336 | " if (!value_reader.begin_struct_member(member_id, helper)) return false;\n" |
| 337 | " switch (member_id) {\n"; |
| 338 | |
| 339 | for (Fields::Iterator it = fields.begin(); it != fields.end(); ++it) { |
| 340 | AST_Field* const field = *it; |
| 341 | const std::string field_name = field->local_name()->get_string(); |
| 342 | be_global->impl_ << |
| 343 | " case " << be_global->get_id(field) << ": {\n"; |
| 344 | generate_read(value_prefix + field_name, use_cxx11 ? "()" : "", field_name, |
| 345 | field->field_type(), "i", 3, nested(field_filter), be_global->is_optional(field)); |
| 346 | be_global->impl_ << |
| 347 | " break;\n" |
| 348 | " }\n"; |
| 349 | } |
| 350 | |
| 351 | be_global->impl_ << |
| 352 | " }\n" |
| 353 | " if (!value_reader.end_struct_member()) return false;\n" |
| 354 | " }\n"; |
| 355 | } |
| 356 | |
| 357 | be_global->impl_ << |
| 358 | " if (!value_reader.end_struct()) return false;\n" |
no test coverage detected