summaryrefslogtreecommitdiff
path: root/cpp/rubygen
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2007-08-09 00:03:43 +0000
committerAlan Conway <aconway@apache.org>2007-08-09 00:03:43 +0000
commitba57e373864d44cfae17ec8c2c9de7a55f0b4113 (patch)
treebb16616df6e2a48b9cf164a52ca30fa99f90e1fd /cpp/rubygen
parentb3eb629f662dc2df11ce3981a7c4cc8ab58a8c28 (diff)
downloadqpid-python-ba57e373864d44cfae17ec8c2c9de7a55f0b4113.tar.gz
Moved Proxy generation to rubygen.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@564051 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/rubygen')
-rwxr-xr-xcpp/rubygen/amqpgen.rb6
-rwxr-xr-xcpp/rubygen/cppgen.rb6
-rwxr-xr-xcpp/rubygen/templates/Proxy.rb (renamed from cpp/rubygen/samples/Proxy.rb)56
3 files changed, 29 insertions, 39 deletions
diff --git a/cpp/rubygen/amqpgen.rb b/cpp/rubygen/amqpgen.rb
index 31f7544011..ae8e4c5d1c 100755
--- a/cpp/rubygen/amqpgen.rb
+++ b/cpp/rubygen/amqpgen.rb
@@ -114,7 +114,8 @@ class AmqpClass < AmqpElement
# chassis should be "client" or "server"
def methods_on(chassis)
- elements.collect("method/chassis[@name='#{chassis}']/..") { |m|
+ @cache_methods_on ||= { }
+ @cache_methods_on[chassis] ||= elements.collect("method/chassis[@name='#{chassis}']/..") { |m|
AmqpMethod.new(m,self)
}.sort_by_name
end
@@ -147,7 +148,8 @@ class AmqpRoot < AmqpElement
# Return all methods on chassis for all classes.
def methods_on(chassis)
- classes.collect { |c| c.methods_on(chassis) }.flatten
+ @cache_methods_on ||= { }
+ @cache_methods_on[chassis] ||= classes.collect { |c| c.methods_on(chassis) }.flatten
end
# Merge contents of elements.
diff --git a/cpp/rubygen/cppgen.rb b/cpp/rubygen/cppgen.rb
index 371cc7cd05..86783b4e14 100755
--- a/cpp/rubygen/cppgen.rb
+++ b/cpp/rubygen/cppgen.rb
@@ -69,8 +69,8 @@ end
# Additional methods for AmqpMethod
class AmqpMethod
def cppname() name.lcaps.cppsafe; end
- def param_names() fields.collect { |f| f.cppname }; end
- def signature() fields.collect { |f| f.cpptype+" "+f.cppname }; end
+ def param_names() @param_names ||= fields.collect { |f| f.cppname }; end
+ def signature() @signature ||= fields.collect { |f| f.cpptype+" "+f.cppname }; end
def body_name() amqp_parent.name.caps+name.caps+"Body"; end
end
@@ -96,7 +96,7 @@ class AmqpRoot
"table"=>["FieldTable", "const FieldTable&", "const FieldTable&"],
"content"=>["Content", "const Content&", "const Content&"],
"rfc1982-long-set"=>["SequenceNumberSet", "const SequenceNumberSet&", "const SequenceNumberSet&"],
- "uuid"=>["Uuid", "const Uuid&", "const Uuid&"]
+ "uuid"=>["string", "const string&"] # FIXME should be: ["Uuid", "const Uuid&", "const Uuid&"]
}
def lookup(amqptype)
diff --git a/cpp/rubygen/samples/Proxy.rb b/cpp/rubygen/templates/Proxy.rb
index f7765f3729..16824b3083 100755
--- a/cpp/rubygen/samples/Proxy.rb
+++ b/cpp/rubygen/templates/Proxy.rb
@@ -8,10 +8,9 @@ class ProxyGen < CppGen
super(outdir, amqp)
@chassis=chassis
@classname="AMQP_#{@chassis.caps}Proxy"
+ @filename="qpid/framing/#{@classname}"
end
- def include(m) gen "#include \"#{m.body_name}.h\"\n"; end
-
def proxy_member(c) c.name.lcaps+"Proxy"; end
def inner_class_decl(c)
@@ -22,6 +21,7 @@ class ProxyGen < CppGen
{
private:
ChannelAdapter& channel;
+ RequestId responseTo;
public:
// Constructors and destructors
@@ -31,7 +31,9 @@ class ProxyGen < CppGen
virtual ~#{cname}() {}
static #{cname}& get(#{@classname}& proxy) { return proxy.get#{cname}();}
-
+ // set for response correlation
+ void setResponseTo(RequestId r) { responseTo = r; }
+
// Protocol methods
EOS
indent(2) { c.methods_on(@chassis).each { |m| inner_method_decl(m) } }
@@ -39,7 +41,8 @@ EOS
end
def inner_method_decl(m)
- gen "virtual void #{m.cppname}(#{m.signature.join(",\n ")})\n\n";
+ genl "virtual RequestId #{m.cppname}(#{m.signature.join(",\n ")});"
+ genl
end
def inner_class_defn(c)
@@ -49,30 +52,16 @@ EOS
end
def inner_method_defn(m,cname)
- if m.response?
- rettype="void"
- ret=""
- sigadd=["RequestId responseTo"]
- paramadd=["channel.getVersion(), responseTo"]
- else
- rettype="RequestId"
- ret="return "
- sigadd=[]
- paramadd=["channel.getVersion()"]
- end
- sig=(m.signature+sigadd).join(", ")
- params=(paramadd+m.param_names).join(",\n ")
- gen <<EOS
-#{rettype} #{@classname}::#{cname}::#{m.cppname}(#{sig}) {
- #{ret}channel.send(new #{m.body_name}(#{params}));
-}
-
-EOS
+ genl "RequestId #{@classname}::#{cname}::#{m.cppname}(#{m.signature.join(", ")})"
+ scope {
+ params=(["channel.getVersion()"]+m.param_names).join(", ")
+ genl "return channel.send(make_shared_ptr(new #{m.body_name}(#{params})));"
+ }
end
def get_decl(c)
cname=c.name.caps
- gen " #{cname}& #{@classname}::get#{cname}();\n"
+ gen " #{cname}& get#{cname}();\n"
end
def get_defn(c)
@@ -87,7 +76,7 @@ EOS
def generate
# .h file
- h_file(@classname+".h") {
+ h_file(@filename) {
gen <<EOS
#include "qpid/framing/Proxy.h"
@@ -118,14 +107,13 @@ EOS
}
# .cpp file
- cpp_file(@classname+".cpp") {
- gen <<EOS
-#include <sstream>
-#include "#{@classname}.h"
-#include "qpid/framing/ChannelAdapter.h"
-#include "qpid/framing/amqp_types_full.h"
-EOS
- @amqp.methods_on(@chassis).each { |m| include(m) }
+ cpp_file(@filename) {
+ include "<sstream>"
+ include "#{@classname}.h"
+ include "qpid/framing/ChannelAdapter.h"
+ include "qpid/framing/amqp_types_full.h"
+ @amqp.methods_on(@chassis).each {
+ |m| include "qpid/framing/#{m.body_name}.h" }
gen <<EOS
namespace qpid {
namespace framing {
@@ -142,7 +130,7 @@ EOS
@amqp.classes.each { |c| get_defn(c) }
gen " // Inner class implementation\n\n"
@amqp.classes.each { |c| inner_class_defn(c) }
- gen "}} // namespae qpid::framing"
+ genl "}} // namespae qpid::framing"
}
end
end