"}" << 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<t_function*> functions = tservice->get_functions();
+ vector<t_function*>::iterator f_iter;
+
+ string list_type = string("std::vector<boost::shared_ptr<") + service_name_ + "If> >";
+
+ // 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<const facebook::thrift::protocol::TProtocol> protocol, " << list_type << "& servers) : " <<
+ service_name_ << "Server(protocol), _servers(servers) {}" << endl <<
+ indent() <<
+ service_name_ << "MultiServer(boost::shared_ptr<const facebook::thrift::protocol::TProtocol> iprot, boost::shared_ptr<const facebook::thrift::protocol::TProtocol> 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<t_field*>& args = arglist->get_members();
+ vector<t_field*>::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.
*