|  | // Copyright 2020 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "tools/fidlcat/lib/code_generator/cpp_visitor.h" | 
|  |  | 
|  | namespace fidl_codec { | 
|  |  | 
|  | void CppVariableVector::GenerateInitialization(PrettyPrinter& printer, const char* suffix) const { | 
|  | const Type* component_type = for_type()->GetComponentType(); | 
|  |  | 
|  | std::string separator; | 
|  | int i = 0; | 
|  | std::vector<std::shared_ptr<CppVariable>> elems = {}; | 
|  | for (const auto& value : value()->AsVectorValue()->values()) { | 
|  | CppVisitor visitor(name() + "_elem_" + std::to_string(i++)); | 
|  | value->Visit(&visitor, component_type); | 
|  |  | 
|  | auto elem = visitor.result(); | 
|  | elems.emplace_back(elem); | 
|  |  | 
|  | elem->GenerateInitialization(printer); | 
|  | } | 
|  |  | 
|  | printer << separator; | 
|  |  | 
|  | GenerateTypeAndName(printer); | 
|  | printer << " = { "; | 
|  |  | 
|  | separator = ""; | 
|  | for (const auto& elem : elems) { | 
|  | printer << separator; | 
|  | elem->GenerateName(printer); | 
|  | separator = ", "; | 
|  | } | 
|  | printer << " };\n"; | 
|  | } | 
|  |  | 
|  | void CppVariableStruct::GenerateInitialization(PrettyPrinter& printer, const char* suffix) const { | 
|  | /* | 
|  | * Given the following FIDL definition: | 
|  | * | 
|  | * struct Color { | 
|  | *     uint32 id; | 
|  | *     string:MAX_STRING_LENGTH name = "red"; | 
|  | * }; | 
|  | * | 
|  | * We are interested in generating the following HLCPP code: | 
|  | * | 
|  | * fuchsia::examples::Color blue = {1, "blue"}; | 
|  | * | 
|  | * (See https://fuchsia.dev/fuchsia-src/reference/fidl/bindings/hlcpp-bindings#structs) | 
|  | */ | 
|  |  | 
|  | std::vector<std::shared_ptr<CppVariable>> struct_members; | 
|  |  | 
|  | for (const std::unique_ptr<fidl_codec::StructMember>& struct_member : | 
|  | value()->AsStructValue()->struct_definition().members()) { | 
|  | std::pair<const fidl_codec::Type*, const fidl_codec::Value*> member_value = | 
|  | value()->AsStructValue()->GetFieldValue(struct_member->name()); | 
|  |  | 
|  | CppVisitor visitor(name() + "_" + struct_member->name()); | 
|  | member_value.second->Visit(&visitor, struct_member->type()); | 
|  |  | 
|  | auto member = visitor.result(); | 
|  | member->GenerateInitialization(printer); | 
|  |  | 
|  | struct_members.emplace_back(member); | 
|  | } | 
|  |  | 
|  | GenerateTypeAndName(printer); | 
|  | printer << " = { "; | 
|  | std::string separator; | 
|  | for (const auto& member : struct_members) { | 
|  | printer << separator; | 
|  | separator = ", "; | 
|  | member->GenerateName(printer); | 
|  | } | 
|  | printer << " };\n"; | 
|  | } | 
|  |  | 
|  | }  // namespace fidl_codec |