rice 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Doxyfile +1 -1
- data/Makefile.in +3 -2
- data/README +247 -16
- data/aclocal.m4 +62 -51
- data/configure +1585 -1456
- data/extconf.rb +9 -1
- data/rice/Arg.hpp +8 -0
- data/rice/Arg_impl.hpp +124 -0
- data/rice/Arg_operators.cpp +21 -0
- data/rice/Arg_operators.hpp +19 -0
- data/rice/Constructor.hpp +150 -0
- data/rice/Data_Type.ipp +51 -6
- data/rice/Director.cpp +19 -0
- data/rice/Director.hpp +47 -0
- data/rice/Enum.hpp +2 -3
- data/rice/Enum.ipp +1 -1
- data/rice/Hash.hpp +1 -1
- data/rice/Makefile.am +7 -0
- data/rice/Makefile.in +18 -7
- data/rice/Module_impl.hpp +36 -3
- data/rice/Module_impl.ipp +56 -7
- data/rice/VM.cpp +2 -2
- data/rice/config.hpp +1 -1
- data/rice/detail/Arguments.hpp +118 -0
- data/rice/detail/Auto_Function_Wrapper.hpp +206 -96
- data/rice/detail/Auto_Function_Wrapper.ipp +1687 -144
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +234 -123
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +1133 -306
- data/rice/detail/Caster.hpp +3 -1
- data/rice/detail/creation_funcs.hpp +0 -8
- data/rice/detail/creation_funcs.ipp +1 -27
- data/rice/detail/define_method_and_auto_wrap.hpp +3 -1
- data/rice/detail/define_method_and_auto_wrap.ipp +4 -3
- data/rice/detail/object_call.ipp +1 -1
- data/rice/detail/ruby.hpp +1 -33
- data/rice/detail/wrap_function.hpp +103 -48
- data/rice/detail/wrap_function.ipp +154 -96
- data/rice/generate_code.rb +520 -55
- data/rice/global_function.hpp +12 -1
- data/rice/global_function.ipp +14 -2
- data/ruby/Makefile.in +5 -4
- data/ruby/lib/Makefile.in +4 -3
- data/ruby/lib/version.rb +1 -1
- data/sample/Makefile.in +4 -3
- data/test/Makefile.am +2 -0
- data/test/Makefile.in +32 -13
- data/test/test_Class.cpp +36 -14
- data/test/test_Constructor.cpp +176 -1
- data/test/test_Data_Type.cpp +121 -0
- data/test/test_Director.cpp +225 -0
- data/test/test_Enum.cpp +33 -0
- data/test/test_Module.cpp +175 -0
- data/test/test_global_functions.cpp +70 -1
- metadata +27 -7
data/rice/Enum.hpp
CHANGED
@@ -36,11 +36,10 @@ struct Default_Enum_Traits
|
|
36
36
|
* Example:
|
37
37
|
* \code
|
38
38
|
* enum Color { Red, Green, Blue };
|
39
|
-
* Enum<Color> rb_cColor = define_enum<Color>()
|
39
|
+
* Enum<Color> rb_cColor = define_enum<Color>("Color")
|
40
40
|
* .define_value("Red", Red)
|
41
41
|
* .define_value("Green", Green)
|
42
|
-
* .define_value("Blue", Blue)
|
43
|
-
* .initialize("Color");
|
42
|
+
* .define_value("Blue", Blue);
|
44
43
|
* \endcode
|
45
44
|
*/
|
46
45
|
template<typename Enum_T, typename Enum_Traits = Default_Enum_Traits<Enum_T> >
|
data/rice/Enum.ipp
CHANGED
@@ -75,7 +75,7 @@ initialize(
|
|
75
75
|
.define_method("to_i", to_i)
|
76
76
|
.define_method("inspect", inspect)
|
77
77
|
.define_method("<=>", compare)
|
78
|
-
|
78
|
+
//.define_method("hash", hash)
|
79
79
|
.define_method("eql?", eql)
|
80
80
|
.define_method("==", eql)
|
81
81
|
.define_method("===", eql)
|
data/rice/Hash.hpp
CHANGED
data/rice/Makefile.am
CHANGED
@@ -3,6 +3,7 @@ lib_LIBRARIES = librice.a
|
|
3
3
|
librice_a_SOURCES = \
|
4
4
|
Class.cpp \
|
5
5
|
Data_Type.cpp \
|
6
|
+
Director.cpp \
|
6
7
|
Exception.cpp \
|
7
8
|
Identifier.cpp \
|
8
9
|
Module.cpp \
|
@@ -11,6 +12,7 @@ String.cpp \
|
|
11
12
|
Struct.cpp \
|
12
13
|
Symbol.cpp \
|
13
14
|
VM.cpp \
|
15
|
+
Arg_operators.cpp \
|
14
16
|
detail/check_ruby_type.cpp \
|
15
17
|
detail/demangle.cpp \
|
16
18
|
detail/method_data.cpp \
|
@@ -24,6 +26,9 @@ Address_Registration_Guard_defn.hpp \
|
|
24
26
|
Allocation_Strategies.hpp \
|
25
27
|
Array.hpp \
|
26
28
|
Array.ipp \
|
29
|
+
Arg.hpp \
|
30
|
+
Arg_impl.hpp \
|
31
|
+
Arg_operators.hpp \
|
27
32
|
Builtin_Object.hpp \
|
28
33
|
Builtin_Object.ipp \
|
29
34
|
Builtin_Object_defn.hpp \
|
@@ -40,6 +45,7 @@ Data_Type.hpp \
|
|
40
45
|
Data_Type.ipp \
|
41
46
|
Data_Type_defn.hpp \
|
42
47
|
Data_Type_fwd.hpp \
|
48
|
+
Director.hpp \
|
43
49
|
Enum.hpp \
|
44
50
|
Enum.ipp \
|
45
51
|
Exception.hpp \
|
@@ -82,6 +88,7 @@ detail/Auto_Function_Wrapper.hpp \
|
|
82
88
|
detail/Auto_Function_Wrapper.ipp \
|
83
89
|
detail/Auto_Member_Function_Wrapper.hpp \
|
84
90
|
detail/Auto_Member_Function_Wrapper.ipp \
|
91
|
+
detail/Arguments.hpp \
|
85
92
|
detail/Caster.hpp \
|
86
93
|
detail/Exception_Handler.hpp \
|
87
94
|
detail/Exception_Handler.ipp \
|
data/rice/Makefile.in
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Makefile.in generated by automake 1.10.
|
1
|
+
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
2
2
|
# @configure_input@
|
3
3
|
|
4
4
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
@@ -58,9 +58,10 @@ ARFLAGS = cru
|
|
58
58
|
librice_a_AR = $(AR) $(ARFLAGS)
|
59
59
|
librice_a_LIBADD =
|
60
60
|
am_librice_a_OBJECTS = Class.$(OBJEXT) Data_Type.$(OBJEXT) \
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
Director.$(OBJEXT) Exception.$(OBJEXT) Identifier.$(OBJEXT) \
|
62
|
+
Module.$(OBJEXT) Object.$(OBJEXT) String.$(OBJEXT) \
|
63
|
+
Struct.$(OBJEXT) Symbol.$(OBJEXT) VM.$(OBJEXT) \
|
64
|
+
Arg_operators.$(OBJEXT) check_ruby_type.$(OBJEXT) \
|
64
65
|
demangle.$(OBJEXT) method_data.$(OBJEXT) protect.$(OBJEXT) \
|
65
66
|
mininode.$(OBJEXT)
|
66
67
|
librice_a_OBJECTS = $(am_librice_a_OBJECTS)
|
@@ -206,12 +207,14 @@ sharedstatedir = @sharedstatedir@
|
|
206
207
|
srcdir = @srcdir@
|
207
208
|
sysconfdir = @sysconfdir@
|
208
209
|
target_alias = @target_alias@
|
210
|
+
top_build_prefix = @top_build_prefix@
|
209
211
|
top_builddir = @top_builddir@
|
210
212
|
top_srcdir = @top_srcdir@
|
211
213
|
lib_LIBRARIES = librice.a
|
212
214
|
librice_a_SOURCES = \
|
213
215
|
Class.cpp \
|
214
216
|
Data_Type.cpp \
|
217
|
+
Director.cpp \
|
215
218
|
Exception.cpp \
|
216
219
|
Identifier.cpp \
|
217
220
|
Module.cpp \
|
@@ -220,6 +223,7 @@ String.cpp \
|
|
220
223
|
Struct.cpp \
|
221
224
|
Symbol.cpp \
|
222
225
|
VM.cpp \
|
226
|
+
Arg_operators.cpp \
|
223
227
|
detail/check_ruby_type.cpp \
|
224
228
|
detail/demangle.cpp \
|
225
229
|
detail/method_data.cpp \
|
@@ -233,6 +237,9 @@ Address_Registration_Guard_defn.hpp \
|
|
233
237
|
Allocation_Strategies.hpp \
|
234
238
|
Array.hpp \
|
235
239
|
Array.ipp \
|
240
|
+
Arg.hpp \
|
241
|
+
Arg_impl.hpp \
|
242
|
+
Arg_operators.hpp \
|
236
243
|
Builtin_Object.hpp \
|
237
244
|
Builtin_Object.ipp \
|
238
245
|
Builtin_Object_defn.hpp \
|
@@ -249,6 +256,7 @@ Data_Type.hpp \
|
|
249
256
|
Data_Type.ipp \
|
250
257
|
Data_Type_defn.hpp \
|
251
258
|
Data_Type_fwd.hpp \
|
259
|
+
Director.hpp \
|
252
260
|
Enum.hpp \
|
253
261
|
Enum.ipp \
|
254
262
|
Exception.hpp \
|
@@ -291,6 +299,7 @@ detail/Auto_Function_Wrapper.hpp \
|
|
291
299
|
detail/Auto_Function_Wrapper.ipp \
|
292
300
|
detail/Auto_Member_Function_Wrapper.hpp \
|
293
301
|
detail/Auto_Member_Function_Wrapper.ipp \
|
302
|
+
detail/Arguments.hpp \
|
294
303
|
detail/Caster.hpp \
|
295
304
|
detail/Exception_Handler.hpp \
|
296
305
|
detail/Exception_Handler.ipp \
|
@@ -336,8 +345,8 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
336
345
|
@for dep in $?; do \
|
337
346
|
case '$(am__configure_deps)' in \
|
338
347
|
*$$dep*) \
|
339
|
-
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
340
|
-
|
348
|
+
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
349
|
+
&& { if test -f $@; then exit 0; else break; fi; }; \
|
341
350
|
exit 1;; \
|
342
351
|
esac; \
|
343
352
|
done; \
|
@@ -418,8 +427,10 @@ mostlyclean-compile:
|
|
418
427
|
distclean-compile:
|
419
428
|
-rm -f *.tab.c
|
420
429
|
|
430
|
+
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Arg_operators.Po@am__quote@
|
421
431
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Class.Po@am__quote@
|
422
432
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Data_Type.Po@am__quote@
|
433
|
+
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Director.Po@am__quote@
|
423
434
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Exception.Po@am__quote@
|
424
435
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Identifier.Po@am__quote@
|
425
436
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Module.Po@am__quote@
|
@@ -542,7 +553,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
542
553
|
unique=`for i in $$list; do \
|
543
554
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
544
555
|
done | \
|
545
|
-
$(AWK) '{ files[$$0] = 1;
|
556
|
+
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
546
557
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
547
558
|
mkid -fID $$unique
|
548
559
|
tags: TAGS
|
data/rice/Module_impl.hpp
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
#include "detail/ruby.hpp"
|
6
6
|
#include "Object_defn.hpp"
|
7
7
|
#include "Address_Registration_Guard_defn.hpp"
|
8
|
+
#include "Arg.hpp"
|
8
9
|
|
9
10
|
namespace Rice
|
10
11
|
{
|
@@ -97,12 +98,24 @@ public:
|
|
97
98
|
* \param name the name of the method
|
98
99
|
* \param func the implementation of the function, either a function
|
99
100
|
* pointer or a member function pointer.
|
101
|
+
* \param arguments the list of arguments of this function, used for
|
102
|
+
* defining default parameters (optional)
|
100
103
|
* \return *this
|
101
104
|
*/
|
102
105
|
template<typename Func_T>
|
103
106
|
Derived_T & define_method(
|
104
107
|
Identifier name,
|
105
|
-
Func_T func
|
108
|
+
Func_T func,
|
109
|
+
Arguments* arguments = 0);
|
110
|
+
|
111
|
+
// FIXME There's GOT to be a better way to
|
112
|
+
// do this. Handles the case where there is a single
|
113
|
+
// argument defined for this method
|
114
|
+
template<typename Func_T>
|
115
|
+
Derived_T & define_method(
|
116
|
+
Identifier name,
|
117
|
+
Func_T func,
|
118
|
+
Arg const& arg);
|
106
119
|
|
107
120
|
//! Define a singleton method.
|
108
121
|
/*! The method's implementation can be any function or member
|
@@ -113,12 +126,22 @@ public:
|
|
113
126
|
* \param name the name of the method
|
114
127
|
* \param func the implementation of the function, either a function
|
115
128
|
* pointer or a member function pointer.
|
129
|
+
* \param arguments the list of arguments of this function, used for
|
130
|
+
* defining default parameters (optional)
|
116
131
|
* \return *this
|
117
132
|
*/
|
118
133
|
template<typename Func_T>
|
119
134
|
Derived_T & define_singleton_method(
|
120
135
|
Identifier name,
|
121
|
-
Func_T func
|
136
|
+
Func_T func,
|
137
|
+
Arguments* arguments = 0);
|
138
|
+
|
139
|
+
// FIXME: See define_method with Arg above
|
140
|
+
template<typename Func_T>
|
141
|
+
Derived_T & define_singleton_method(
|
142
|
+
Identifier name,
|
143
|
+
Func_T func,
|
144
|
+
Arg const& arg);
|
122
145
|
|
123
146
|
//! Define a module function.
|
124
147
|
/*! A module function is a function that can be accessed either as a
|
@@ -131,12 +154,22 @@ public:
|
|
131
154
|
* \param name the name of the method
|
132
155
|
* \param func the implementation of the function, either a function
|
133
156
|
* pointer or a member function pointer.
|
157
|
+
* \param arguments the list of arguments of this function, used for
|
158
|
+
* defining default parameters (optional)
|
134
159
|
* \return *this
|
135
160
|
*/
|
136
161
|
template<typename Func_T>
|
137
162
|
Derived_T & define_module_function(
|
138
163
|
Identifier name,
|
139
|
-
Func_T func
|
164
|
+
Func_T func,
|
165
|
+
Arguments* arguments = 0);
|
166
|
+
|
167
|
+
// FIXME: See define_method with Arg above
|
168
|
+
template<typename Func_T>
|
169
|
+
Derived_T & define_module_function(
|
170
|
+
Identifier name,
|
171
|
+
Func_T func,
|
172
|
+
Arg const& arg);
|
140
173
|
|
141
174
|
//! Define an iterator.
|
142
175
|
/*! Essentially this is a conversion from a C++-style begin/end
|
data/rice/Module_impl.ipp
CHANGED
@@ -120,13 +120,30 @@ Derived_T &
|
|
120
120
|
Rice::Module_impl<Base_T, Derived_T>::
|
121
121
|
define_method(
|
122
122
|
Identifier name,
|
123
|
-
Func_T func
|
123
|
+
Func_T func,
|
124
|
+
Arguments* arguments)
|
124
125
|
{
|
125
126
|
detail::define_method_and_auto_wrap(
|
126
|
-
*this, name, func, this->handler());
|
127
|
+
*this, name, func, this->handler(), arguments);
|
127
128
|
return (Derived_T &)*this;
|
128
129
|
}
|
129
130
|
|
131
|
+
template<typename Base_T, typename Derived_T>
|
132
|
+
template<typename Func_T>
|
133
|
+
inline
|
134
|
+
Derived_T &
|
135
|
+
Rice::Module_impl<Base_T, Derived_T>::
|
136
|
+
define_method(
|
137
|
+
Identifier name,
|
138
|
+
Func_T func,
|
139
|
+
Arg const& arg)
|
140
|
+
{
|
141
|
+
Arguments* args = new Arguments();
|
142
|
+
args->add(arg);
|
143
|
+
return define_method(name, func, args);
|
144
|
+
}
|
145
|
+
|
146
|
+
|
130
147
|
template<typename Base_T, typename Derived_T>
|
131
148
|
template<typename Func_T>
|
132
149
|
inline
|
@@ -134,13 +151,29 @@ Derived_T &
|
|
134
151
|
Rice::Module_impl<Base_T, Derived_T>::
|
135
152
|
define_singleton_method(
|
136
153
|
Identifier name,
|
137
|
-
Func_T func
|
154
|
+
Func_T func,
|
155
|
+
Arguments* arguments)
|
138
156
|
{
|
139
157
|
detail::define_method_and_auto_wrap(
|
140
|
-
rb_class_of(*this), name, func, this->handler());
|
158
|
+
rb_class_of(*this), name, func, this->handler(), arguments);
|
141
159
|
return (Derived_T &)*this;
|
142
160
|
}
|
143
161
|
|
162
|
+
template<typename Base_T, typename Derived_T>
|
163
|
+
template<typename Func_T>
|
164
|
+
inline
|
165
|
+
Derived_T &
|
166
|
+
Rice::Module_impl<Base_T, Derived_T>::
|
167
|
+
define_singleton_method(
|
168
|
+
Identifier name,
|
169
|
+
Func_T func,
|
170
|
+
Arg const& arg)
|
171
|
+
{
|
172
|
+
Arguments* args = new Arguments();
|
173
|
+
args->add(arg);
|
174
|
+
return define_singleton_method(name, func, args);
|
175
|
+
}
|
176
|
+
|
144
177
|
template<typename Base_T, typename Derived_T>
|
145
178
|
template<typename Func_T>
|
146
179
|
inline
|
@@ -148,7 +181,8 @@ Derived_T &
|
|
148
181
|
Rice::Module_impl<Base_T, Derived_T>::
|
149
182
|
define_module_function(
|
150
183
|
Identifier name,
|
151
|
-
Func_T func
|
184
|
+
Func_T func,
|
185
|
+
Arguments* arguments)
|
152
186
|
{
|
153
187
|
if(this->rb_type() != T_MODULE)
|
154
188
|
{
|
@@ -157,11 +191,26 @@ define_module_function(
|
|
157
191
|
"can only define module functions for modules");
|
158
192
|
}
|
159
193
|
|
160
|
-
define_method(name, func);
|
161
|
-
define_singleton_method(name, func);
|
194
|
+
define_method(name, func, arguments);
|
195
|
+
define_singleton_method(name, func, arguments);
|
162
196
|
return (Derived_T &)*this;
|
163
197
|
}
|
164
198
|
|
199
|
+
template<typename Base_T, typename Derived_T>
|
200
|
+
template<typename Func_T>
|
201
|
+
inline
|
202
|
+
Derived_T &
|
203
|
+
Rice::Module_impl<Base_T, Derived_T>::
|
204
|
+
define_module_function(
|
205
|
+
Identifier name,
|
206
|
+
Func_T func,
|
207
|
+
Arg const& arg)
|
208
|
+
{
|
209
|
+
Arguments* args = new Arguments();
|
210
|
+
args->add(arg);
|
211
|
+
return define_module_function(name, func, args);
|
212
|
+
}
|
213
|
+
|
165
214
|
template<typename Base_T, typename Derived_T>
|
166
215
|
template<typename T, typename Iterator_T>
|
167
216
|
inline
|
data/rice/VM.cpp
CHANGED
@@ -33,7 +33,7 @@ Rice::VM::
|
|
33
33
|
init_stack();
|
34
34
|
}
|
35
35
|
|
36
|
-
#if
|
36
|
+
#if RICE__RUBY_VERSION_CODE < 186
|
37
37
|
extern "C"
|
38
38
|
void Init_stack(VALUE *);
|
39
39
|
#endif
|
@@ -41,7 +41,7 @@ Rice::VM::
|
|
41
41
|
void Rice::VM::
|
42
42
|
init_stack()
|
43
43
|
{
|
44
|
-
#if
|
44
|
+
#if RICE__RUBY_VERSION_CODE >= 186
|
45
45
|
RUBY_INIT_STACK;
|
46
46
|
#else
|
47
47
|
VALUE v;
|
data/rice/config.hpp
CHANGED
@@ -0,0 +1,118 @@
|
|
1
|
+
#ifndef Rice__Arguments__hpp_
|
2
|
+
#define Rice__Arguments__hpp_
|
3
|
+
|
4
|
+
#include "../Arg_impl.hpp"
|
5
|
+
#include <sstream>
|
6
|
+
#include <vector>
|
7
|
+
#include "../to_from_ruby_defn.hpp"
|
8
|
+
|
9
|
+
namespace Rice {
|
10
|
+
|
11
|
+
class Arguments
|
12
|
+
{
|
13
|
+
public:
|
14
|
+
Arguments() {
|
15
|
+
required_ = 0;
|
16
|
+
optional_ = 0;
|
17
|
+
}
|
18
|
+
|
19
|
+
~Arguments() {
|
20
|
+
}
|
21
|
+
|
22
|
+
/**
|
23
|
+
* Get the full argument count of this
|
24
|
+
* list of arguments.
|
25
|
+
* Returns -1 no defined arguments
|
26
|
+
*/
|
27
|
+
int count() {
|
28
|
+
if(required_ == 0 && optional_ == 0) {
|
29
|
+
return -1;
|
30
|
+
} else {
|
31
|
+
return required_ + optional_;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
/**
|
36
|
+
* Get the rb_scan_args format string for this
|
37
|
+
* list of arguments.
|
38
|
+
* In the case of no Args (default case), this
|
39
|
+
* method uses the passed in full argument count
|
40
|
+
*/
|
41
|
+
const char* formatString(int fullArgCount)
|
42
|
+
{
|
43
|
+
std::stringstream s;
|
44
|
+
if(required_ == 0 && optional_ == 0)
|
45
|
+
{
|
46
|
+
s << fullArgCount << 0;
|
47
|
+
}
|
48
|
+
else
|
49
|
+
{
|
50
|
+
s << required_ << optional_;
|
51
|
+
}
|
52
|
+
|
53
|
+
return s.str().c_str();
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Add a defined Arg to this list of Arguments
|
58
|
+
*/
|
59
|
+
void add(const Arg& arg)
|
60
|
+
{
|
61
|
+
args_.push_back(arg);
|
62
|
+
|
63
|
+
if(arg.hasDefaultValue())
|
64
|
+
{
|
65
|
+
optional_++;
|
66
|
+
}
|
67
|
+
else
|
68
|
+
{
|
69
|
+
required_++;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
/**
|
74
|
+
* Is the argument at the request location an optional
|
75
|
+
* argument?
|
76
|
+
*/
|
77
|
+
bool isOptional(unsigned int pos)
|
78
|
+
{
|
79
|
+
if(required_ == 0 && optional_ == 0)
|
80
|
+
{
|
81
|
+
return false;
|
82
|
+
}
|
83
|
+
if(pos >= args_.size())
|
84
|
+
{
|
85
|
+
return false;
|
86
|
+
}
|
87
|
+
return args_[pos].hasDefaultValue();
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Given a position, a type, and a ruby VALUE, figure out
|
92
|
+
* what argument value we need to return according to
|
93
|
+
* defaults and if that VALUE is nil or not
|
94
|
+
*/
|
95
|
+
template<typename Arg_T>
|
96
|
+
Arg_T getArgumentOrDefault(int pos, VALUE in)
|
97
|
+
{
|
98
|
+
if(isOptional(pos) && NIL_P(in))
|
99
|
+
{
|
100
|
+
return args_[pos].getDefaultValue<Arg_T>();
|
101
|
+
}
|
102
|
+
else
|
103
|
+
{
|
104
|
+
return from_ruby<Arg_T>(in);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
private:
|
109
|
+
std::vector<Arg> args_;
|
110
|
+
|
111
|
+
/** Keep counts of required and optional parameters */
|
112
|
+
int required_;
|
113
|
+
int optional_;
|
114
|
+
};
|
115
|
+
|
116
|
+
}
|
117
|
+
|
118
|
+
#endif // Rice__Arguments__hpp_
|