#!/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.methods_.each { |m| include "qpid/framing/#{m.body_name}" } genl include "" include "" genl genl "using namespace std;" genl "using namespace qpid::framing;" genl scope("int main(int, char** argv) {") { genl "size_t maxSize=0;" @amqp.methods_.each { |m| genl "maxSize=max(maxSize, sizeof(#{m.body_name}));" } gen <()); break;" } genl "default: throw Exception(QPID_MSG(\"Invalid method id \" << m << \" for class #{c.name} \"));" } genl "break;" } genl "default: throw Exception(QPID_MSG(\"Invalid class id \" << c));" } } # CopyVisitor struct("#{@classname}::CopyVisitor", "public MethodBodyConstVisitor") { genl "MethodHolder& holder;" genl "CopyVisitor(MethodHolder& h) : holder(h) {}" @amqp.methods_.each { |m| genl "void visit(const #{m.body_name}& x) { holder.blob=x; }" } } genl # operator= scope("#{@classname}& MethodHolder::operator=(const AMQMethodBody& m) {") { genl "CopyVisitor cv(*this); m.accept(cv); return *this;" } }} end def generate gen_max_size gen_construct end end MethodHolderGen.new(Outdir, Amqp).generate();