diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 644ae87fb1d700f0a5b54f3b541d1c777d0ba001..206a6e1fe51c52a03050abbf64327f20f978c5d9 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -83,6 +83,28 @@ grpc::string FilenameIdentifier(const grpc::string &filename) { } } // namespace +template<class T, size_t N> +T *array_end(T (&array)[N]) { return array + N; } + +void PrintIncludes(grpc::protobuf::io::Printer *printer, const std::vector<grpc::string>& headers, const Parameters ¶ms) { + std::map<grpc::string, grpc::string> vars; + + vars["l"] = params.use_system_headers ? '<' : '"'; + vars["r"] = params.use_system_headers ? '>' : '"'; + + if (!params.grpc_search_path.empty()) { + vars["l"] += params.grpc_search_path; + if (params.grpc_search_path.back() != '/') { + vars["l"] += '/'; + } + } + + for (auto i = headers.begin(); i != headers.end(); i++) { + vars["h"] = *i; + printer->Print(vars, "#include $l$$h$$r$\n"); + } +} + grpc::string GetHeaderPrologue(const grpc::protobuf::FileDescriptor *file, const Parameters ¶ms) { grpc::string output; @@ -118,24 +140,18 @@ grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file, grpc::protobuf::io::Printer printer(&output_stream, '$'); std::map<grpc::string, grpc::string> vars; - vars["l"] = params.use_system_headers ? '<' : '"'; - vars["r"] = params.use_system_headers ? '>' : '"'; - - if (!params.grpc_search_path.empty()) { - vars["l"] += params.grpc_search_path; - if (params.grpc_search_path.back() != '/') { - vars["l"] += '/'; - } - } - - printer.Print(vars, "#include $l$grpc++/impl/codegen/async_stream.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/async_unary_call.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/proto_utils.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/rpc_method.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/service_type.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/status.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/stub_options.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/sync_stream.h$r$\n"); + static const char *headers_strs[] = { + "grpc++/impl/codegen/async_stream.h", + "grpc++/impl/codegen/async_unary_call.h", + "grpc++/impl/codegen/proto_utils.h", + "grpc++/impl/codegen/rpc_method.h", + "grpc++/impl/codegen/service_type.h", + "grpc++/impl/codegen/status.h", + "grpc++/impl/codegen/stub_options.h", + "grpc++/impl/codegen/sync_stream.h" + }; + std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); + PrintIncludes(&printer, headers, params); printer.Print(vars, "\n"); printer.Print(vars, "namespace grpc {\n"); printer.Print(vars, "class CompletionQueue;\n"); @@ -876,26 +892,18 @@ grpc::string GetSourceIncludes(const grpc::protobuf::FileDescriptor *file, grpc::protobuf::io::Printer printer(&output_stream, '$'); std::map<grpc::string, grpc::string> vars; - vars["l"] = params.use_system_headers ? '<' : '"'; - vars["r"] = params.use_system_headers ? '>' : '"'; - - if (!params.grpc_search_path.empty()) { - vars["l"] += params.grpc_search_path; - if (params.grpc_search_path.back() != '/') { - vars["l"] += '/'; - } - } - - printer.Print(vars, "#include $l$grpc++/impl/codegen/async_stream.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/async_unary_call.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/channel_interface.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/client_unary_call.h$r$\n"); - printer.Print(vars, - "#include $l$grpc++/impl/codegen/method_handler_impl.h$r$\n"); - printer.Print(vars, - "#include $l$grpc++/impl/codegen/rpc_service_method.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/service_type.h$r$\n"); - printer.Print(vars, "#include $l$grpc++/impl/codegen/sync_stream.h$r$\n"); + static const char *headers_strs[] = { + "grpc++/impl/codegen/async_stream.h", + "grpc++/impl/codegen/async_unary_call.h", + "grpc++/impl/codegen/channel_interface.h", + "grpc++/impl/codegen/client_unary_call.h", + "grpc++/impl/codegen/method_handler_impl.h", + "grpc++/impl/codegen/rpc_service_method.h", + "grpc++/impl/codegen/service_type.h", + "grpc++/impl/codegen/sync_stream.h" + }; + std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); + PrintIncludes(&printer, headers, params); if (!file->package().empty()) { std::vector<grpc::string> parts =