gecoder 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +17 -0
- data/LGPL-LICENSE +458 -0
- data/README +20 -0
- data/Rakefile +6 -0
- data/ext/extconf.rb +29 -0
- data/ext/missing.cpp +295 -0
- data/ext/missing.h +116 -0
- data/ext/vararray.cpp +312 -0
- data/ext/vararray.h +146 -0
- data/lib/gecoder.rb +4 -0
- data/lib/gecoder/bindings.rb +7 -0
- data/lib/gecoder/bindings/bindings.rb +2055 -0
- data/lib/gecoder/interface.rb +6 -0
- data/lib/gecoder/interface/binding_changes.rb +111 -0
- data/lib/gecoder/interface/branch.rb +102 -0
- data/lib/gecoder/interface/constraints.rb +10 -0
- data/lib/gecoder/interface/constraints/distinct.rb +15 -0
- data/lib/gecoder/interface/constraints/linear.rb +158 -0
- data/lib/gecoder/interface/constraints/relation.rb +76 -0
- data/lib/gecoder/interface/enum_wrapper.rb +64 -0
- data/lib/gecoder/interface/model.rb +130 -0
- data/lib/gecoder/interface/search.rb +23 -0
- data/vendor/rust/README +28 -0
- data/vendor/rust/bin/cxxgenerator.rb +93 -0
- data/vendor/rust/include/rust_checks.hh +115 -0
- data/vendor/rust/include/rust_conversions.hh +103 -0
- data/vendor/rust/rust.rb +67 -0
- data/vendor/rust/rust/attribute.rb +51 -0
- data/vendor/rust/rust/bindings.rb +172 -0
- data/vendor/rust/rust/class.rb +334 -0
- data/vendor/rust/rust/constants.rb +48 -0
- data/vendor/rust/rust/container.rb +110 -0
- data/vendor/rust/rust/cppifaceparser.rb +129 -0
- data/vendor/rust/rust/cwrapper.rb +72 -0
- data/vendor/rust/rust/cxxclass.rb +98 -0
- data/vendor/rust/rust/element.rb +81 -0
- data/vendor/rust/rust/enum.rb +63 -0
- data/vendor/rust/rust/function.rb +407 -0
- data/vendor/rust/rust/namespace.rb +61 -0
- data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
- data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
- data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
- data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
- data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
- data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
- data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
- data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
- data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
- data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +12 -0
- data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
- data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
- data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
- data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
- data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
- data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
- data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +5 -0
- data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
- data/vendor/rust/rust/type.rb +98 -0
- data/vendor/rust/test/Makefile +4 -0
- data/vendor/rust/test/constants.rb +35 -0
- data/vendor/rust/test/cppclass.cc +40 -0
- data/vendor/rust/test/cppclass.hh +63 -0
- data/vendor/rust/test/cppclass.rb +59 -0
- data/vendor/rust/test/cwrapper.c +74 -0
- data/vendor/rust/test/cwrapper.h +41 -0
- data/vendor/rust/test/cwrapper.rb +56 -0
- data/vendor/rust/test/dummyclass.hh +31 -0
- data/vendor/rust/test/lib/extension-test.rb +98 -0
- data/vendor/rust/test/test-constants.rb +43 -0
- data/vendor/rust/test/test-cppclass.rb +82 -0
- data/vendor/rust/test/test-cwrapper.rb +77 -0
- metadata +144 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright (c) 2005-2007 Diego Pettenò <flameeyes@gmail.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge,
|
7
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
8
|
+
# and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
18
|
+
# BE LIABLE
|
19
|
+
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
20
|
+
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'rust/element'
|
24
|
+
|
25
|
+
module Rust
|
26
|
+
# This class represents a C/C++ constants or enumeration, it is
|
27
|
+
# simply going to map a Ruby constant with the given name under its
|
28
|
+
# parent with the given value
|
29
|
+
class Constant < Element
|
30
|
+
def initialize(name, value, parent)
|
31
|
+
super()
|
32
|
+
|
33
|
+
@name = name.upcase
|
34
|
+
@value = value
|
35
|
+
@parent = parent
|
36
|
+
|
37
|
+
@declaration_template = ""
|
38
|
+
@definition_template = ""
|
39
|
+
@initialization_template =
|
40
|
+
"rb_define_const(r!parent_varname!, \"!name!\", cxx2ruby(!value!));\n"
|
41
|
+
|
42
|
+
add_expansion 'parent_varname', '@parent.varname'
|
43
|
+
add_expansion 'name', '@name'
|
44
|
+
add_expansion 'value', '@value'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# Copyright (c) 2007 Diego Pettenò <flameeyes@gmail.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge,
|
7
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
8
|
+
# and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
18
|
+
# BE LIABLE
|
19
|
+
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
20
|
+
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'rust/element'
|
24
|
+
require 'rust/enum'
|
25
|
+
|
26
|
+
module Rust
|
27
|
+
# This class defines a 'container', an element that can contain
|
28
|
+
# functions, constants and classes. Both modules and classes are
|
29
|
+
# modules, as you can have singleton methods and constants in both
|
30
|
+
# of them
|
31
|
+
class Container < Element
|
32
|
+
def initialize
|
33
|
+
super
|
34
|
+
|
35
|
+
@functions = {}
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_cxx_class(name, parent = nil)
|
39
|
+
klass = CxxClass.new(name, self, parent)
|
40
|
+
|
41
|
+
yield klass
|
42
|
+
|
43
|
+
@children << klass
|
44
|
+
return klass
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_class_wrapper(name, type)
|
48
|
+
klass = ClassWrapper.new(name, type, self)
|
49
|
+
|
50
|
+
yield klass
|
51
|
+
|
52
|
+
@children << klass
|
53
|
+
return klass
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_function(name, return_value = "void", bindname = name)
|
57
|
+
function = Function.new({ :name => name,
|
58
|
+
:bindname => bindname,
|
59
|
+
:return => return_value,
|
60
|
+
:parent => self
|
61
|
+
})
|
62
|
+
|
63
|
+
begin
|
64
|
+
yield function
|
65
|
+
rescue LocalJumpError
|
66
|
+
# Ignore this, we can easily have methods without parameters
|
67
|
+
# or other extra informations.
|
68
|
+
end if block_given?
|
69
|
+
|
70
|
+
register_function(function)
|
71
|
+
|
72
|
+
return function
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_constant(name, value = name)
|
76
|
+
@children << Constant.new(name, value, self)
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_enum(name, ctype = nil)
|
80
|
+
enum = Enum.new(name, self, ctype)
|
81
|
+
|
82
|
+
yield enum
|
83
|
+
|
84
|
+
@children << enum
|
85
|
+
|
86
|
+
return enum
|
87
|
+
end
|
88
|
+
|
89
|
+
def add_namespace(name, cname = name)
|
90
|
+
ns = Namespace.new(name, cname, self)
|
91
|
+
|
92
|
+
yield ns
|
93
|
+
|
94
|
+
@children << ns
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
protected
|
99
|
+
def register_function(func)
|
100
|
+
key = func.name
|
101
|
+
if not @functions.has_key? key
|
102
|
+
@functions[key] = func
|
103
|
+
@children << func
|
104
|
+
else
|
105
|
+
@functions[key].add_overload(func)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rust
|
4
|
+
|
5
|
+
module Cpp
|
6
|
+
|
7
|
+
class IfaceParser
|
8
|
+
def initialize
|
9
|
+
end
|
10
|
+
|
11
|
+
def parseFile(path)
|
12
|
+
lines = ""
|
13
|
+
File.open(path) { |f|
|
14
|
+
lines = f.readlines.join
|
15
|
+
}
|
16
|
+
|
17
|
+
parse(lines)
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse(cpph)
|
21
|
+
classes = []
|
22
|
+
|
23
|
+
ignore = true
|
24
|
+
|
25
|
+
# FIXME: remove \n and split by ";" and "*/"
|
26
|
+
|
27
|
+
cpph.to_s.split(/$/).each { |line|
|
28
|
+
line = line.split("//").first
|
29
|
+
if line =~ /\/\*/ # open comment
|
30
|
+
ignore = true
|
31
|
+
end
|
32
|
+
|
33
|
+
if line =~ /\*\// # close comment
|
34
|
+
ignore = false
|
35
|
+
end
|
36
|
+
|
37
|
+
if line =~ /public:/
|
38
|
+
ignore = false
|
39
|
+
elsif line =~ /private:|protected:/
|
40
|
+
ignore = true
|
41
|
+
elsif line =~ /class\s+(\w+\s+){0,1}(\w+)/ # function
|
42
|
+
if not classes.last.nil?
|
43
|
+
if classes.last[:name] == $2
|
44
|
+
next
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
classes << {:name => $2, :methods => [], :constructors => [] }
|
49
|
+
elsif line =~ /namespace\s+(\w+)\s+\{{0,1}/
|
50
|
+
$stderr << "Warning: Namespace will be ignore.\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
if not ignore and classes.last
|
54
|
+
parseEntity(line, classes.last)
|
55
|
+
end
|
56
|
+
}
|
57
|
+
|
58
|
+
classes.delete_if { |klass|
|
59
|
+
klass[:methods].empty?
|
60
|
+
}
|
61
|
+
|
62
|
+
classes
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def parseEntity(line, klass)
|
67
|
+
if line =~ /((\w+::)*\w+)\s+(const\s+){0,1}(\*{0,3}|&){0,1}\s*(\w+)\s*\((.*)\)/
|
68
|
+
type = "#{$1}#{$4}"
|
69
|
+
fname = $5
|
70
|
+
params = []
|
71
|
+
|
72
|
+
if not $6.nil?
|
73
|
+
$6.strip!
|
74
|
+
if not $6.empty?
|
75
|
+
params = parseParams($6)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
klass[:methods] << { :name => fname, :type => type, :params => params }
|
80
|
+
elsif line =~ /^\s*#{klass[:name]}\s*\((.*)\)/ #constructor
|
81
|
+
params = parseParams($1)
|
82
|
+
klass[:constructors] << { :params => params }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def parseParams(params)
|
87
|
+
result = []
|
88
|
+
params.split(",").each { |param|
|
89
|
+
param = param.split("=").first
|
90
|
+
param.strip!
|
91
|
+
|
92
|
+
if param =~ /((\w+::)*\w+)\s*(const){0,1}(\*{0,3}|&){0,1}(const\s+){0,1}\s*(\w*)\s*$/
|
93
|
+
type = "#{$1}#{$2}#{$4}"
|
94
|
+
|
95
|
+
name = $6
|
96
|
+
if name.empty?
|
97
|
+
name = "par#{result.size}"
|
98
|
+
end
|
99
|
+
result << {:type => type, :name => name}
|
100
|
+
end
|
101
|
+
}
|
102
|
+
|
103
|
+
result
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end # Cpp
|
108
|
+
|
109
|
+
end # Rust
|
110
|
+
|
111
|
+
if __FILE__ == $0
|
112
|
+
parser = Rust::Cpp::IfaceParser.new
|
113
|
+
|
114
|
+
classes = parser.parseFile(ARGV[0].to_s)
|
115
|
+
|
116
|
+
classes.each { |klass|
|
117
|
+
puts "Class: #{klass[:name]}"
|
118
|
+
klass[:methods].each { |method|
|
119
|
+
params = "("
|
120
|
+
|
121
|
+
method[:params].each { |par|
|
122
|
+
params += "#{par[:type]} #{par[:name]}, "
|
123
|
+
}
|
124
|
+
params += ")"
|
125
|
+
puts "Method: #{method[:type]} #{method[:name]} #{params};"
|
126
|
+
}
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (c) 2005-2007 Diego Pettenò <flameeyes@gmail.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge,
|
7
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
8
|
+
# and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
18
|
+
# BE LIABLE
|
19
|
+
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
20
|
+
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
module Rust
|
24
|
+
|
25
|
+
# C class wrapper class, this is used to provide support for those
|
26
|
+
# wrappers around C libraries that are bound by Rust.
|
27
|
+
class ClassWrapper < Class
|
28
|
+
attr_reader :cleanup_functions
|
29
|
+
|
30
|
+
def initialize(name, type, namespace) # :notnew:
|
31
|
+
super(name, namespace)
|
32
|
+
|
33
|
+
@cname = type
|
34
|
+
@varcname = @cname.sub("*", "Ptr").gsub("::", "_").gsub(' ', '')
|
35
|
+
@cleanup_functions = ""
|
36
|
+
|
37
|
+
@definition_template = Templates["CWrapperClassDefinitions"]
|
38
|
+
@declaration_template << Templates["StandaloneClassDeclarations"]
|
39
|
+
|
40
|
+
add_expansion 'cleanup_functions', '@cleanup_functions'
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_constructor(name)
|
44
|
+
constructor = super()
|
45
|
+
|
46
|
+
constructor.name = name
|
47
|
+
|
48
|
+
return constructor
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_cleanup_function(call)
|
52
|
+
@cleanup_functions << call << "\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
# This class is used to represente the constructor of a C++ class
|
56
|
+
# bound in a Ruby extension.
|
57
|
+
class Constructor < Class::Constructor
|
58
|
+
attr_writer :name
|
59
|
+
|
60
|
+
def raw_call(nparam = nil)
|
61
|
+
"tmp = #{super(nparam)}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Method < Class::Method
|
66
|
+
def add_instance_parameter
|
67
|
+
add_static_parameter 'tmp'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Copyright (c) 2005-2007 Diego Pettenò <flameeyes@gmail.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge,
|
7
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
8
|
+
# and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
18
|
+
# BE LIABLE
|
19
|
+
# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
20
|
+
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'rust/class'
|
24
|
+
|
25
|
+
module Rust
|
26
|
+
class CxxClass < Class
|
27
|
+
# This function initializes the CxxClass instance by setting the
|
28
|
+
# values to the attributes defining its parent, namespace, name
|
29
|
+
# and a few other needed information.
|
30
|
+
#
|
31
|
+
# When a C++ Class is bound that is a child of another class, it
|
32
|
+
# shares its highest anchestor's pointer map (as that is the
|
33
|
+
# more general pointer type it can be referred to with), and
|
34
|
+
# function to call when free()'ing.
|
35
|
+
#
|
36
|
+
# Don't call this function directly, use Namespace.add_cxx_class
|
37
|
+
#
|
38
|
+
# *FIXME*: multiple inheritance can make Rust bail out, badly.
|
39
|
+
def initialize(name, namespace, parent = nil) # :notnew:
|
40
|
+
super(name, namespace)
|
41
|
+
@parent = parent
|
42
|
+
|
43
|
+
@children_classes = []
|
44
|
+
|
45
|
+
@definition_template = Templates["CxxClassDefinitions"]
|
46
|
+
|
47
|
+
@varname = "#{complete_name.gsub("::", "_")}"
|
48
|
+
|
49
|
+
if @parent
|
50
|
+
@ptrmap = @parent.ptrmap
|
51
|
+
@function_free = @parent.function_free
|
52
|
+
@parent_varname = "r#{@parent.varname}"
|
53
|
+
else
|
54
|
+
@declaration_template << Templates["StandaloneClassDeclarations"]
|
55
|
+
@definition_template << Templates["CxxStandaloneClassDefinitions"]
|
56
|
+
end
|
57
|
+
|
58
|
+
add_expansion 'test_children'
|
59
|
+
end
|
60
|
+
|
61
|
+
def custom_extends(parent)
|
62
|
+
@parent_varname = parent
|
63
|
+
end
|
64
|
+
|
65
|
+
# This function is used during ruby to C/C++ conversion of the
|
66
|
+
# types, and test for the deepest class the pointer is valid for.
|
67
|
+
def test_children
|
68
|
+
return unless @children_classes
|
69
|
+
|
70
|
+
ret = ""
|
71
|
+
|
72
|
+
@children_classes.each do |klass|
|
73
|
+
ret << %@
|
74
|
+
if ( dynamic_cast< #{klass.namespace.cname}::#{klass.name}* >(instance) != NULL )
|
75
|
+
{
|
76
|
+
klass = c#{klass.varname};
|
77
|
+
#{klass.test_children}
|
78
|
+
}
|
79
|
+
@
|
80
|
+
end
|
81
|
+
|
82
|
+
return ret
|
83
|
+
end
|
84
|
+
|
85
|
+
class Method < Class::Method
|
86
|
+
def raw_call(nparam = nil)
|
87
|
+
"tmp->#{super(nparam)}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class Constructor < Class::Constructor
|
92
|
+
def raw_call(nparam = nil)
|
93
|
+
"tmp = new #{@parent.namespace.cname}::#{super(nparam)}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|