rice 1.1.0 → 1.2.0
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/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_
|