From 4ecbebc09989a5fccb40fcb2d3d0d1b9f540a7d4 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Tue, 5 Sep 2006 00:14:21 +0000 Subject: [PATCH] Add multiserver generation to C++ Thrift Summary: Autogen server that can encapsulates multiple server instances Reviewed By: aditya git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664782 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_cpp_generator.cc | 97 ++++++++++++++++++++ compiler/cpp/src/generate/t_cpp_generator.h | 1 + lib/cpp/src/Thrift.h | 1 + 3 files changed, 99 insertions(+) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 6c5a0d60..2cff3fc8 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -838,12 +838,109 @@ void t_cpp_generator::generate_service_server(t_service* tservice) { "}" << endl << endl; + // Multiserver + generate_service_multiserver(tservice); + // Generate the process subfunctions for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { generate_process_function(tservice, *f_iter); } } +/** + * Generates a multiserver, which is a single server that just takes a set + * of objects implementing the interface and calls them all, returning the + * value of the last one to be called. + * + * @param tservice The service to generate a multiserver for. + */ +void t_cpp_generator::generate_service_multiserver(t_service* tservice) { + // Generate the dispatch methods + vector functions = tservice->get_functions(); + vector::iterator f_iter; + + string list_type = string("std::vector >"; + + // Generate the header portion + f_header_ << + "class " << service_name_ << "MultiServer : " << + "public " << service_name_ << "Server {" << endl << + " public: " << endl; + indent_up(); + f_header_ << + indent() << + service_name_ << "MultiServer(boost::shared_ptr protocol, " << list_type << "& servers) : " << + service_name_ << "Server(protocol), _servers(servers) {}" << endl << + indent() << + service_name_ << "MultiServer(boost::shared_ptr iprot, boost::shared_ptr oprot, " << list_type << "& servers) : " << + service_name_ << "Server(iprot, oprot), _servers(servers) {}" << endl << + indent() << "virtual ~" << service_name_ << "MultiServer() {}" << endl; + indent_down(); + + // Protected data members + f_header_ << + " protected:" << endl; + indent_up(); + f_header_ << + indent() << list_type << "& _servers;" << endl; + indent_down(); + + f_header_ << + indent() << " public:" << endl; + indent_up(); + + for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { + t_struct* arglist = (*f_iter)->get_arglist(); + const vector& args = arglist->get_members(); + vector::const_iterator a_iter; + + string call = string("_servers[i]->") + (*f_iter)->get_name() + "("; + bool first = true; + for (a_iter = args.begin(); a_iter != args.end(); ++a_iter) { + if (first) { + first = false; + } else { + call += ", "; + } + call += (*a_iter)->get_name(); + } + call += ")"; + + f_header_ << + indent() << function_signature(*f_iter) << " {" << endl; + indent_up(); + f_header_ << + indent() << "uint32_t sz = _servers.size();" << endl << + indent() << "for (uint32_t i = 0; i < sz; ++i) {" << endl; + if (!(*f_iter)->get_returntype()->is_void()) { + f_header_ << + indent() << " if (i == sz - 1) {" << endl << + indent() << " return " << call << ";" << endl << + indent() << " } else {" << endl << + indent() << " " << call << ";" << endl << + indent() << " }" << endl; + } else { + f_header_ << + indent() << " " << call << ";" << endl; + } + + f_header_ << + indent() << "}" << endl; + + indent_down(); + f_header_ << + indent() << "}" << endl << + endl; + } + + indent_down(); + + f_header_ << + indent() << "};" << endl << + endl; +} + + /** * Generates a struct and helpers for a function. * diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h index 79238528..fd208b68 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.h +++ b/compiler/cpp/src/generate/t_cpp_generator.h @@ -45,6 +45,7 @@ class t_cpp_generator : public t_oop_generator { void generate_service_helpers (t_service* tservice); void generate_service_client (t_service* tservice); void generate_service_server (t_service* tservice); + void generate_service_multiserver(t_service* tservice); void generate_process_function (t_service* tservice, t_function* tfunction); void generate_function_helpers (t_function* tfunction); diff --git a/lib/cpp/src/Thrift.h b/lib/cpp/src/Thrift.h index 9254b562..410d20eb 100644 --- a/lib/cpp/src/Thrift.h +++ b/lib/cpp/src/Thrift.h @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace facebook { namespace thrift { -- 2.17.1