gecoder-with-gecode 0.7.1-mswin32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. data/CHANGES +81 -0
  2. data/COPYING +17 -0
  3. data/LGPL-LICENSE +458 -0
  4. data/README +45 -0
  5. data/Rakefile +13 -0
  6. data/example/example_helper.rb +1 -0
  7. data/example/magic_sequence.rb +43 -0
  8. data/example/queens.rb +43 -0
  9. data/example/raw_bindings.rb +42 -0
  10. data/example/send_more_money.rb +43 -0
  11. data/example/send_most_money.rb +58 -0
  12. data/example/square_tiling.rb +84 -0
  13. data/example/sudoku-set.rb +110 -0
  14. data/example/sudoku.rb +61 -0
  15. data/lib/gecode.dll +0 -0
  16. data/lib/gecoder.rb +5 -0
  17. data/lib/gecoder/bindings.rb +54 -0
  18. data/lib/gecoder/bindings/bindings.rb +2210 -0
  19. data/lib/gecoder/interface.rb +8 -0
  20. data/lib/gecoder/interface/binding_changes.rb +313 -0
  21. data/lib/gecoder/interface/branch.rb +152 -0
  22. data/lib/gecoder/interface/constraints.rb +397 -0
  23. data/lib/gecoder/interface/constraints/bool/boolean.rb +246 -0
  24. data/lib/gecoder/interface/constraints/bool/linear.rb +29 -0
  25. data/lib/gecoder/interface/constraints/bool_enum/boolean.rb +84 -0
  26. data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +8 -0
  27. data/lib/gecoder/interface/constraints/bool_var_constraints.rb +75 -0
  28. data/lib/gecoder/interface/constraints/int/arithmetic.rb +71 -0
  29. data/lib/gecoder/interface/constraints/int/domain.rb +78 -0
  30. data/lib/gecoder/interface/constraints/int/linear.rb +295 -0
  31. data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +72 -0
  32. data/lib/gecoder/interface/constraints/int_enum/channel.rb +100 -0
  33. data/lib/gecoder/interface/constraints/int_enum/count.rb +92 -0
  34. data/lib/gecoder/interface/constraints/int_enum/distinct.rb +69 -0
  35. data/lib/gecoder/interface/constraints/int_enum/element.rb +82 -0
  36. data/lib/gecoder/interface/constraints/int_enum/equality.rb +38 -0
  37. data/lib/gecoder/interface/constraints/int_enum/sort.rb +126 -0
  38. data/lib/gecoder/interface/constraints/int_enum_constraints.rb +37 -0
  39. data/lib/gecoder/interface/constraints/int_var_constraints.rb +58 -0
  40. data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
  41. data/lib/gecoder/interface/constraints/set/cardinality.rb +75 -0
  42. data/lib/gecoder/interface/constraints/set/connection.rb +193 -0
  43. data/lib/gecoder/interface/constraints/set/domain.rb +109 -0
  44. data/lib/gecoder/interface/constraints/set/operation.rb +132 -0
  45. data/lib/gecoder/interface/constraints/set/relation.rb +178 -0
  46. data/lib/gecoder/interface/constraints/set_enum/channel.rb +18 -0
  47. data/lib/gecoder/interface/constraints/set_enum/distinct.rb +80 -0
  48. data/lib/gecoder/interface/constraints/set_enum/operation.rb +60 -0
  49. data/lib/gecoder/interface/constraints/set_enum/selection.rb +217 -0
  50. data/lib/gecoder/interface/constraints/set_enum_constraints.rb +34 -0
  51. data/lib/gecoder/interface/constraints/set_var_constraints.rb +72 -0
  52. data/lib/gecoder/interface/enum_matrix.rb +64 -0
  53. data/lib/gecoder/interface/enum_wrapper.rb +153 -0
  54. data/lib/gecoder/interface/model.rb +251 -0
  55. data/lib/gecoder/interface/search.rb +123 -0
  56. data/lib/gecoder/interface/variables.rb +254 -0
  57. data/lib/gecoder/version.rb +4 -0
  58. data/specs/binding_changes.rb +76 -0
  59. data/specs/bool_var.rb +74 -0
  60. data/specs/branch.rb +170 -0
  61. data/specs/constraints/arithmetic.rb +266 -0
  62. data/specs/constraints/bool_enum.rb +140 -0
  63. data/specs/constraints/boolean.rb +232 -0
  64. data/specs/constraints/cardinality.rb +154 -0
  65. data/specs/constraints/channel.rb +126 -0
  66. data/specs/constraints/connection.rb +373 -0
  67. data/specs/constraints/constraint_helper.rb +180 -0
  68. data/specs/constraints/constraints.rb +74 -0
  69. data/specs/constraints/count.rb +139 -0
  70. data/specs/constraints/distinct.rb +218 -0
  71. data/specs/constraints/element.rb +106 -0
  72. data/specs/constraints/equality.rb +31 -0
  73. data/specs/constraints/int_domain.rb +69 -0
  74. data/specs/constraints/int_relation.rb +78 -0
  75. data/specs/constraints/linear.rb +332 -0
  76. data/specs/constraints/reification_sugar.rb +96 -0
  77. data/specs/constraints/selection.rb +292 -0
  78. data/specs/constraints/set_domain.rb +181 -0
  79. data/specs/constraints/set_operation.rb +285 -0
  80. data/specs/constraints/set_relation.rb +201 -0
  81. data/specs/constraints/sort.rb +175 -0
  82. data/specs/distribution.rb +14 -0
  83. data/specs/enum_matrix.rb +43 -0
  84. data/specs/enum_wrapper.rb +122 -0
  85. data/specs/int_var.rb +144 -0
  86. data/specs/logging.rb +24 -0
  87. data/specs/model.rb +190 -0
  88. data/specs/search.rb +246 -0
  89. data/specs/set_var.rb +68 -0
  90. data/specs/spec_helper.rb +93 -0
  91. data/tasks/all_tasks.rb +1 -0
  92. data/tasks/building.howto +65 -0
  93. data/tasks/distribution.rake +156 -0
  94. data/tasks/rcov.rake +17 -0
  95. data/tasks/specs.rake +15 -0
  96. data/tasks/svn.rake +11 -0
  97. data/tasks/website.rake +51 -0
  98. data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
  99. data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
  100. data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
  101. data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
  102. data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
  103. data/vendor/rust/README +28 -0
  104. data/vendor/rust/bin/cxxgenerator.rb +93 -0
  105. data/vendor/rust/include/rust_checks.hh +115 -0
  106. data/vendor/rust/include/rust_conversions.hh +102 -0
  107. data/vendor/rust/rust.rb +67 -0
  108. data/vendor/rust/rust/attribute.rb +51 -0
  109. data/vendor/rust/rust/bindings.rb +172 -0
  110. data/vendor/rust/rust/class.rb +339 -0
  111. data/vendor/rust/rust/constants.rb +48 -0
  112. data/vendor/rust/rust/container.rb +110 -0
  113. data/vendor/rust/rust/cppifaceparser.rb +129 -0
  114. data/vendor/rust/rust/cwrapper.rb +72 -0
  115. data/vendor/rust/rust/cxxclass.rb +98 -0
  116. data/vendor/rust/rust/element.rb +81 -0
  117. data/vendor/rust/rust/enum.rb +63 -0
  118. data/vendor/rust/rust/function.rb +407 -0
  119. data/vendor/rust/rust/namespace.rb +61 -0
  120. data/vendor/rust/rust/templates/AttributeDefinition.rusttpl +17 -0
  121. data/vendor/rust/rust/templates/AttributeInitBinding.rusttpl +9 -0
  122. data/vendor/rust/rust/templates/BindingsHeader.rusttpl +24 -0
  123. data/vendor/rust/rust/templates/BindingsUnit.rusttpl +46 -0
  124. data/vendor/rust/rust/templates/CWrapperClassDefinitions.rusttpl +64 -0
  125. data/vendor/rust/rust/templates/ClassDeclarations.rusttpl +7 -0
  126. data/vendor/rust/rust/templates/ClassInitialize.rusttpl +6 -0
  127. data/vendor/rust/rust/templates/ConstructorStub.rusttpl +21 -0
  128. data/vendor/rust/rust/templates/CxxClassDefinitions.rusttpl +91 -0
  129. data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
  130. data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -0
  131. data/vendor/rust/rust/templates/EnumDeclarations.rusttpl +3 -0
  132. data/vendor/rust/rust/templates/EnumDefinitions.rusttpl +29 -0
  133. data/vendor/rust/rust/templates/FunctionDefinition.rusttpl +9 -0
  134. data/vendor/rust/rust/templates/FunctionInitAlias.rusttpl +5 -0
  135. data/vendor/rust/rust/templates/FunctionInitBinding.rusttpl +9 -0
  136. data/vendor/rust/rust/templates/MethodInitBinding.rusttpl +9 -0
  137. data/vendor/rust/rust/templates/ModuleDeclarations.rusttpl +3 -0
  138. data/vendor/rust/rust/templates/ModuleDefinitions.rusttpl +3 -0
  139. data/vendor/rust/rust/templates/StandaloneClassDeclarations.rusttpl +7 -0
  140. data/vendor/rust/rust/templates/VariableFunctionCall.rusttpl +14 -0
  141. data/vendor/rust/rust/type.rb +98 -0
  142. data/vendor/rust/test/Makefile +4 -0
  143. data/vendor/rust/test/constants.rb +36 -0
  144. data/vendor/rust/test/cppclass.cc +45 -0
  145. data/vendor/rust/test/cppclass.hh +67 -0
  146. data/vendor/rust/test/cppclass.rb +59 -0
  147. data/vendor/rust/test/cwrapper.c +74 -0
  148. data/vendor/rust/test/cwrapper.h +41 -0
  149. data/vendor/rust/test/cwrapper.rb +56 -0
  150. data/vendor/rust/test/dummyclass.hh +31 -0
  151. data/vendor/rust/test/lib/extension-test.rb +98 -0
  152. data/vendor/rust/test/operators.cc +41 -0
  153. data/vendor/rust/test/operators.hh +39 -0
  154. data/vendor/rust/test/operators.rb +39 -0
  155. data/vendor/rust/test/test-constants.rb +43 -0
  156. data/vendor/rust/test/test-cppclass.rb +82 -0
  157. data/vendor/rust/test/test-cwrapper.rb +80 -0
  158. data/vendor/rust/test/test-operators.rb +42 -0
  159. metadata +293 -0
@@ -0,0 +1,172 @@
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/namespace'
24
+
25
+ module Rust
26
+ # Base class to use to create bindings for ruby.
27
+ # You shouldn't instantiate this manually, but rather use the
28
+ # create_bindings function.
29
+ class Bindings
30
+ # Constant to use with Bindings.create_bindings to state that the
31
+ # bindings that are to be created are for a C library.
32
+ LangC = "c"
33
+
34
+ # Constant to use with Bindings.create_bindings to state that the
35
+ # bindings that are to be created are for a C++ library.
36
+ LangCxx = "cxx"
37
+
38
+ # Constant to use with include_header method to state that the
39
+ # included header is a system library header.
40
+ HeaderGlobal = "global"
41
+
42
+ # Constant to use with include_header method to state that the
43
+ # included header is a local header.
44
+ HeaderLocal = "local"
45
+
46
+ def initialize(name, lang) # :notnew:
47
+ @name = name
48
+ @lang = lang
49
+
50
+ @modules = Array.new
51
+ @custom_definition = Array.new
52
+ @custom_initialization = Array.new
53
+
54
+ @cxx_includes = ""
55
+ @c_includes = ""
56
+ end
57
+
58
+ # This function is called when creating Ruby bindings for a
59
+ # library.
60
+ #
61
+ # The first parameter has to be one between Rust::Bindings::LangC
62
+ # or Rust::Bindings::LangCxx, and tells Rust which programming
63
+ # language the library to bind is written into.
64
+ #
65
+ # Please note that Rust always generates C++ code even when
66
+ # binding a library written in C, as STL templates are used all
67
+ # over the generics code.
68
+ def Bindings.create_bindings(lang, name)
69
+ bindings =
70
+ case lang
71
+ when Bindings::LangCxx, Bindings::LangC
72
+ bindings = Bindings.new(name, lang)
73
+ else
74
+ raise ArgumentError, "#{lang} is not a valid value for type parameter"
75
+ end
76
+
77
+ yield bindings
78
+
79
+ header = File.new("#{name}.hh", File::CREAT|File::TRUNC|File::RDWR)
80
+ unit = File.new("#{name}.cc", File::CREAT|File::TRUNC|File::RDWR)
81
+
82
+ header.puts bindings.header
83
+ unit.puts bindings.unit
84
+
85
+ header.close
86
+ unit.close
87
+ end
88
+
89
+ # Adds an include header with the specified name.
90
+ # This function adds to the list of header files to include the
91
+ # one with the specified name.
92
+ #
93
+ # If the scope paramether is set to Bindings.HeaderLocal, the name of
94
+ # the header file will be enclosed in double quotes ("") while
95
+ # including it, while it will be included it in angle quotes if
96
+ # the parameter is set to Bindings.HeaderGlobal (the default).
97
+ def include_header(name, scope = Bindings::HeaderGlobal, lang = @lang)
98
+ name =
99
+ case scope
100
+ when HeaderLocal then "\"#{name}\""
101
+ when HeaderGlobal then "<#{name}>"
102
+ else
103
+ raise ArgumentError, "#{scope} not a valid value for scope parameter."
104
+ end
105
+
106
+ case lang
107
+ when Bindings::LangCxx
108
+ @cxx_includes << "\n#include #{name}"
109
+ when Bindings::LangC
110
+ @c_includes << "\n#include #{name}"
111
+ end
112
+ end
113
+
114
+ # Binds a new Namespace to a Ruby module; the name parameter is
115
+ # used as the name of the module, while the cxxname one (if not
116
+ # null) is used to indicate the actual C++ namespace to use; when
117
+ # binding a C library, you should rather use the add_module
118
+ # function, although that's just a partial wrapper around this one.
119
+ def add_namespace(name, cxxname = nil)
120
+ cxxname = name if cxxname == nil
121
+
122
+ ns = Namespace.new(name, cxxname)
123
+
124
+ yield ns
125
+
126
+ @modules << ns
127
+ end
128
+
129
+ # Create a new Ruby module with the given name; this is used when
130
+ # binding C libraries, as they don't use namespace, so you have to
131
+ # create the modules from scratch.
132
+ def add_module(name)
133
+ add_namespace(name, "")
134
+ end
135
+
136
+ # Returns the content of the header for the bindings, recursively
137
+ # calling the proper functions to get the declarations for the
138
+ # modules bound and so on.
139
+ #
140
+ # This should *never* be used directly
141
+ def header
142
+ Templates["BindingsHeader"].
143
+ gsub("!bindings_name!", @name).
144
+ gsub("!modules_declaration!", @modules.collect { |ns| ns.declaration }.join("\n")).
145
+ gsub("!cxx_includes!", @cxx_includes).
146
+ gsub("!c_includes!", @c_includes)
147
+ end
148
+
149
+ # Returns the content of the unit for the bindings, recursively
150
+ # calling the proper functions to get the definitions and the
151
+ # initialisation function for the modules bound and so on.
152
+ #
153
+ # This should *never* be used directly
154
+ def unit
155
+ Templates["BindingsUnit"].
156
+ gsub("!bindings_name!", @name).
157
+ gsub("!modules_initialization!", @modules.collect { |ns| ns.initialization }.join("\n")).
158
+ gsub("!modules_definition!", @modules.collect { |ns| ns.definition }.join("\n")).
159
+ gsub("!custom_definition!", @custom_definition.join("\n")).
160
+ gsub("!custom_initialization!", @custom_initialization.join("\n"))
161
+ end
162
+
163
+ def add_custom_definition(element)
164
+ @custom_definition << element
165
+ end
166
+
167
+ def add_custom_initialization(initialization)
168
+ @custom_initialization << initialization
169
+ end
170
+ end
171
+
172
+ end
@@ -0,0 +1,339 @@
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/container'
24
+ require 'rust/function'
25
+ require 'rust/attribute'
26
+ require 'rust/type'
27
+
28
+ module Rust
29
+ class Class < Container
30
+ attr_accessor :bindname
31
+ attr_accessor :function_mark
32
+ attr_reader :name, :cname
33
+ attr_reader :varname, :varcname, :ptrmap, :function_free, :function_map_free, :parent_varname
34
+
35
+ # Rust::Namespace object for the class, used to get the proper C++
36
+ # name.
37
+ attr_reader :namespace
38
+
39
+ # This function initializes the Class instance by setting the
40
+ # values to the attributes defining its namespace, name
41
+ # and a few other needed information.
42
+ #
43
+ # Don't call this function directly, use Namespace.add_cxx_class
44
+ def initialize(name, namespace, bindname = name.split("::").last ) # :notnew:
45
+ super()
46
+
47
+ @name = name
48
+ @namespace = namespace
49
+
50
+ type = Type.new(complete_name)
51
+ @varname = type.valid_name
52
+ @parent_varname = "rb_cObject"
53
+
54
+ @ptrmap = "#{type.valid_name}Map"
55
+ @function_free = "#{varname}_free"
56
+ @function_map_free = "#{varname}_free_map_entry"
57
+ @function_mark = "#{varname}_mark"
58
+
59
+ @cname = @namespace.cname ? "#{@namespace.cname}::#{@name}" : @name
60
+
61
+ type = Type.new(@cname)
62
+ @varcname = type.valid_name
63
+ @bindname = bindname
64
+
65
+ @declaration_template = Templates["ClassDeclarations"]
66
+ @initialization_template = Templates["ClassInitialize"]
67
+
68
+ add_expansion 'class_varname', 'varname'
69
+ add_expansion 'class_varcname', 'varcname'
70
+ add_expansion 'c_class_name', 'cname'
71
+ # add_expansion 'c_class_basename', '@name.split("::").last'
72
+ add_expansion 'bind_name', '@bindname'
73
+ add_expansion 'class_ptrmap', 'ptrmap'
74
+ add_expansion 'class_free_function', '@function_free'
75
+ add_expansion 'class_map_free_function', '@function_map_free'
76
+ add_expansion 'class_mark_function', '@function_mark'
77
+ add_expansion 'parent_varname', '@parent_varname'
78
+ end
79
+
80
+ # Adds a new constructor for the class.
81
+ # This function creates a new constructor method for the C/C++
82
+ # class to bind, and yields it so that parameters can be added
83
+ # afterward.
84
+ def add_constructor
85
+ constructor = self.class::Constructor.new(self)
86
+
87
+ begin
88
+ yield constructor
89
+ rescue LocalJumpError
90
+ # Ignore this, we can easily have methods without parameters
91
+ # or other extra informations.
92
+ end if block_given?
93
+
94
+ register_function(constructor)
95
+
96
+ return constructor
97
+ end
98
+
99
+ # Adds a new method for the class.
100
+ # This function adds a new generic method for the class. In the
101
+ # case of C++ classes, this is an actual method of the bound
102
+ # class, while in case of Class Wrappers, this is just a function
103
+ # that expects to find a static parameter that is the instance
104
+ # pointer itself.
105
+ def add_method(name, return_value = "void", bindname = name)
106
+ method = self.class::Method.new({ :name => name,
107
+ :bindname => bindname,
108
+ :return => return_value,
109
+ :klass => self
110
+ })
111
+
112
+ begin
113
+ yield method
114
+ rescue LocalJumpError
115
+ # Ignore this, we can easily have methods without parameters
116
+ # or other extra informations.
117
+ end if block_given?
118
+
119
+ register_function(method)
120
+
121
+ method
122
+ end
123
+
124
+ def add_attribute(name, type, bindname = name)
125
+ attribute = Attribute.new(name, type, { :parent => self })
126
+
127
+ yield attribute if block_given?
128
+
129
+ @children << attribute
130
+
131
+ attribute
132
+ end
133
+
134
+ def add_operator(name, return_value, bindname = name)
135
+ operator = Class::Operator.new({ :name => name,
136
+ :bindname => bindname,
137
+ :return => return_value,
138
+ :klass => self
139
+ })
140
+ begin
141
+ yield operator
142
+ rescue LocalJumpError
143
+ end if block_given?
144
+
145
+ register_function(operator)
146
+
147
+
148
+ return operator
149
+ end
150
+
151
+ def complete_name
152
+ name = @name
153
+ parent = @parent
154
+ namespace = @namespace
155
+
156
+ if not parent.nil?
157
+ name = "#{parent.cname}::#{name}"
158
+ end
159
+
160
+ if not namespace.nil?
161
+ name = "#{namespace.cname}::#{name}"
162
+ end
163
+
164
+ return name if parent.nil?
165
+
166
+ while not parent.parent.nil?
167
+ name = "#{parent.parent.cname}::#{name}"
168
+ parent = parent.parent
169
+ end
170
+
171
+ return name if namespace.nil?
172
+
173
+ while not namespace.parent.nil?
174
+ name = "#{namespace.parent.cname}::#{name}"
175
+ namespace = namespace.parent
176
+ end
177
+
178
+ name
179
+ end
180
+
181
+ # Adds a new variable for the class. It's not an actual variable,
182
+ # as hopefully there aren't global or class public variables in
183
+ # any library.
184
+ # These virtual variables have setter and getter methods, usually
185
+ # called 'var' and 'setVar' in C++ (or 'getVar' and 'setVar'), and
186
+ # are mapped to 'var' and 'var=' in Ruby, so that setting the
187
+ # variable in Ruby will just call the setter method.
188
+ def add_variable(name, type, getter = nil, setter = nil)
189
+ getter = name unless getter
190
+ setter = "set" + name[0..0].capitalize + name[1..-1] unless
191
+ setter
192
+
193
+ method_get = add_method getter, type
194
+ method_get.add_alias name
195
+
196
+ method_set = add_method setter, "void"
197
+ method_set.add_alias "#{name}="
198
+
199
+ begin
200
+ yield method_get, method_set
201
+ rescue LocalJumpError
202
+ # Ignore this, we can easily have methods without parameters
203
+ # or other extra informations.
204
+ end if block_given?
205
+
206
+ method_set.add_parameter type, "value"
207
+
208
+ return [method_get, method_set]
209
+ end
210
+
211
+ # This class is used to represent a method for a C/C++ class bound
212
+ # in a Ruby extension. Through an object of this class you can add
213
+ # parameters and more to the method.
214
+ class Method < Function
215
+
216
+ # Initialisation function, calls Function.initialize and sets
217
+ # the important parameters that differs from a generic function
218
+ def initialize(params) # :notnew:
219
+ params[:parent] = params[:klass]
220
+ super
221
+
222
+ @varname =
223
+ "f#{@parent.namespace.name.gsub("::","_")}_#{@parent.name}_#{@name}"
224
+
225
+ @definition_template = Templates["CxxMethodStub"]
226
+ @initialization_template = Templates["MethodInitBinding"]
227
+ end
228
+ end
229
+
230
+ class Operator < Function
231
+ attr_reader :position # 1: pre 2: mid 3: post 4: mixed
232
+
233
+ def initialize(params)
234
+ params[:parent] = params[:klass]
235
+ super
236
+
237
+ type = Type.new(@parent.namespace.cname+"::"+@parent.cname)
238
+
239
+ @varname = "f#{type.valid_name}_#{valid_name}"
240
+
241
+ @definition_template = Templates["CxxMethodStub"]
242
+ @initialization_template = Templates["MethodInitBinding"]
243
+ end
244
+
245
+ def bind_call(nparam = nil)
246
+ case @return
247
+ when nil
248
+ raise "nil return value is not supported for non-constructors."
249
+ when "void"
250
+ return "#{raw_call(nparam)}; return Qnil;\n"
251
+ else
252
+ type = Type.new(@return)
253
+ if not @return.include?("*") and not type.native?
254
+ "return cxx2ruby( new #{@return.gsub("&", "")}(#{raw_call(nparam)}), true );\n" # XXX: needs a copy constructor
255
+ else
256
+ "return cxx2ruby( static_cast<#{@return}>(#{raw_call(nparam)}) );\n"
257
+ end
258
+ end
259
+ end
260
+
261
+ private
262
+ def raw_call(nparam = nil)
263
+ case @position
264
+ when 1 # pre
265
+ "#{@name} (*tmp)"
266
+ when 2 # mid
267
+ "(*tmp) #{@name[0].chr} #{params_conversion(nparam)} #{@name[@name.length-1].chr} "
268
+ when 4
269
+ "(*tmp) #{@name[0].chr} #{self.parameters[0].conversion} #{@name[1].chr} #{@name[@name.length-1].chr} #{self.parameters[1].conversion}" if self.parameters.size == 2
270
+ else
271
+ "(*tmp) #{@name} #{params_conversion(nparam)} "
272
+ end
273
+ end
274
+
275
+ def valid_name
276
+ case @name
277
+ when "+"
278
+ @position = 3
279
+ "plusop"
280
+ when "-"
281
+ @position = 3
282
+ "minusop"
283
+ when "*"
284
+ @position = 3
285
+ "multop"
286
+ when "/"
287
+ @position = 3
288
+ "divop"
289
+ when /\[\s*\]=/
290
+ @position = 4
291
+ "ateqop"
292
+ when /\[\s*\]/
293
+ @position = 2
294
+ "atop"
295
+ when "=="
296
+ @position = 3
297
+ "equalop"
298
+ when "!="
299
+ @position = 3
300
+ "notequalop"
301
+ when "<<"
302
+ @position = 3
303
+ "outstream"
304
+ when ">>"
305
+ @position = 3
306
+ "intstream"
307
+ when "!"
308
+ @position = 1
309
+ "notop"
310
+ else
311
+ @position = 3
312
+ "undefop_#{@name[0].chr.to_i}#{rand(1024)}"
313
+ end
314
+ end
315
+ end
316
+
317
+ # This class is used to represente the constructor of a C++ class
318
+ # bound in a Ruby extension.
319
+ class Constructor < Function
320
+
321
+ # Initialisation function, calls Function.initialise, but accepts
322
+ # only a single parameter, the class the constructor belong to.
323
+ def initialize(klass) # :notnew:
324
+ super({
325
+ :parent => klass,
326
+ :bindname => "initialize",
327
+ :name => klass.name
328
+ })
329
+
330
+ @definition_template = Templates["ConstructorStub"]
331
+ end
332
+
333
+ def bind_call(nparam = nil)
334
+ "#{raw_call(nparam)};\n"
335
+ end
336
+ end
337
+
338
+ end
339
+ end