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,28 @@
1
+ When I wanted to write a GUI tagger for KDE using Korundum (KDE Ruby
2
+ bindings), I discovered to my sadness that most of the tagging
3
+ extensions for Ruby were simple bindings for the C interface of the
4
+ most common TagLib library (that is written in C++ instead); writing
5
+ bindings for the C++ interface was quite a complex task, and boring as
6
+ it was to copy and paste the same code over and over.
7
+
8
+ For this reason I started first writing a simple extensions generator
9
+ that used a YAML description of the namespaces and the classes to
10
+ write bindings for. This method worked fine for what I was working on
11
+ (RubyTag++), and also allowed me to write quite quickly some Ruby
12
+ bindings for Hunspell too.
13
+
14
+ Unfortunately this generator was not adaptable enough to write
15
+ bindings for C libraries that used some object oriented interfaces,
16
+ and was a mess to extend to provide bindings more suitable to some
17
+ different cases than the ones I've already used the script for.
18
+
19
+ For this reason I've started working on Rust: a more flexible
20
+ extensions builder, that allowed to bind even C libraries by faking
21
+ some classes on Ruby (although I haven't implemented this yet).
22
+
23
+ Hopefully in the future Rust can be used to easily produce Ruby
24
+ bindings for a number of libraries that currently aren't available at
25
+ all.
26
+
27
+ To contact me, send me patches or comments, just write to
28
+ <flameeyes@gmail.com> .
@@ -0,0 +1,93 @@
1
+
2
+ require 'rust/cppifaceparser'
3
+
4
+
5
+ if __FILE__ == $0
6
+ def usage
7
+ puts "Use: #{File.basename($0)} [header] [module name] [output file]"
8
+ end
9
+
10
+ parser = Rust::Cpp::IfaceParser.new
11
+
12
+ if ARGV.size != 3 or not File.exists?(ARGV[0].to_s)
13
+ usage
14
+ exit 0
15
+ end
16
+
17
+ header = ARGV[0]
18
+ namespace = ARGV[1]
19
+ outputfile = ARGV[2]
20
+ outputfile += ".rb" if not outputfile =~ /\.rb$/
21
+
22
+ classes = parser.parseFile(header)
23
+
24
+ rust = %@
25
+ require 'rust'
26
+
27
+ Rust::Bindings::create_bindings Rust::Bindings::LangCxx, "#{namespace}" do |b|
28
+ b.include_header '#{header}', Rust::Bindings::HeaderGlobal
29
+ b.add_namespace "#{namespace}", "" do |ns|
30
+ @
31
+ classes.each { |klass|
32
+ rust += %@ ns.add_cxx_class "#{klass[:name]}" do |klass|\n@
33
+ klass[:constructors].each { |constructor|
34
+ rust += " klass.add_constructor "
35
+ if not constructor[:params].empty? and not constructor[:params].detect { |p| p[:type] =~ /void/ }
36
+ rust += "do |method|\n"
37
+ constructor[:params].each { |param|
38
+ rust += %@ method.add_parameter "#{param[:type]}", "#{param[:name]}"\n@
39
+ }
40
+ rust += " end"
41
+ end
42
+ rust += "\n"
43
+ }
44
+
45
+ klass[:methods].each { |method|
46
+ comment_method = false
47
+ if method[:params].detect { |p| p[:type] =~ /\s*\*\s*\*/ }
48
+ $stderr << "Ignoring method: #{method[:name]}\n"
49
+ comment_method = true
50
+ end
51
+
52
+ rust += "# " if comment_method
53
+ rust += %@ klass.add_method "#{method[:name]}", "#{method[:type]}"@
54
+ if not method[:params].empty? and not method[:params].detect { |p| p[:type] =~ /void/ }
55
+ rust += " do |method|\n" if not method[:params].empty?
56
+
57
+
58
+ method[:params].each { |param|
59
+ rust += "# " if comment_method
60
+ rust += %@ method.add_parameter "#{param[:type]}", "#{param[:name]}"\n@
61
+ }
62
+ rust += "# " if comment_method
63
+ rust += " end"
64
+ end
65
+
66
+ rust += "\n"
67
+ }
68
+ rust += " end\n"
69
+ }
70
+
71
+ rust += %@
72
+ end
73
+ end
74
+ @
75
+
76
+ File.open( outputfile, "w" ) { |f|
77
+ f << rust << "\n"
78
+ }
79
+
80
+ # Create configure.rb
81
+ File.open( File.dirname(outputfile)+"/configure.rb", "w" ) { |f|
82
+ f << %@
83
+ require 'mkmf'
84
+ find_header("rust_conversions.hh", "./include" )
85
+ eval File.open("#{File.basename(outputfile)}").readlines.to_s
86
+ create_makefile("#{namespace}")
87
+ @
88
+ }
89
+
90
+ end
91
+
92
+
93
+
@@ -0,0 +1,115 @@
1
+ /* Copyright (c) 2007 David Cuadrado <krawek@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
+
24
+ #ifndef __RUST_CHECKS__
25
+ #define __RUST_CHECKS__
26
+
27
+ #include <ruby.h>
28
+
29
+ static inline void rust_CheckType(VALUE *a)
30
+ {
31
+ Check_Type(a[0], NUM2INT(a[1]));
32
+ }
33
+
34
+ static inline bool isType(VALUE val, int type)
35
+ {
36
+ int result;
37
+ if( type == 0x0 ) return false;
38
+
39
+ VALUE args[2];
40
+ args[0] = (VALUE)val;
41
+ args[1] = INT2FIX(type);
42
+
43
+ rb_protect( (VALUE(*)(VALUE))rust_CheckType, (VALUE)args, &result);
44
+ return result == 0;
45
+ }
46
+
47
+
48
+ static inline bool is_object(VALUE val)
49
+ {
50
+ return isType(val, T_OBJECT);
51
+ }
52
+
53
+ static inline bool is_class(VALUE val)
54
+ {
55
+ return isType(val, T_CLASS);
56
+ }
57
+
58
+ static inline bool is_module(VALUE val)
59
+ {
60
+ return isType(val, T_MODULE);
61
+ }
62
+
63
+ static inline bool is_fLoat(VALUE val)
64
+ {
65
+ return isType(val, T_FLOAT);
66
+ }
67
+
68
+ static inline bool is_string(VALUE val)
69
+ {
70
+ return isType(val, T_STRING);
71
+ }
72
+
73
+ static inline bool is_regexp(VALUE val)
74
+ {
75
+ return isType(val, T_REGEXP);
76
+ }
77
+
78
+ static inline bool is_array(VALUE val)
79
+ {
80
+ return isType(val, T_ARRAY);
81
+ }
82
+
83
+ static inline bool is_int(VALUE val)
84
+ {
85
+ return isType(val, T_FIXNUM);
86
+ }
87
+
88
+ static inline bool is_hash(VALUE val)
89
+ {
90
+ return isType(val, T_HASH);
91
+ }
92
+
93
+ static inline bool is_symbol(VALUE val)
94
+ {
95
+ return isType(val, T_SYMBOL);
96
+ }
97
+
98
+ static inline bool is_bool(VALUE val)
99
+ {
100
+ return val == Qtrue || val == Qfalse;
101
+ }
102
+
103
+ static inline bool is_charPtr(VALUE val)
104
+ {
105
+ char *c = 0;
106
+ c = reinterpret_cast<char *>(DATA_PTR(val));
107
+
108
+ return c != 0; // FIXME
109
+ }
110
+
111
+
112
+
113
+
114
+ #endif
115
+
@@ -0,0 +1,102 @@
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
+
24
+ #ifndef __RUST_CONVERSIONS__
25
+ #define __RUST_CONVERSIONS__
26
+
27
+ #include <stdint.h>
28
+ #include <ruby.h>
29
+
30
+ /* Standard conversions for integer values */
31
+
32
+ static inline uint32_t ruby2uint(VALUE rval, int argn = -1) {
33
+ return NUM2UINT(rval);
34
+ }
35
+
36
+ static inline int32_t ruby2int(VALUE rval, int argn = -1) {
37
+ return NUM2INT(rval);
38
+ }
39
+
40
+ static inline VALUE cxx2ruby(int32_t val) {
41
+ return INT2FIX(val);
42
+ }
43
+
44
+ static inline VALUE cxx2ruby(uint32_t val) {
45
+ return INT2FIX(val);
46
+ }
47
+
48
+ static inline VALUE cxx2ruby(double val) {
49
+ return rb_float_new(val);
50
+ }
51
+
52
+ /* Standard conversions for stdint-provided types */
53
+ /* TODO: replace these with something more comples but that properly
54
+ handle a try to convert a number too big to stay into the size
55
+ requested.
56
+ */
57
+ #define ruby2uint32_t ruby2uint
58
+ #define ruby2uint16_t ruby2uint
59
+ #define ruby2uint8_t ruby2uint
60
+
61
+ #define ruby2int32_t ruby2int
62
+ #define ruby2int16_t ruby2int
63
+ #define ruby2int8_t ruby2int
64
+
65
+ /* Conversion for common types (like strings */
66
+
67
+ static inline int *ruby2intArray(VALUE rval, int argn = -1) {
68
+ int i;
69
+ RArray *array = RARRAY(rval);
70
+ int* ret = (int*)malloc(array->len*sizeof(int)); // FIXME: Leak!!!
71
+ for(i = 0; i < array->len; i++)
72
+ {
73
+ ret[i] = NUM2INT(array->ptr[i]);
74
+ }
75
+ return ret;
76
+ }
77
+
78
+ static inline char *ruby2charPtr(VALUE rval, int argn = -1) {
79
+ Check_Type(rval, T_STRING);
80
+ return StringValuePtr(rval);
81
+ }
82
+
83
+ static inline VALUE cxx2ruby(const char *val) {
84
+ if ( ! val ) return Qnil;
85
+ return rb_str_new2(val);
86
+ }
87
+
88
+ static inline VALUE cxx2ruby(const std::string &str) {
89
+ return rb_str_new2(str.c_str());
90
+ }
91
+
92
+ /* Booleans conversion */
93
+
94
+ static inline VALUE cxx2ruby(bool val) {
95
+ return val ? Qtrue : Qfalse;
96
+ }
97
+
98
+ static inline bool ruby2bool(VALUE rval, int argn = -1) {
99
+ return !( rval == Qnil || rval == Qfalse );
100
+ }
101
+
102
+ #endif
@@ -0,0 +1,67 @@
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 'pathname'
24
+
25
+ # Rust is a Ruby bindings generator, developed by Diego Pettenò
26
+ # <flameeyes@gmail.com>, based on a simpler Ruby bindings generator
27
+ # that was used for RubyTag++ and ruby-hunspell.
28
+ #
29
+ # The original bindings generator was designed to permit a 1:1 mapping
30
+ # between C++ classes and Ruby classes, as otherwise writing Ruby
31
+ # bindings for a C++-based library would have consisted of a long
32
+ # series of generic functions to convert the types from one language
33
+ # to the other and to call the methods.
34
+ #
35
+ # Most C bindings, instead, either writes a lot of C code to create
36
+ # "fake" Classes out of a vaguely object-oriented C API, or simply
37
+ # create a module where to put all the C functions to call.
38
+ #
39
+ # The objective of Rust is to allow the description of a C or C++
40
+ # interface, through the creation of 1:1 class mappings or the design
41
+ # of "fake" classes out of C functions, without the need to actually
42
+ # write all the generic code, as that does not really change beside
43
+ # names, types and parameters.
44
+ module Rust
45
+
46
+ # The Template singleton class is used to simulate a big hash of
47
+ # templates, loaded with the data from the templates/ subdirectory.
48
+ # In truth the templates are loaded only when requested, removing
49
+ # the one-line comments found inside the files (as they are usually
50
+ # just for documenting that particular template).
51
+ class Templates
52
+ @cache = { }
53
+ @tpls_dir = (Pathname.new File.dirname(__FILE__)) + "rust/templates"
54
+
55
+ def Templates.[](name)
56
+ return @cache[name].dup if @cache[name]
57
+
58
+ pn = @tpls_dir + "#{name}.rusttpl"
59
+ raise "Template #{name} not found." unless pn.exist?
60
+
61
+ @cache[name] = pn.read.gsub(/\/\/.*$\n?/, '')
62
+ return @cache[name].dup
63
+ end
64
+ end
65
+ end
66
+
67
+ require 'rust/bindings'
@@ -0,0 +1,51 @@
1
+ # Copyright (c) 2007 David Cuadrado <krawek@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 'set'
24
+ require 'rust/element'
25
+ require 'rust/type'
26
+
27
+ module Rust
28
+ class Attribute < Element
29
+ def initialize(name, type, opts)
30
+ super()
31
+
32
+ @name = name
33
+ @type = Type.new(type)
34
+ @options = opts
35
+
36
+ @declaration_template = ""
37
+ @definition_template = Templates["AttributeDefinition"]
38
+ @prototype_template = "void set!attribute_bindname!(VALUE self, VALUE val);\nVALUE get!attribute_bindname!(VALUE self);\n"
39
+ @initialization_template = Templates["AttributeInitBinding"]
40
+
41
+
42
+ add_expansion 'parent_varname', "@options[:parent].varname"
43
+ add_expansion 'attribute_bindname', "@name"
44
+ add_expansion 'attribute_type', "@type"
45
+ add_expansion 'attribute_name', "@name"
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+