summaryrefslogtreecommitdiff
path: root/cpp/rubygen
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/rubygen')
-rwxr-xr-xcpp/rubygen/cppgen.rb8
-rwxr-xr-xcpp/rubygen/templates/MethodHolder.rb67
2 files changed, 72 insertions, 3 deletions
diff --git a/cpp/rubygen/cppgen.rb b/cpp/rubygen/cppgen.rb
index 8feaeb9ba5..64987e763f 100755
--- a/cpp/rubygen/cppgen.rb
+++ b/cpp/rubygen/cppgen.rb
@@ -136,7 +136,9 @@ class CppGen < Generator
end
def include(header)
- genl /<.*>/.match(header) ? "#include #{header}" : "#include \"#{header}\""
+ header+=".h" unless /(\.h|[">])$/===header
+ header="\"#{header}\"" unless /(^<.*>$)|(^".*"$)/===header
+ genl "#include #{header}"
end
def scope(open="{",close="}", &block)
@@ -154,11 +156,11 @@ class CppGen < Generator
genl
end
- def struct_class(type, name, *bases, &block)
+ def struct_class(type, name, bases, &block)
genl
gen "#{type} #{name}"
gen ": #{bases.join(', ')}" unless bases.empty?
- scope(" {","};", &block)
+ scope(" {","};") { yield }
end
def struct(name, *bases, &block) struct_class("struct", name, bases, &block); end
diff --git a/cpp/rubygen/templates/MethodHolder.rb b/cpp/rubygen/templates/MethodHolder.rb
new file mode 100755
index 0000000000..a99270055f
--- /dev/null
+++ b/cpp/rubygen/templates/MethodHolder.rb
@@ -0,0 +1,67 @@
+#!/usr/bin/env ruby
+$: << ".." # Include .. in load path
+require 'cppgen'
+
+class MethodHolderGen < CppGen
+
+ def initialize(outdir, amqp)
+ super(outdir, amqp)
+ @namespace="qpid::framing"
+ @classname="MethodHolder"
+ @filename="qpid/framing/MethodHolder"
+ end
+
+ def gen_max_size()
+ # Generate program to generate MaxSize.h
+ cpp_file("generate_#{@classname}MaxSize_h") {
+ @amqp.amqp_methods.each { |m| include "qpid/framing/#{m.body_name}" }
+ genl
+ include "<algorithm>"
+ include "<fstream>"
+ genl
+ genl "using namespace std;"
+ genl "using namespace qpid::framing;"
+ genl
+ scope("int main(int argc, char** argv) {") {
+ genl "size_t maxSize=0;"
+ @amqp.amqp_methods.each { |m|
+ genl "maxSize=max(maxSize, sizeof(#{m.body_name}));" }
+ gen <<EOS
+ofstream out("#{@filename}MaxSize.h");
+out << "// GENERATED CODE: generated by " << argv[0] << endl;
+out << "namespace qpid{ namespace framing { " << endl;
+out << "const size_t MAX_METHODBODY_SIZE=" << maxSize << ";" << endl;
+out << "}}" << endl;
+EOS
+ }
+ }
+ end
+
+ def gen_construct
+ cpp_file(@filename+"_construct") {
+ include @filename
+ @amqp.amqp_methods.each { |m| include "qpid/framing/#{m.body_name}" }
+ genl
+ namespace(@namespace) {
+ scope("void #{@classname}::construct(const Id& newId) {") {
+ scope("switch (newId.first) {") {
+ @amqp.amqp_classes.each { |c|
+ scope("case #{c.index}: switch(newId.second) {") {
+ c.amqp_methods.each { |m|
+ genl "case #{m.index}: blob.construct(in_place<#{m.body_name}>()); break;"
+ }}
+ genl "break;"
+ }}
+ genl "id=newId;";
+ }}}
+ end
+
+
+ def generate
+ gen_max_size
+ gen_construct
+ end
+end
+
+MethodHolderGen.new(Outdir, Amqp).generate();
+