1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#!/usr/bin/ruby
#
# General purpose C++ code generation.
#
require 'amqpgen'
require 'set'
Copyright=<<EOS
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
EOS
CppKeywords = Set.new(["and", "and_eq", "asm", "auto", "bitand",
"bitor", "bool", "break", "case", "catch", "char",
"class", "compl", "const", "const_cast", "continue",
"default", "delete", "do", "DomainInfo", "double",
"dynamic_cast", "else", "enum", "explicit", "extern",
"false", "float", "for", "friend", "goto", "if",
"inline", "int", "long", "mutable", "namespace", "new",
"not", "not_eq", "operator", "or", "or_eq", "private",
"protected", "public", "register", "reinterpret_cast",
"return", "short", "signed", "sizeof", "static",
"static_cast", "struct", "switch", "template", "this",
"throw", "true", "try", "typedef", "typeid",
"typename", "union", "unsigned", "using", "virtual",
"void", "volatile", "wchar_t", "while", "xor",
"xor_eq"])
# Names that need a trailing "_" to avoid clashes.
CppMangle = CppKeywords+Set.new(["string"])
class String
def cppsafe()
CppMangle.include?(self) ? self+"_" : self
end
end
# Additional methods for AmqpField.
class AmqpField
def cppname() @cache_cppname ||= name.lcaps.cppsafe; end
def cpptype() @cache_cpptype ||= amqp_root.param_type(field_type); end
def type_name () @type_name ||= cpptype+" "+cppname; end
end
# Additional methods for AmqpMethod
class AmqpMethod
def cppname() @cache_cppname ||= name.lcaps.cppsafe; end
def param_names() @cache_param_names ||= fields.collect { |f| f.cppname }; end
def signature() @cache_signature ||= fields.collect { |f| f.cpptype+" "+f.cppname }; end
def body_name() @cache_body_name ||= amqp_parent.name.caps+name.caps+"Body"; end
end
# Additional methos for AmqpRoot
class AmqpRoot
# FIXME aconway 2007-06-20: fix u_int types, should be uint
CppTypeMap={
"bit"=> ["bool"],
"octet"=>["u_int8_t"],
"short"=>["u_int16_t"],
"long"=>["u_int32_t"],
"longlong"=>["u_int64_t"],
"timestamp"=>["u_int64_t"],
"longstr"=>["string", "const string&"],
"shortstr"=>["string", "const string&"],
"table"=>["FieldTable", "const FieldTable&", "const FieldTable&"],
"content"=>["Content", "const Content&", "const Content&"]
}
def lookup(amqptype)
CppTypeMap[amqptype] or raise "No cpp type for #{amqptype}";
end
def member_type(amqptype) lookup(amqptype)[0]; end
def param_type(amqptype) t=lookup(amqptype); t[1] or t[0]; end
def return_type(amqptype) t=lookup(amqptype); t[2] or t[0]; end
end
# Additional methods for AmqpClass
class AmqpClass
def cppname() @cache_cppname ||= name.caps; end
end
class CppGen < Generator
def initialize(outdir, *specs)
super(outdir,*specs)
end
# Write a header file.
def h_file(path)
guard=path.upcase.tr('./-','_')
file(path) {
gen "#ifndef #{guard}\n"
gen "#define #{guard}\n"
gen Copyright
yield
gen "#endif /*!#{guard}*/\n"
}
end
# Write a .cpp file.
def cpp_file(path)
file (path) do
gen Copyright
yield
end
end
end
|