rice 3.0.0 → 4.0.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +121 -0
- data/CONTRIBUTORS.md +19 -0
- data/Gemfile +3 -0
- data/README.md +44 -1025
- data/Rakefile +95 -12
- data/include/rice/rice.hpp +7766 -0
- data/include/rice/stl.hpp +1113 -0
- data/lib/mkmf-rice.rb +127 -0
- data/lib/version.rb +3 -0
- data/rice/Address_Registration_Guard.ipp +75 -32
- data/rice/Address_Registration_Guard_defn.hpp +60 -56
- data/rice/Arg.hpp +80 -4
- data/rice/Arg.ipp +51 -0
- data/rice/Constructor.hpp +12 -14
- data/rice/Data_Object.ipp +234 -107
- data/rice/Data_Object_defn.hpp +77 -117
- data/rice/Data_Type.hpp +1 -2
- data/rice/Data_Type.ipp +251 -295
- data/rice/Data_Type_defn.hpp +175 -243
- data/rice/Director.hpp +11 -6
- data/rice/Enum.hpp +54 -104
- data/rice/Enum.ipp +104 -230
- data/rice/Exception.hpp +2 -8
- data/rice/Exception.ipp +65 -0
- data/rice/Exception_defn.hpp +46 -47
- data/rice/Identifier.hpp +28 -28
- data/rice/Identifier.ipp +23 -27
- data/rice/Return.hpp +39 -0
- data/rice/Return.ipp +33 -0
- data/rice/detail/Exception_Handler.ipp +22 -62
- data/rice/detail/Exception_Handler_defn.hpp +76 -91
- data/rice/detail/Iterator.hpp +18 -88
- data/rice/detail/Iterator.ipp +47 -0
- data/rice/detail/Jump_Tag.hpp +21 -0
- data/rice/detail/MethodInfo.hpp +44 -0
- data/rice/detail/MethodInfo.ipp +78 -0
- data/rice/detail/NativeAttribute.hpp +53 -0
- data/rice/detail/NativeAttribute.ipp +83 -0
- data/rice/detail/NativeFunction.hpp +69 -0
- data/rice/detail/NativeFunction.ipp +248 -0
- data/rice/detail/RubyFunction.hpp +39 -0
- data/rice/detail/RubyFunction.ipp +92 -0
- data/rice/detail/Type.hpp +29 -0
- data/rice/detail/Type.ipp +138 -0
- data/rice/detail/TypeRegistry.hpp +50 -0
- data/rice/detail/TypeRegistry.ipp +106 -0
- data/rice/detail/Wrapper.hpp +51 -0
- data/rice/detail/Wrapper.ipp +151 -0
- data/rice/detail/default_allocation_func.hpp +8 -19
- data/rice/detail/default_allocation_func.ipp +9 -8
- data/rice/detail/from_ruby.hpp +2 -37
- data/rice/detail/from_ruby.ipp +1020 -46
- data/rice/detail/from_ruby_defn.hpp +38 -0
- data/rice/detail/function_traits.hpp +124 -0
- data/rice/detail/method_data.hpp +23 -15
- data/rice/detail/method_data.ipp +53 -0
- data/rice/detail/rice_traits.hpp +116 -0
- data/rice/detail/ruby.hpp +9 -46
- data/rice/detail/to_ruby.hpp +3 -17
- data/rice/detail/to_ruby.ipp +409 -31
- data/rice/detail/to_ruby_defn.hpp +48 -0
- data/rice/forward_declares.ipp +82 -0
- data/rice/global_function.hpp +16 -20
- data/rice/global_function.ipp +8 -17
- data/rice/rice.hpp +59 -0
- data/rice/ruby_mark.hpp +5 -3
- data/rice/ruby_try_catch.hpp +4 -4
- data/rice/stl.hpp +11 -0
- data/sample/callbacks/extconf.rb +3 -0
- data/sample/callbacks/sample_callbacks.cpp +10 -13
- data/sample/enum/extconf.rb +3 -0
- data/sample/enum/sample_enum.cpp +3 -17
- data/sample/enum/test.rb +2 -2
- data/sample/inheritance/animals.cpp +8 -24
- data/sample/inheritance/extconf.rb +3 -0
- data/sample/inheritance/test.rb +1 -1
- data/sample/map/extconf.rb +3 -0
- data/sample/map/map.cpp +10 -18
- data/sample/map/test.rb +1 -1
- data/test/embed_ruby.cpp +18 -5
- data/test/ext/t1/extconf.rb +3 -0
- data/test/ext/t1/t1.cpp +1 -3
- data/test/ext/t2/extconf.rb +3 -0
- data/test/ext/t2/t2.cpp +1 -1
- data/test/extconf.rb +23 -0
- data/test/ruby/test_callbacks_sample.rb +28 -0
- data/test/ruby/test_multiple_extensions.rb +18 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
- data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
- data/test/test_Address_Registration_Guard.cpp +23 -10
- data/test/test_Array.cpp +129 -73
- data/test/test_Attribute.cpp +147 -0
- data/test/test_Builtin_Object.cpp +34 -14
- data/test/test_Class.cpp +149 -275
- data/test/test_Constructor.cpp +10 -9
- data/test/test_Data_Object.cpp +133 -192
- data/test/test_Data_Type.cpp +322 -252
- data/test/test_Director.cpp +54 -41
- data/test/test_Enum.cpp +228 -103
- data/test/test_Exception.cpp +5 -6
- data/test/test_Hash.cpp +31 -30
- data/test/test_Identifier.cpp +4 -5
- data/test/test_Inheritance.cpp +221 -0
- data/test/test_Iterator.cpp +161 -0
- data/test/test_Jump_Tag.cpp +1 -1
- data/test/test_Keep_Alive.cpp +161 -0
- data/test/test_Memory_Management.cpp +2 -4
- data/test/test_Module.cpp +167 -110
- data/test/test_Object.cpp +41 -21
- data/test/test_Ownership.cpp +275 -0
- data/test/test_Self.cpp +205 -0
- data/test/test_Stl_Optional.cpp +90 -0
- data/test/test_Stl_Pair.cpp +144 -0
- data/test/test_Stl_SmartPointer.cpp +200 -0
- data/test/test_Stl_String.cpp +74 -0
- data/test/test_Stl_Vector.cpp +652 -0
- data/test/test_String.cpp +1 -2
- data/test/test_Struct.cpp +29 -39
- data/test/test_Symbol.cpp +1 -2
- data/test/test_To_From_Ruby.cpp +249 -285
- data/test/test_global_functions.cpp +39 -19
- data/test/unittest.hpp +0 -4
- metadata +70 -141
- data/Doxyfile +0 -2268
- data/Makefile.am +0 -26
- data/Makefile.in +0 -931
- data/README.mingw +0 -8
- data/aclocal.m4 +0 -1085
- data/ax_cxx_compile_stdcxx.m4 +0 -951
- data/bootstrap +0 -8
- data/config.guess +0 -1421
- data/config.sub +0 -1807
- data/configure +0 -7792
- data/configure.ac +0 -55
- data/depcomp +0 -791
- data/doxygen.ac +0 -314
- data/doxygen.am +0 -186
- data/extconf.rb +0 -70
- data/install-sh +0 -501
- data/missing +0 -215
- data/post-autoconf.rb +0 -22
- data/post-automake.rb +0 -28
- data/rice/Address_Registration_Guard.cpp +0 -22
- data/rice/Arg_impl.hpp +0 -129
- data/rice/Arg_operators.cpp +0 -21
- data/rice/Arg_operators.hpp +0 -19
- data/rice/Array.hpp +0 -214
- data/rice/Array.ipp +0 -256
- data/rice/Builtin_Object.hpp +0 -8
- data/rice/Builtin_Object.ipp +0 -50
- data/rice/Builtin_Object_defn.hpp +0 -50
- data/rice/Class.cpp +0 -57
- data/rice/Class.hpp +0 -8
- data/rice/Class.ipp +0 -6
- data/rice/Class_defn.hpp +0 -84
- data/rice/Data_Type.cpp +0 -54
- data/rice/Data_Type_fwd.hpp +0 -12
- data/rice/Director.cpp +0 -13
- data/rice/Exception.cpp +0 -54
- data/rice/Exception_Base.hpp +0 -8
- data/rice/Exception_Base.ipp +0 -13
- data/rice/Exception_Base_defn.hpp +0 -27
- data/rice/Hash.hpp +0 -230
- data/rice/Hash.ipp +0 -329
- data/rice/Identifier.cpp +0 -8
- data/rice/Jump_Tag.hpp +0 -24
- data/rice/Makefile.am +0 -121
- data/rice/Makefile.in +0 -884
- data/rice/Module.cpp +0 -84
- data/rice/Module.hpp +0 -8
- data/rice/Module.ipp +0 -6
- data/rice/Module_defn.hpp +0 -88
- data/rice/Module_impl.hpp +0 -281
- data/rice/Module_impl.ipp +0 -345
- data/rice/Object.cpp +0 -169
- data/rice/Object.hpp +0 -8
- data/rice/Object.ipp +0 -33
- data/rice/Object_defn.hpp +0 -214
- data/rice/Require_Guard.hpp +0 -21
- data/rice/String.cpp +0 -89
- data/rice/String.hpp +0 -91
- data/rice/Struct.cpp +0 -117
- data/rice/Struct.hpp +0 -162
- data/rice/Struct.ipp +0 -26
- data/rice/Symbol.cpp +0 -25
- data/rice/Symbol.hpp +0 -66
- data/rice/Symbol.ipp +0 -44
- data/rice/config.hpp +0 -47
- data/rice/config.hpp.in +0 -46
- data/rice/detail/Arguments.hpp +0 -118
- data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
- data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
- data/rice/detail/Caster.hpp +0 -103
- data/rice/detail/Not_Copyable.hpp +0 -25
- data/rice/detail/Wrapped_Function.hpp +0 -33
- data/rice/detail/cfp.hpp +0 -24
- data/rice/detail/cfp.ipp +0 -51
- data/rice/detail/check_ruby_type.cpp +0 -27
- data/rice/detail/check_ruby_type.hpp +0 -23
- data/rice/detail/creation_funcs.hpp +0 -37
- data/rice/detail/creation_funcs.ipp +0 -36
- data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
- data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
- data/rice/detail/demangle.cpp +0 -56
- data/rice/detail/demangle.hpp +0 -19
- data/rice/detail/env.hpp +0 -11
- data/rice/detail/method_data.cpp +0 -92
- data/rice/detail/node.hpp +0 -13
- data/rice/detail/protect.cpp +0 -29
- data/rice/detail/protect.hpp +0 -34
- data/rice/detail/ruby_version_code.hpp +0 -6
- data/rice/detail/ruby_version_code.hpp.in +0 -6
- data/rice/detail/st.hpp +0 -22
- data/rice/detail/win32.hpp +0 -16
- data/rice/detail/wrap_function.hpp +0 -66
- data/rice/protect.hpp +0 -38
- data/rice/protect.ipp +0 -1134
- data/rice/rubypp.rb +0 -97
- data/rice/to_from_ruby.hpp +0 -8
- data/rice/to_from_ruby.ipp +0 -418
- data/rice/to_from_ruby_defn.hpp +0 -70
- data/ruby/Makefile.am +0 -1
- data/ruby/Makefile.in +0 -628
- data/ruby/lib/Makefile.am +0 -3
- data/ruby/lib/Makefile.in +0 -506
- data/ruby/lib/mkmf-rice.rb.in +0 -217
- data/ruby/lib/version.rb +0 -3
- data/ruby.ac +0 -135
- data/sample/Makefile.am +0 -53
- data/sample/Makefile.in +0 -495
- data/test/Makefile.am +0 -73
- data/test/Makefile.in +0 -1219
- data/test/ext/Makefile.am +0 -41
- data/test/ext/Makefile.in +0 -483
- data/test/test_rice.rb +0 -45
data/post-autoconf.rb
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
require 'fileutils'
|
|
2
|
-
require 'find'
|
|
3
|
-
|
|
4
|
-
def process(file)
|
|
5
|
-
puts "Post-processing #{file}"
|
|
6
|
-
File.open(file) do |input|
|
|
7
|
-
File.open("#{file}.pp", "w") do |output|
|
|
8
|
-
input.each_line do |line|
|
|
9
|
-
yield output, line
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
FileUtils.mv("#{file}.pp", "#{file}")
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
process("configure") do |out, line|
|
|
17
|
-
# autoconf doesn't properly enclose $srcdir and $am_aux_dir in quotes
|
|
18
|
-
line.gsub!(/([^"'])(\$srcdir)/, '\1"\2"')
|
|
19
|
-
line.gsub!(/([^"'])(\$am_aux_dir)/, '\1\"\2\"')
|
|
20
|
-
out.puts line
|
|
21
|
-
end
|
|
22
|
-
FileUtils.chmod(0700, "configure")
|
data/post-automake.rb
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require 'fileutils'
|
|
2
|
-
require 'find'
|
|
3
|
-
|
|
4
|
-
def process(file)
|
|
5
|
-
puts "Post-processing #{file}"
|
|
6
|
-
File.open(file) do |input|
|
|
7
|
-
File.open("#{file}.pp", "w") do |output|
|
|
8
|
-
input.each_line do |line|
|
|
9
|
-
yield output, line
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
FileUtils.mv("#{file}.pp", "#{file}")
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
Find.find(".") do |file|
|
|
17
|
-
if file =~ /Makefile.in$/ then
|
|
18
|
-
process(file) do |out, line|
|
|
19
|
-
# automake doesn't properly enclose $distdir in quotes
|
|
20
|
-
if line !~ /echo / then
|
|
21
|
-
line.gsub!(/([^"'])(\$\(distdir\))/, '\1"\2"')
|
|
22
|
-
end
|
|
23
|
-
line.gsub!(/(\$\(MKDIR_P\).*`)/, 'eval \1')
|
|
24
|
-
out.puts line
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#include "Address_Registration_Guard.hpp"
|
|
2
|
-
|
|
3
|
-
bool Rice::Address_Registration_Guard::enabled = true;
|
|
4
|
-
bool Rice::Address_Registration_Guard::exit_handler_registered = false;
|
|
5
|
-
|
|
6
|
-
static void disable_all_guards(VALUE)
|
|
7
|
-
{
|
|
8
|
-
Rice::Address_Registration_Guard::disable();
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
void Rice::Address_Registration_Guard::registerExitHandler()
|
|
12
|
-
{
|
|
13
|
-
if (exit_handler_registered) return;
|
|
14
|
-
rb_set_end_proc(&disable_all_guards, Qnil);
|
|
15
|
-
exit_handler_registered = true;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
void Rice::Address_Registration_Guard::disable()
|
|
19
|
-
{
|
|
20
|
-
enabled = false;
|
|
21
|
-
}
|
|
22
|
-
|
data/rice/Arg_impl.hpp
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
#ifndef Rice__Arg_Impl_hpp_
|
|
2
|
-
#define Rice__Arg_Impl_hpp_
|
|
3
|
-
|
|
4
|
-
namespace Rice {
|
|
5
|
-
|
|
6
|
-
//! Helper for defining default arguments of a method
|
|
7
|
-
/*! This class exposes the ability to define the default values of a
|
|
8
|
-
* wrapped method. Inspired by how Boost.Python handles keyword and
|
|
9
|
-
* default arguments, the syntax is simple:
|
|
10
|
-
*
|
|
11
|
-
* \code
|
|
12
|
-
* define_method(
|
|
13
|
-
* "method",
|
|
14
|
-
* &method,
|
|
15
|
-
* (Arg("arg1"), Arg("arg2") = 3, Arg("arg3") = true)
|
|
16
|
-
* );
|
|
17
|
-
* \endcode
|
|
18
|
-
*
|
|
19
|
-
* which means "for method &method, it takes 3 arguments
|
|
20
|
-
* [arg1, arg2, arg3]. Of these arguments, arg2's default is 3
|
|
21
|
-
* and arg3's default is true.
|
|
22
|
-
*
|
|
23
|
-
* It may be required to explicitly cast the type of the default
|
|
24
|
-
* value to prevent compilation errors.
|
|
25
|
-
*/
|
|
26
|
-
class Arg
|
|
27
|
-
{
|
|
28
|
-
public:
|
|
29
|
-
//! Initialize a new Arg with the name of the argument
|
|
30
|
-
/*! We require the name of the argument because 1) it makes code
|
|
31
|
-
* easier to read and 2) hopefully Ruby gets keyword arguments
|
|
32
|
-
* in the future and this means Rice will be ready for it.
|
|
33
|
-
*/
|
|
34
|
-
Arg(const char* name)
|
|
35
|
-
: name_(name)
|
|
36
|
-
, defaultValue(0)
|
|
37
|
-
{}
|
|
38
|
-
|
|
39
|
-
//! Copy Constructor
|
|
40
|
-
Arg(const Arg& other)
|
|
41
|
-
: name_(other.name()),
|
|
42
|
-
defaultValue(other.defaultValue ? other.defaultValue->clone() : 0)
|
|
43
|
-
{}
|
|
44
|
-
|
|
45
|
-
virtual ~Arg()
|
|
46
|
-
{
|
|
47
|
-
if(defaultValue) {
|
|
48
|
-
delete defaultValue;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
//! Set the default value for this Arg
|
|
53
|
-
/*! Set the default value for this argument.
|
|
54
|
-
* If this isn't called on this Arg, then this
|
|
55
|
-
* Arg is required in the method call.
|
|
56
|
-
*
|
|
57
|
-
* \param val the value to store as default
|
|
58
|
-
*/
|
|
59
|
-
template<typename Arg_Type>
|
|
60
|
-
Arg& operator=(Arg_Type val)
|
|
61
|
-
{
|
|
62
|
-
defaultValue = new type<Arg_Type>(val);
|
|
63
|
-
return *this;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
//! Check if this Arg has a default value associated with it
|
|
67
|
-
bool hasDefaultValue() const {
|
|
68
|
-
return defaultValue != 0;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
//! Return the default value associated with this Arg
|
|
72
|
-
/*! \return the type saved to this Arg
|
|
73
|
-
*/
|
|
74
|
-
template<typename Arg_Type>
|
|
75
|
-
Arg_Type getDefaultValue()
|
|
76
|
-
{
|
|
77
|
-
return static_cast< type<Arg_Type>* >(defaultValue)->held;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
//! Get the name of this Arg
|
|
81
|
-
const char* name() const
|
|
82
|
-
{
|
|
83
|
-
return name_;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private:
|
|
87
|
-
|
|
88
|
-
//! Name of the argument
|
|
89
|
-
const char* name_;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* The following is a stripped down version of
|
|
93
|
-
* Boost.Any.
|
|
94
|
-
*/
|
|
95
|
-
|
|
96
|
-
class type_base
|
|
97
|
-
{
|
|
98
|
-
public:
|
|
99
|
-
virtual ~type_base() {}
|
|
100
|
-
virtual type_base* clone() const = 0;
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
template<typename Type>
|
|
104
|
-
class type : public type_base
|
|
105
|
-
{
|
|
106
|
-
public:
|
|
107
|
-
type(Type value)
|
|
108
|
-
:held(value)
|
|
109
|
-
{}
|
|
110
|
-
|
|
111
|
-
virtual ~type() { }
|
|
112
|
-
|
|
113
|
-
virtual type_base* clone() const
|
|
114
|
-
{
|
|
115
|
-
return new type(held);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
Type held;
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
public:
|
|
122
|
-
|
|
123
|
-
//! Our saved default value
|
|
124
|
-
type_base* defaultValue;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
#endif // Rice__Arg_Impl_hpp_
|
data/rice/Arg_operators.cpp
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
#include "Arg_impl.hpp"
|
|
2
|
-
#include "detail/Arguments.hpp"
|
|
3
|
-
#include "Arg_operators.hpp"
|
|
4
|
-
|
|
5
|
-
namespace Rice {
|
|
6
|
-
|
|
7
|
-
Arguments* operator,(Arg arg1, Arg arg2)
|
|
8
|
-
{
|
|
9
|
-
Arguments* a = new Arguments();
|
|
10
|
-
a->add(arg1);
|
|
11
|
-
a->add(arg2);
|
|
12
|
-
return a;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
Arguments* operator,(Arguments* arguments, Arg arg)
|
|
16
|
-
{
|
|
17
|
-
arguments->add(arg);
|
|
18
|
-
return arguments;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
}
|
data/rice/Arg_operators.hpp
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
#ifndef Rice__Arg_Operators_hpp_
|
|
2
|
-
#define Rice__Arg_Operators_hpp_
|
|
3
|
-
|
|
4
|
-
namespace Rice
|
|
5
|
-
{
|
|
6
|
-
|
|
7
|
-
//! Build the list of Arg objects into an Arguments object
|
|
8
|
-
/*! Take a list of Arg objects and build up a single Argument
|
|
9
|
-
* object used later in method dispatch
|
|
10
|
-
*/
|
|
11
|
-
Arguments* operator,(Arg arg1, Arg arg2);
|
|
12
|
-
|
|
13
|
-
/*! @see operator,(Arg, Arg)
|
|
14
|
-
*/
|
|
15
|
-
Arguments* operator,(Arguments* arguments, Arg arg);
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
#endif // Rice__Arg_Operators_hpp_
|
data/rice/Array.hpp
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
#ifndef Rice__Array__hpp_
|
|
2
|
-
#define Rice__Array__hpp_
|
|
3
|
-
|
|
4
|
-
#include "Builtin_Object.hpp"
|
|
5
|
-
#include "to_from_ruby_defn.hpp"
|
|
6
|
-
#include "detail/ruby.hpp"
|
|
7
|
-
#include <iterator>
|
|
8
|
-
|
|
9
|
-
namespace Rice
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
//! A wrapper for the ruby Array class.
|
|
13
|
-
/*! This class provides a C++-style interface to ruby's Array class and
|
|
14
|
-
* its associated rb_ary_* functions.
|
|
15
|
-
* Example:
|
|
16
|
-
* \code
|
|
17
|
-
* Array a;
|
|
18
|
-
* a.push(String("some string"));
|
|
19
|
-
* a.push(42);
|
|
20
|
-
* \endcode
|
|
21
|
-
*/
|
|
22
|
-
class Array
|
|
23
|
-
: public Builtin_Object<T_ARRAY>
|
|
24
|
-
{
|
|
25
|
-
public:
|
|
26
|
-
//! Construct a new array
|
|
27
|
-
Array();
|
|
28
|
-
|
|
29
|
-
//! Wrap an existing array
|
|
30
|
-
/*! \param v a ruby object, which must be of type T_ARRAY.
|
|
31
|
-
*/
|
|
32
|
-
Array(Object v);
|
|
33
|
-
|
|
34
|
-
//! Wrap an existing array
|
|
35
|
-
/*! \param v a ruby object, which must be of type T_ARRAY.
|
|
36
|
-
*/
|
|
37
|
-
Array(VALUE v);
|
|
38
|
-
|
|
39
|
-
//! Construct an array from a sequence.
|
|
40
|
-
/*! \param begin an iterator to the beginning of the sequence.
|
|
41
|
-
* \param end an iterator to the end of the sequence.
|
|
42
|
-
*/
|
|
43
|
-
template<typename Iter_T>
|
|
44
|
-
Array(Iter_T begin, Iter_T end);
|
|
45
|
-
|
|
46
|
-
//! Construct an Array from a C array.
|
|
47
|
-
/*! \param a a C array of type T and size n.
|
|
48
|
-
*/
|
|
49
|
-
template<typename T, long n>
|
|
50
|
-
Array(T const (& a)[n]);
|
|
51
|
-
|
|
52
|
-
public:
|
|
53
|
-
//! Return the size of the array.
|
|
54
|
-
long size() const;
|
|
55
|
-
|
|
56
|
-
//! Return the element at the given index.
|
|
57
|
-
/*! \param index The index of the desired element. The index may be
|
|
58
|
-
* negative, to indicate an offset from the end of the array. If the
|
|
59
|
-
* index is out of bounds, this function has undefined behavior.
|
|
60
|
-
* \return the element at the given index.
|
|
61
|
-
*/
|
|
62
|
-
Object operator[](long index) const;
|
|
63
|
-
|
|
64
|
-
private:
|
|
65
|
-
//! A helper class so array[index]=value can work.
|
|
66
|
-
class Proxy;
|
|
67
|
-
|
|
68
|
-
public:
|
|
69
|
-
//! Return a reference to the element at the given index.
|
|
70
|
-
/*! \param index The index of the desired element. The index may be
|
|
71
|
-
* negative, to indicate an offset from the end of the array. If the
|
|
72
|
-
* index is out of bounds, this function has undefined behavior.
|
|
73
|
-
* \return the element at the given index.
|
|
74
|
-
*/
|
|
75
|
-
Proxy operator[](long index);
|
|
76
|
-
|
|
77
|
-
//! Push an element onto the end of the array
|
|
78
|
-
/*! \param v an object to push onto the array.
|
|
79
|
-
* \return the object which was pushed onto the array.
|
|
80
|
-
*/
|
|
81
|
-
template<typename T>
|
|
82
|
-
Object push(T const & obj);
|
|
83
|
-
|
|
84
|
-
//! Pop an element from the end of the array
|
|
85
|
-
/*! \return the object which was popped from the array, or Qnil if
|
|
86
|
-
* the array was empty.
|
|
87
|
-
*/
|
|
88
|
-
Object pop();
|
|
89
|
-
|
|
90
|
-
//! Unshift an element onto the beginning of the array
|
|
91
|
-
/*! \param v an object to unshift onto the array.
|
|
92
|
-
* \return the object which was unshifted onto the array.
|
|
93
|
-
*/
|
|
94
|
-
template<typename T>
|
|
95
|
-
Object unshift(T const & obj);
|
|
96
|
-
|
|
97
|
-
//! Shift an element from the beginning of the array
|
|
98
|
-
/*! \return the object which was shifted from the array.
|
|
99
|
-
*/
|
|
100
|
-
Object shift();
|
|
101
|
-
|
|
102
|
-
private:
|
|
103
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
104
|
-
class Iterator;
|
|
105
|
-
|
|
106
|
-
long position_of(long index) const;
|
|
107
|
-
|
|
108
|
-
public:
|
|
109
|
-
//! An iterator.
|
|
110
|
-
typedef Iterator<Array &, Proxy> iterator;
|
|
111
|
-
|
|
112
|
-
//! A const iterator.
|
|
113
|
-
typedef Iterator<Array const &, Object> const_iterator;
|
|
114
|
-
|
|
115
|
-
//! Return an iterator to the beginning of the array.
|
|
116
|
-
iterator begin();
|
|
117
|
-
|
|
118
|
-
//! Return a const iterator to the beginning of the array.
|
|
119
|
-
const_iterator begin() const;
|
|
120
|
-
|
|
121
|
-
//! Return an iterator to the end of the array.
|
|
122
|
-
iterator end();
|
|
123
|
-
|
|
124
|
-
//! Return a const iterator to the end of the array.
|
|
125
|
-
const_iterator end() const;
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
//! A helper class so array[index]=value can work.
|
|
129
|
-
class Array::Proxy
|
|
130
|
-
{
|
|
131
|
-
public:
|
|
132
|
-
//! Construct a new Proxy
|
|
133
|
-
Proxy(Array array, long index);
|
|
134
|
-
|
|
135
|
-
//! Implicit conversion to Object.
|
|
136
|
-
operator Object() const;
|
|
137
|
-
|
|
138
|
-
//! Explicit conversion to VALUE.
|
|
139
|
-
VALUE value() const;
|
|
140
|
-
|
|
141
|
-
//! Assignment operator.
|
|
142
|
-
template<typename T>
|
|
143
|
-
Object operator=(T const & value);
|
|
144
|
-
|
|
145
|
-
private:
|
|
146
|
-
Array array_;
|
|
147
|
-
long index_;
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
//! A helper class for implementing iterators for a Array.
|
|
151
|
-
// TODO: This really should be a random-access iterator.
|
|
152
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
153
|
-
class Array::Iterator
|
|
154
|
-
{
|
|
155
|
-
public:
|
|
156
|
-
using iterator_category = std::forward_iterator_tag;
|
|
157
|
-
using value_type = Value_T;
|
|
158
|
-
using difference_type = long;
|
|
159
|
-
using pointer = Object*;
|
|
160
|
-
using reference = Value_T&;
|
|
161
|
-
|
|
162
|
-
Iterator(Array_Ref_T array, long index);
|
|
163
|
-
|
|
164
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
165
|
-
Iterator(Iterator<Array_Ref_T_, Value_T_> const & rhs);
|
|
166
|
-
|
|
167
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
168
|
-
Iterator & operator=(Iterator<Array_Ref_T_, Value_T_> const & rhs);
|
|
169
|
-
|
|
170
|
-
Iterator & operator++();
|
|
171
|
-
Iterator operator++(int);
|
|
172
|
-
Value_T operator*();
|
|
173
|
-
Object * operator->();
|
|
174
|
-
|
|
175
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
176
|
-
bool operator==(Iterator<Array_Ref_T_, Value_T_> const & rhs) const;
|
|
177
|
-
|
|
178
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
179
|
-
bool operator!=(Iterator<Array_Ref_T_, Value_T_> const & rhs) const;
|
|
180
|
-
|
|
181
|
-
// Causes ICE on g++ 3.3.3
|
|
182
|
-
// template<typename Array_Ref_T_, typename Value_T_>
|
|
183
|
-
// friend class Iterator;
|
|
184
|
-
|
|
185
|
-
Array_Ref_T array() const;
|
|
186
|
-
long index() const;
|
|
187
|
-
|
|
188
|
-
private:
|
|
189
|
-
Array_Ref_T array_;
|
|
190
|
-
long index_;
|
|
191
|
-
|
|
192
|
-
Object tmp_;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
} // namespace Rice
|
|
196
|
-
|
|
197
|
-
template<>
|
|
198
|
-
inline
|
|
199
|
-
Rice::Array from_ruby<Rice::Array>(Rice::Object x)
|
|
200
|
-
{
|
|
201
|
-
return Rice::Array(x);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
template<>
|
|
205
|
-
inline
|
|
206
|
-
Rice::Object to_ruby<Rice::Array>(Rice::Array const & x)
|
|
207
|
-
{
|
|
208
|
-
return x;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
#include "Array.ipp"
|
|
212
|
-
|
|
213
|
-
#endif // Rice__Array__hpp_
|
|
214
|
-
|
data/rice/Array.ipp
DELETED
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
#ifndef Rice__Array__ipp_
|
|
2
|
-
#define Rice__Array__ipp_
|
|
3
|
-
|
|
4
|
-
#include "protect.hpp"
|
|
5
|
-
|
|
6
|
-
inline Rice::Array::
|
|
7
|
-
Array()
|
|
8
|
-
: Builtin_Object<T_ARRAY>(protect(rb_ary_new))
|
|
9
|
-
{
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
inline Rice::Array::
|
|
13
|
-
Array(Object v)
|
|
14
|
-
: Builtin_Object<T_ARRAY>(v)
|
|
15
|
-
{
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
inline Rice::Array::
|
|
19
|
-
Array(VALUE v)
|
|
20
|
-
: Builtin_Object<T_ARRAY>(v)
|
|
21
|
-
{
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
template<typename Iter_T>
|
|
25
|
-
inline Rice::Array::
|
|
26
|
-
Array(Iter_T it, Iter_T end)
|
|
27
|
-
: Builtin_Object<T_ARRAY>(protect(rb_ary_new))
|
|
28
|
-
{
|
|
29
|
-
for(; it != end; ++it)
|
|
30
|
-
{
|
|
31
|
-
push(*it);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
template<typename T, long n>
|
|
36
|
-
inline Rice::Array::
|
|
37
|
-
Array(T const (& a)[n])
|
|
38
|
-
: Builtin_Object<T_ARRAY>(protect(rb_ary_new))
|
|
39
|
-
{
|
|
40
|
-
for(long j = 0; j < n; ++j)
|
|
41
|
-
{
|
|
42
|
-
push(a[j]);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
inline long Rice::Array::
|
|
47
|
-
size() const
|
|
48
|
-
{
|
|
49
|
-
return RARRAY_LEN(this->value());
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
inline Rice::Object Rice::Array::
|
|
53
|
-
operator[](long index) const
|
|
54
|
-
{
|
|
55
|
-
return protect(rb_ary_entry, value(), position_of(index));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
inline Rice::Array::Proxy Rice::Array::
|
|
59
|
-
operator[](long index)
|
|
60
|
-
{
|
|
61
|
-
return Proxy(*this, position_of(index));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
template<typename T>
|
|
65
|
-
inline Rice::Object Rice::Array::
|
|
66
|
-
push(T const & obj)
|
|
67
|
-
{
|
|
68
|
-
return protect(rb_ary_push, value(), to_ruby(obj));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
inline Rice::Object Rice::Array::
|
|
72
|
-
pop()
|
|
73
|
-
{
|
|
74
|
-
return protect(rb_ary_pop, value());
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
template<typename T>
|
|
78
|
-
inline Rice::Object Rice::Array::
|
|
79
|
-
unshift(T const & obj)
|
|
80
|
-
{
|
|
81
|
-
return protect(rb_ary_unshift, value(), to_ruby(obj));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
inline Rice::Object Rice::Array::
|
|
85
|
-
shift()
|
|
86
|
-
{
|
|
87
|
-
return protect(rb_ary_shift, value());
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
inline long Rice::Array::
|
|
91
|
-
position_of(long index) const
|
|
92
|
-
{
|
|
93
|
-
if(index < 0)
|
|
94
|
-
{
|
|
95
|
-
return size() + index;
|
|
96
|
-
}
|
|
97
|
-
else
|
|
98
|
-
{
|
|
99
|
-
return static_cast<long>(index);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
inline Rice::Array::Proxy::
|
|
104
|
-
Proxy(Array array, long index)
|
|
105
|
-
: array_(array)
|
|
106
|
-
, index_(index)
|
|
107
|
-
{
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
inline Rice::Array::Proxy::
|
|
111
|
-
operator Rice::Object() const
|
|
112
|
-
{
|
|
113
|
-
return protect(rb_ary_entry, array_.value(), index_);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
inline VALUE Rice::Array::Proxy::
|
|
117
|
-
value() const
|
|
118
|
-
{
|
|
119
|
-
return protect(rb_ary_entry, array_.value(), index_);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
template<typename T>
|
|
123
|
-
Rice::Object Rice::Array::Proxy::
|
|
124
|
-
operator=(T const & value)
|
|
125
|
-
{
|
|
126
|
-
Object o = to_ruby(value);
|
|
127
|
-
rb_ary_store(array_.value(), index_, o.value());
|
|
128
|
-
return o;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
132
|
-
inline Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
133
|
-
Iterator(Array_Ref_T array, long index)
|
|
134
|
-
: array_(array)
|
|
135
|
-
, index_(index)
|
|
136
|
-
{
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
140
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
141
|
-
inline
|
|
142
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
143
|
-
Iterator(Iterator<Array_Ref_T_, Value_T_> const & rhs)
|
|
144
|
-
: array_(rhs.array())
|
|
145
|
-
, index_(rhs.index())
|
|
146
|
-
, tmp_()
|
|
147
|
-
{
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
151
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
152
|
-
inline Rice::Array::Iterator<Array_Ref_T, Value_T> &
|
|
153
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
154
|
-
operator=(Iterator<Array_Ref_T_, Value_T_> const & rhs)
|
|
155
|
-
{
|
|
156
|
-
array_ = rhs.array_;
|
|
157
|
-
index_ = rhs.index_;
|
|
158
|
-
return *this;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
162
|
-
inline Rice::Array::Iterator<Array_Ref_T, Value_T> &
|
|
163
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
164
|
-
operator++()
|
|
165
|
-
{
|
|
166
|
-
++index_;
|
|
167
|
-
return *this;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
171
|
-
inline Rice::Array::Iterator<Array_Ref_T, Value_T>
|
|
172
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
173
|
-
operator++(int)
|
|
174
|
-
{
|
|
175
|
-
Array copy(*this);
|
|
176
|
-
++(*this);
|
|
177
|
-
return *this;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
181
|
-
inline Value_T
|
|
182
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
183
|
-
operator*()
|
|
184
|
-
{
|
|
185
|
-
return array_[index_];
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
189
|
-
inline Rice::Object *
|
|
190
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
191
|
-
operator->()
|
|
192
|
-
{
|
|
193
|
-
tmp_ = array_[index_];
|
|
194
|
-
return &tmp_;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
198
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
199
|
-
inline bool
|
|
200
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
201
|
-
operator==(Iterator<Array_Ref_T_, Value_T_> const & rhs) const
|
|
202
|
-
{
|
|
203
|
-
return array_.value() == rhs.array_.value() && index_ == rhs.index_;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
207
|
-
template<typename Array_Ref_T_, typename Value_T_>
|
|
208
|
-
inline bool
|
|
209
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
210
|
-
operator!=(Iterator<Array_Ref_T_, Value_T_> const & rhs) const
|
|
211
|
-
{
|
|
212
|
-
return !(*this == rhs);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
216
|
-
Array_Ref_T
|
|
217
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
218
|
-
array() const
|
|
219
|
-
{
|
|
220
|
-
return array_;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
template<typename Array_Ref_T, typename Value_T>
|
|
224
|
-
long
|
|
225
|
-
Rice::Array::Iterator<Array_Ref_T, Value_T>::
|
|
226
|
-
index() const
|
|
227
|
-
{
|
|
228
|
-
return index_;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
inline Rice::Array::iterator Rice::Array::
|
|
232
|
-
begin()
|
|
233
|
-
{
|
|
234
|
-
return iterator(*this, 0);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
inline Rice::Array::const_iterator Rice::Array::
|
|
238
|
-
begin() const
|
|
239
|
-
{
|
|
240
|
-
return const_iterator(*this, 0);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
inline Rice::Array::iterator Rice::Array::
|
|
244
|
-
end()
|
|
245
|
-
{
|
|
246
|
-
return iterator(*this, size());
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
inline Rice::Array::const_iterator Rice::Array::
|
|
250
|
-
end() const
|
|
251
|
-
{
|
|
252
|
-
return const_iterator(*this, size());
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
#endif // Rice__Array__ipp_
|
|
256
|
-
|