gecoder-with-gecode 0.9.0-x86-mswin32-60
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.
- data/CHANGES +137 -0
- data/COPYING +17 -0
- data/LGPL-LICENSE +458 -0
- data/README +58 -0
- data/Rakefile +14 -0
- data/example/equation_system.rb +15 -0
- data/example/example_helper.rb +1 -0
- data/example/magic_sequence.rb +43 -0
- data/example/money.rb +36 -0
- data/example/queens.rb +42 -0
- data/example/send_more_money.rb +43 -0
- data/example/send_most_money.rb +58 -0
- data/example/square_tiling.rb +84 -0
- data/example/sudoku-set.rb +106 -0
- data/example/sudoku.rb +56 -0
- data/lib/gecode.dll +0 -0
- data/lib/gecoder.rb +5 -0
- data/lib/gecoder/bindings.rb +96 -0
- data/lib/gecoder/bindings/bindings.rb +2029 -0
- data/lib/gecoder/interface.rb +9 -0
- data/lib/gecoder/interface/binding_changes.rb +9 -0
- data/lib/gecoder/interface/branch.rb +163 -0
- data/lib/gecoder/interface/constraints.rb +471 -0
- data/lib/gecoder/interface/constraints/bool/boolean.rb +251 -0
- data/lib/gecoder/interface/constraints/bool/channel.rb +7 -0
- data/lib/gecoder/interface/constraints/bool/linear.rb +200 -0
- data/lib/gecoder/interface/constraints/bool_enum/channel.rb +68 -0
- data/lib/gecoder/interface/constraints/bool_enum/extensional.rb +106 -0
- data/lib/gecoder/interface/constraints/bool_enum/relation.rb +55 -0
- data/lib/gecoder/interface/constraints/bool_enum_constraints.rb +84 -0
- data/lib/gecoder/interface/constraints/bool_var_constraints.rb +155 -0
- data/lib/gecoder/interface/constraints/extensional_regexp.rb +101 -0
- data/lib/gecoder/interface/constraints/fixnum_enum/element.rb +63 -0
- data/lib/gecoder/interface/constraints/fixnum_enum/operation.rb +65 -0
- data/lib/gecoder/interface/constraints/fixnum_enum_constraints.rb +42 -0
- data/lib/gecoder/interface/constraints/int/arithmetic.rb +150 -0
- data/lib/gecoder/interface/constraints/int/channel.rb +51 -0
- data/lib/gecoder/interface/constraints/int/domain.rb +80 -0
- data/lib/gecoder/interface/constraints/int/linear.rb +143 -0
- data/lib/gecoder/interface/constraints/int/relation.rb +141 -0
- data/lib/gecoder/interface/constraints/int_enum/arithmetic.rb +63 -0
- data/lib/gecoder/interface/constraints/int_enum/channel.rb +86 -0
- data/lib/gecoder/interface/constraints/int_enum/count.rb +66 -0
- data/lib/gecoder/interface/constraints/int_enum/distinct.rb +64 -0
- data/lib/gecoder/interface/constraints/int_enum/element.rb +64 -0
- data/lib/gecoder/interface/constraints/int_enum/equality.rb +37 -0
- data/lib/gecoder/interface/constraints/int_enum/extensional.rb +187 -0
- data/lib/gecoder/interface/constraints/int_enum/sort.rb +135 -0
- data/lib/gecoder/interface/constraints/int_enum_constraints.rb +95 -0
- data/lib/gecoder/interface/constraints/int_var_constraints.rb +230 -0
- data/lib/gecoder/interface/constraints/reifiable_constraints.rb +78 -0
- data/lib/gecoder/interface/constraints/selected_set/select.rb +120 -0
- data/lib/gecoder/interface/constraints/selected_set_constraints.rb +75 -0
- data/lib/gecoder/interface/constraints/set/cardinality.rb +65 -0
- data/lib/gecoder/interface/constraints/set/channel.rb +51 -0
- data/lib/gecoder/interface/constraints/set/connection.rb +130 -0
- data/lib/gecoder/interface/constraints/set/domain.rb +156 -0
- data/lib/gecoder/interface/constraints/set/include.rb +36 -0
- data/lib/gecoder/interface/constraints/set/operation.rb +118 -0
- data/lib/gecoder/interface/constraints/set/relation.rb +155 -0
- data/lib/gecoder/interface/constraints/set_elements/relation.rb +116 -0
- data/lib/gecoder/interface/constraints/set_elements_constraints.rb +97 -0
- data/lib/gecoder/interface/constraints/set_enum/channel.rb +45 -0
- data/lib/gecoder/interface/constraints/set_enum/distinct.rb +43 -0
- data/lib/gecoder/interface/constraints/set_enum/operation.rb +69 -0
- data/lib/gecoder/interface/constraints/set_enum/select.rb +79 -0
- data/lib/gecoder/interface/constraints/set_enum_constraints.rb +84 -0
- data/lib/gecoder/interface/constraints/set_var_constraints.rb +243 -0
- data/lib/gecoder/interface/enum_matrix.rb +64 -0
- data/lib/gecoder/interface/enum_wrapper.rb +205 -0
- data/lib/gecoder/interface/model.rb +453 -0
- data/lib/gecoder/interface/model_sugar.rb +84 -0
- data/lib/gecoder/interface/search.rb +197 -0
- data/lib/gecoder/interface/variables.rb +306 -0
- data/lib/gecoder/version.rb +4 -0
- data/specs/bool_var.rb +81 -0
- data/specs/branch.rb +185 -0
- data/specs/constraints/bool/boolean.rb +317 -0
- data/specs/constraints/bool/boolean_properties.rb +51 -0
- data/specs/constraints/bool/linear.rb +213 -0
- data/specs/constraints/bool_enum/bool_enum_relation.rb +117 -0
- data/specs/constraints/bool_enum/channel.rb +102 -0
- data/specs/constraints/bool_enum/extensional.rb +225 -0
- data/specs/constraints/constraint_helper.rb +234 -0
- data/specs/constraints/constraint_receivers.rb +103 -0
- data/specs/constraints/constraints.rb +26 -0
- data/specs/constraints/fixnum_enum/element.rb +58 -0
- data/specs/constraints/fixnum_enum/operation.rb +67 -0
- data/specs/constraints/int/arithmetic.rb +149 -0
- data/specs/constraints/int/channel.rb +101 -0
- data/specs/constraints/int/domain.rb +106 -0
- data/specs/constraints/int/linear.rb +183 -0
- data/specs/constraints/int/linear_properties.rb +97 -0
- data/specs/constraints/int/relation.rb +84 -0
- data/specs/constraints/int_enum/arithmetic.rb +72 -0
- data/specs/constraints/int_enum/channel.rb +57 -0
- data/specs/constraints/int_enum/count.rb +72 -0
- data/specs/constraints/int_enum/distinct.rb +80 -0
- data/specs/constraints/int_enum/element.rb +61 -0
- data/specs/constraints/int_enum/equality.rb +29 -0
- data/specs/constraints/int_enum/extensional.rb +224 -0
- data/specs/constraints/int_enum/sort.rb +167 -0
- data/specs/constraints/operands.rb +264 -0
- data/specs/constraints/property_helper.rb +443 -0
- data/specs/constraints/reification_sugar.rb +69 -0
- data/specs/constraints/selected_set/select.rb +56 -0
- data/specs/constraints/selected_set/select_properties.rb +157 -0
- data/specs/constraints/set/cardinality.rb +58 -0
- data/specs/constraints/set/cardinality_properties.rb +46 -0
- data/specs/constraints/set/channel.rb +77 -0
- data/specs/constraints/set/connection.rb +176 -0
- data/specs/constraints/set/domain.rb +197 -0
- data/specs/constraints/set/include.rb +36 -0
- data/specs/constraints/set/operation.rb +132 -0
- data/specs/constraints/set/relation.rb +117 -0
- data/specs/constraints/set_elements/relation.rb +84 -0
- data/specs/constraints/set_enum/channel.rb +80 -0
- data/specs/constraints/set_enum/distinct.rb +59 -0
- data/specs/constraints/set_enum/operation.rb +111 -0
- data/specs/constraints/set_enum/select.rb +73 -0
- data/specs/distribution.rb +14 -0
- data/specs/enum_matrix.rb +43 -0
- data/specs/enum_wrapper.rb +179 -0
- data/specs/examples.rb +17 -0
- data/specs/int_var.rb +163 -0
- data/specs/logging.rb +24 -0
- data/specs/model.rb +325 -0
- data/specs/model_sugar.rb +30 -0
- data/specs/search.rb +383 -0
- data/specs/selected_set.rb +39 -0
- data/specs/set_elements.rb +34 -0
- data/specs/set_var.rb +82 -0
- data/specs/spec_helper.rb +265 -0
- data/tasks/all_tasks.rb +1 -0
- data/tasks/dependencies.txt +22 -0
- data/tasks/distribution.rake +194 -0
- data/tasks/rcov.rake +18 -0
- data/tasks/specs.rake +21 -0
- data/tasks/svn.rake +16 -0
- data/tasks/website.rake +51 -0
- data/vendor/gecode/win32/lib/libgecodeint.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodekernel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeminimodel.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodesearch.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodeset.dll +0 -0
- data/vendor/gecode/win32/lib/libgecodesupport.dll +0 -0
- data/vendor/rust/README +28 -0
- data/vendor/rust/bin/cxxgenerator.rb +93 -0
- data/vendor/rust/include/rust_checks.hh +116 -0
- data/vendor/rust/include/rust_conversions.hh +102 -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 +337 -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 +96 -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 +100 -0
- data/vendor/rust/rust/templates/CxxMethodStub.rusttpl +12 -0
- data/vendor/rust/rust/templates/CxxStandaloneClassDefinitions.rusttpl +26 -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 +7 -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 +36 -0
- data/vendor/rust/test/cppclass.cc +45 -0
- data/vendor/rust/test/cppclass.hh +67 -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/operators.cc +41 -0
- data/vendor/rust/test/operators.hh +39 -0
- data/vendor/rust/test/operators.rb +39 -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 +80 -0
- data/vendor/rust/test/test-operators.rb +42 -0
- metadata +393 -0
@@ -0,0 +1,61 @@
|
|
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/cxxclass"
|
25
|
+
require "rust/cwrapper"
|
26
|
+
require "rust/constants"
|
27
|
+
|
28
|
+
module Rust
|
29
|
+
|
30
|
+
class Namespace < Container
|
31
|
+
attr_reader :name, :cname, :varname
|
32
|
+
|
33
|
+
def initialize(name, cname, parent = nil)
|
34
|
+
super()
|
35
|
+
|
36
|
+
@name = name
|
37
|
+
|
38
|
+
if parent.kind_of?(Namespace)
|
39
|
+
cname = "#{parent.cname}::#{cname}"
|
40
|
+
end
|
41
|
+
|
42
|
+
@parent = parent
|
43
|
+
@cname = cname == "" ? nil : cname
|
44
|
+
@varname = "#{@name.gsub("::", "_")}"
|
45
|
+
|
46
|
+
@declaration_template = Templates["ModuleDeclarations"]
|
47
|
+
@definition_template = Templates["ModuleDefinitions"]
|
48
|
+
unless parent.kind_of?(Namespace)
|
49
|
+
@initialization_template = "r!namespace_varname! = rb_define_module(\"!module_name!\");\n"
|
50
|
+
else
|
51
|
+
# TODO this should use the expansion
|
52
|
+
@initialization_template = "r!namespace_varname! = rb_define_module_under(r#{parent.varname}, \"#{@name}\");\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
add_expansion 'module_name', 'name'
|
56
|
+
add_expansion 'namespace_varname', 'varname'
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// Template of a generic C function call
|
3
|
+
|
4
|
+
VALUE set!parent_varname!!attribute_bindname!(VALUE self, VALUE val) {
|
5
|
+
!c_class_name!* tmp = ruby2!class_varcname!Ptr(self);
|
6
|
+
if ( ! tmp ) return Qnil;
|
7
|
+
|
8
|
+
tmp->!attribute_name! = ruby2!attribute_convert_name!(val);
|
9
|
+
return Qnil;
|
10
|
+
}
|
11
|
+
|
12
|
+
VALUE get!parent_varname!!attribute_bindname!(VALUE self) {
|
13
|
+
!c_class_name!* tmp = ruby2!class_varcname!Ptr(self);
|
14
|
+
if ( ! tmp ) return Qnil;
|
15
|
+
|
16
|
+
return cxx2ruby(static_cast<!attribute_type!>(tmp->!attribute_name!));
|
17
|
+
}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// Template for the init function snippet registering a method.
|
3
|
+
// Note that in the case of a method, !parent_varname! would be a
|
4
|
+
// synonim for !class_varname!.
|
5
|
+
|
6
|
+
// Set
|
7
|
+
rb_define_method(r!parent_varname!, "!attribute_bindname!=", RUBY_METHOD_FUNC(set!parent_varname!!attribute_bindname!), 1);
|
8
|
+
// Get
|
9
|
+
rb_define_method(r!parent_varname!, "!attribute_bindname!", RUBY_METHOD_FUNC(get!parent_varname!!attribute_bindname!), 0);
|
@@ -0,0 +1,24 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// General template for the header file (.hh) of the bindings.
|
3
|
+
// This is the base that's recursively expanded to create the actual
|
4
|
+
// header file.
|
5
|
+
//
|
6
|
+
// Please note that the ruby header and the C header files coming
|
7
|
+
// from the bound library are included with C linkage rules, while
|
8
|
+
// the rest of the header follows C++ linkage rules.
|
9
|
+
|
10
|
+
extern "C" {
|
11
|
+
#include <ruby.h>
|
12
|
+
!c_includes!
|
13
|
+
}
|
14
|
+
|
15
|
+
!cxx_includes!
|
16
|
+
|
17
|
+
/* This is for the ptrMap */
|
18
|
+
#include <map>
|
19
|
+
|
20
|
+
namespace Rust_!bindings_name! {
|
21
|
+
|
22
|
+
!modules_declaration!
|
23
|
+
|
24
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// General template for the unit file (.cc) of the bindings.
|
3
|
+
// This is the base that's recursively expanded to create the actual
|
4
|
+
// header file.
|
5
|
+
//
|
6
|
+
// Please note that the visibility is set to the Init function only
|
7
|
+
// if the build processo found it, so that all the other functions
|
8
|
+
// and types are actually considered hidden, and thus not exported by
|
9
|
+
// the extension. Unfortunately GCC's libstdc++ does not correctly
|
10
|
+
// hide all of its symbols yet.
|
11
|
+
|
12
|
+
// This is needed here because I need to put the rust_conversions.hh
|
13
|
+
// include inside these bindings' namespace.
|
14
|
+
#include <string>
|
15
|
+
|
16
|
+
#include "!bindings_name!.hh"
|
17
|
+
|
18
|
+
#ifdef DEBUG
|
19
|
+
#include <stdio.h> /* Used for fprintf */
|
20
|
+
#endif
|
21
|
+
|
22
|
+
namespace Rust_!bindings_name! {
|
23
|
+
|
24
|
+
#include <rust_conversions.hh>
|
25
|
+
#include <rust_checks.hh>
|
26
|
+
|
27
|
+
!custom_definition!
|
28
|
+
|
29
|
+
!modules_definition!
|
30
|
+
|
31
|
+
}
|
32
|
+
|
33
|
+
using namespace Rust_!bindings_name!;
|
34
|
+
|
35
|
+
extern "C" {
|
36
|
+
|
37
|
+
#ifdef HAVE_VISIBILITY
|
38
|
+
void Init_!bindings_name!() __attribute__((visibility("default")));
|
39
|
+
#endif
|
40
|
+
|
41
|
+
void Init_!bindings_name!() {
|
42
|
+
!modules_initialization!
|
43
|
+
!custom_initialization!
|
44
|
+
} /* Init_!bindings_name! */
|
45
|
+
|
46
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
|
3
|
+
VALUE r!class_varname!;
|
4
|
+
T!class_ptrmap! !class_ptrmap!;
|
5
|
+
|
6
|
+
!c_class_name!* ruby2!class_varcname!Ptr(VALUE rval) {
|
7
|
+
!c_class_name!* ptr;
|
8
|
+
Data_Get_Struct(rval, !c_class_name!, ptr);
|
9
|
+
|
10
|
+
if ( ptr ) return reinterpret_cast< !c_class_name!* >(ptr);
|
11
|
+
|
12
|
+
T!class_ptrmap!::iterator it = !class_ptrmap!.find(rval);
|
13
|
+
|
14
|
+
if ( it == !class_ptrmap!.end() ) {
|
15
|
+
rb_raise(rb_eRuntimeError, "Unable to find !c_class_name! instance for value %x (type %d)\\n", rval, TYPE(rval));
|
16
|
+
return NULL;
|
17
|
+
}
|
18
|
+
|
19
|
+
return reinterpret_cast< !c_class_name!* >((*it).second);
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
!c_class_name!& ruby2!class_varcname!Ptr(VALUE rval) {
|
24
|
+
return *ruby2!class_varcname!Ptr(rval);
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
VALUE cxx2ruby(!c_class_name!* instance) {
|
29
|
+
if ( instance == NULL ) return Qnil;
|
30
|
+
|
31
|
+
T!class_ptrmap!::iterator it, eend = !class_ptrmap!.end();
|
32
|
+
|
33
|
+
for(it = !class_ptrmap!.begin(); it != eend; it++)
|
34
|
+
if ( (*it).second == (!c_class_name!*)instance ) break;
|
35
|
+
|
36
|
+
if ( it != !class_ptrmap!.end() )
|
37
|
+
return (*it).first;
|
38
|
+
else {
|
39
|
+
VALUE klass = r!class_varname!;
|
40
|
+
|
41
|
+
VALUE rval = Data_Wrap_Struct(klass, 0, 0, (void*)instance);
|
42
|
+
!class_ptrmap![rval] = instance;
|
43
|
+
|
44
|
+
#ifdef DEBUG
|
45
|
+
fprintf(stderr, "rust: wrapping instance %p in value %x (type %d)\\n", instance, rval, TYPE(rval));
|
46
|
+
#endif
|
47
|
+
|
48
|
+
return rval;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
static VALUE !class_varname!_alloc(VALUE self) {
|
53
|
+
return Data_Wrap_Struct(self, 0, !class_free_function!, 0);
|
54
|
+
}
|
55
|
+
|
56
|
+
static void !class_varname!_free(void *p) {
|
57
|
+
T!class_ptrmap!::iterator it, eend = !class_ptrmap!.end();
|
58
|
+
for(it = !class_ptrmap!.begin(); it != eend; it++)
|
59
|
+
if ( (*it).second == (!c_class_name!*)p ) {
|
60
|
+
!class_ptrmap!.erase(it); break;
|
61
|
+
}
|
62
|
+
|
63
|
+
!cleanup_functions!;
|
64
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
|
3
|
+
extern VALUE r!class_varname!;
|
4
|
+
VALUE cxx2ruby(!c_class_name!* instance, bool free = false, bool create_new_if_needed = true);
|
5
|
+
bool is_!class_varname!(VALUE val);
|
6
|
+
!c_class_name!* ruby2!class_varcname!Ptr(VALUE rval, int argn = -1);
|
7
|
+
!c_class_name!& ruby2!class_varcname!(VALUE rval, int argn = -1);
|
@@ -0,0 +1,21 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// Template of a C++ Constructor stub, the function used to convert the
|
3
|
+
// parameters from Ruby objects to C++, and then call the real C++ constructor.
|
4
|
+
|
5
|
+
!function_prototype! {
|
6
|
+
!c_class_name!* tmp;
|
7
|
+
Data_Get_Struct(self, !c_class_name!, tmp);
|
8
|
+
|
9
|
+
/* The exception is thrown already by ruby2* if not found */
|
10
|
+
|
11
|
+
!function_call!;
|
12
|
+
|
13
|
+
DATA_PTR(self) = tmp;
|
14
|
+
!class_ptrmap![self] = tmp;
|
15
|
+
|
16
|
+
#ifdef DEBUG
|
17
|
+
fprintf(stderr, "rust: creating new instance of !c_class_name! (%p) with value %x\n", tmp, self);
|
18
|
+
#endif
|
19
|
+
|
20
|
+
return self;
|
21
|
+
}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
|
3
|
+
VALUE r!class_varname!;
|
4
|
+
|
5
|
+
bool is_!class_varname!(VALUE val)
|
6
|
+
{
|
7
|
+
if ( isType(val, T_DATA) )
|
8
|
+
{
|
9
|
+
!c_class_name! *obj = 0;
|
10
|
+
|
11
|
+
Data_Get_Struct(val, !c_class_name!, obj);
|
12
|
+
|
13
|
+
if( obj == 0 ) return false;
|
14
|
+
|
15
|
+
return rb_obj_is_kind_of(val, r!class_varname!) == Qtrue;
|
16
|
+
}
|
17
|
+
|
18
|
+
return false;
|
19
|
+
}
|
20
|
+
|
21
|
+
!c_class_name!* ruby2!class_varcname!Ptr(VALUE rval, int argn) {
|
22
|
+
if(rval == Qnil || rval == 0) return 0;
|
23
|
+
|
24
|
+
if( ! is_!class_varname!(rval) )
|
25
|
+
{
|
26
|
+
VALUE klass = rb_funcall(rval, rb_intern("class"), 0);
|
27
|
+
|
28
|
+
if( argn > 0)
|
29
|
+
rb_raise(rb_eArgError, "Expecting !c_class_name! given %s for argument %d", RSTRING(rb_funcall(klass, rb_intern("to_s"), 0))->ptr, argn);
|
30
|
+
else
|
31
|
+
rb_raise(rb_eArgError, "Expecting !c_class_name! given %s", RSTRING(rb_funcall(klass, rb_intern("to_s"), 0))->ptr, argn);
|
32
|
+
return 0;
|
33
|
+
}
|
34
|
+
|
35
|
+
!c_class_name!* ptr;
|
36
|
+
Data_Get_Struct(rval, !c_class_name!, ptr);
|
37
|
+
|
38
|
+
if ( ptr ) return dynamic_cast< !c_class_name!* >(ptr);
|
39
|
+
|
40
|
+
T!class_ptrmap!::iterator it = !class_ptrmap!.find(rval);
|
41
|
+
|
42
|
+
if ( it == !class_ptrmap!.end() ) {
|
43
|
+
rb_raise(rb_eRuntimeError, "Unable to find !c_class_name! instance for value %x (type %d)\\n", rval, TYPE(rval));
|
44
|
+
return NULL;
|
45
|
+
}
|
46
|
+
|
47
|
+
return dynamic_cast< !c_class_name!* >((*it).second);
|
48
|
+
}
|
49
|
+
|
50
|
+
!c_class_name!& ruby2!class_varcname!(VALUE rval, int argn) {
|
51
|
+
return *ruby2!class_varcname!Ptr(rval, argn);
|
52
|
+
}
|
53
|
+
|
54
|
+
VALUE cxx2ruby(!c_class_name!* instance, bool free, bool create_new_if_needed) {
|
55
|
+
if ( instance == NULL ) return Qnil;
|
56
|
+
|
57
|
+
T!class_ptrmap!::iterator it, eend = !class_ptrmap!.end();
|
58
|
+
|
59
|
+
#ifdef DEBUG
|
60
|
+
fprintf(stderr, "rust: searching for !c_class_name! %p\n", instance);
|
61
|
+
#endif
|
62
|
+
|
63
|
+
for(it = !class_ptrmap!.begin(); it != eend; it++)
|
64
|
+
if ( (*it).second == (!c_class_name!*)instance ) break;
|
65
|
+
|
66
|
+
if ( it != !class_ptrmap!.end() )
|
67
|
+
return (*it).first;
|
68
|
+
else {
|
69
|
+
#ifdef DEBUG
|
70
|
+
fprintf(stderr, "rust: failed to find match for %p\n", instance);
|
71
|
+
#endif
|
72
|
+
if(!create_new_if_needed) return Qnil;
|
73
|
+
|
74
|
+
VALUE klass = r!class_varname!;
|
75
|
+
|
76
|
+
!test_children!
|
77
|
+
|
78
|
+
VALUE rval;
|
79
|
+
if( !free )
|
80
|
+
{
|
81
|
+
rval = Data_Wrap_Struct(klass, 0, !class_map_free_function!, (void*)instance);
|
82
|
+
}
|
83
|
+
else
|
84
|
+
{
|
85
|
+
rval = Data_Wrap_Struct(klass, !class_mark_function!, !class_free_function!, (void*)instance);
|
86
|
+
}
|
87
|
+
|
88
|
+
!class_ptrmap![rval] = instance;
|
89
|
+
|
90
|
+
#ifdef DEBUG
|
91
|
+
fprintf(stderr, "rust: wrapping instance %p in value %x (type %d)\\n", instance, rval, TYPE(rval));
|
92
|
+
#endif
|
93
|
+
|
94
|
+
return rval;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
static VALUE !class_varname!_alloc(VALUE self) {
|
99
|
+
return Data_Wrap_Struct(self, !class_mark_function!, !class_free_function!, 0);
|
100
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
// Template of a C++ Method stub, the function used to convert the
|
3
|
+
// parameters from Ruby objects to C++, and then call the real C++ function.
|
4
|
+
|
5
|
+
!function_prototype! {
|
6
|
+
!c_class_name!* tmp = ruby2!class_varcname!Ptr(self);
|
7
|
+
if ( ! tmp ) return Qnil;
|
8
|
+
|
9
|
+
// The exception is thrown already by ruby2*
|
10
|
+
|
11
|
+
!function_call!
|
12
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
|
3
|
+
T!class_ptrmap! !class_ptrmap!;
|
4
|
+
|
5
|
+
static void !class_varname!_free(void *p) {
|
6
|
+
!class_map_free_function!(p);
|
7
|
+
delete (!c_class_name!*)p;
|
8
|
+
}
|
9
|
+
|
10
|
+
static void !class_varname!_free_map_entry(void *p) {
|
11
|
+
#ifdef DEBUG
|
12
|
+
fprintf(stderr, "rust: Freeing %p (!class_varname!) \\n", p);
|
13
|
+
#endif
|
14
|
+
|
15
|
+
T!class_ptrmap!::iterator it, eend = !class_ptrmap!.end();
|
16
|
+
for(it = !class_ptrmap!.begin(); it != eend; it++)
|
17
|
+
if ( (*it).second == (!c_class_name!*)p ) {
|
18
|
+
!class_ptrmap!.erase(it); break;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
static void !class_varname!_mark(void *p) {
|
23
|
+
#ifdef DEBUG
|
24
|
+
fprintf(stderr, "rust: Marking %p (!class_varname!) \\n", p);
|
25
|
+
#endif
|
26
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
//-*-c++-*-
|
2
|
+
|
3
|
+
!enum_cname! ruby2!enum_varname!(VALUE rval, int argn) {
|
4
|
+
int cval = ruby2int(rval, argn);
|
5
|
+
|
6
|
+
switch(cval) {
|
7
|
+
!enum_cases!
|
8
|
+
return static_cast<!enum_cname!>(cval);
|
9
|
+
default:
|
10
|
+
if( argn > 0)
|
11
|
+
rb_raise(rb_eArgError, "value %d for enum !enum_name! is out of bound for argument %d", cval, argn);
|
12
|
+
else
|
13
|
+
rb_raise(rb_eArgError, "value %d for enum !enum_name! is out of bound", cval);
|
14
|
+
return static_cast<!enum_cname!>(-1);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
bool is_!enum_varname!(VALUE rval) {
|
19
|
+
if( is_int(rval) )
|
20
|
+
{
|
21
|
+
switch(ruby2int(rval))
|
22
|
+
{
|
23
|
+
!enum_cases!
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
return false;
|
29
|
+
}
|