Qore Programming Language
0.8.7
Main Page
Related Pages
Modules
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
qore
params.h
Go to the documentation of this file.
1
/* -*- mode: c++; indent-tabs-mode: nil -*- */
2
/*
3
params.h
4
5
Qore Programming Language
6
7
Copyright 2003 - 2013 David Nichols
8
9
This library is free software; you can redistribute it and/or
10
modify it under the terms of the GNU Lesser General Public
11
License as published by the Free Software Foundation; either
12
version 2.1 of the License, or (at your option) any later version.
13
14
This library is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
Lesser General Public License for more details.
18
19
You should have received a copy of the GNU Lesser General Public
20
License along with this library; if not, write to the Free Software
21
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
*/
23
24
#ifndef _QORE_PARAMS_H
25
26
#define _QORE_PARAMS_H
27
28
#include <qore/AbstractQoreNode.h>
29
34
35
38
static
inline
unsigned
num_args
(
const
QoreListNode
*n) {
39
return
n ? (unsigned)n->
size
() : 0;
40
}
41
43
46
static
inline
unsigned
num_params
(
const
QoreListNode
*n) {
47
return
n ? (unsigned)n->
size
() : 0;
48
}
49
51
56
static
inline
const
AbstractQoreNode
*
get_param
(
const
QoreListNode
*n,
qore_size_t
i) {
57
if
(!n)
return
0;
58
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
59
return
is_nothing
(p) ? 0 : p;
60
}
61
63
68
static
inline
qore_type_t
get_param_type
(
const
QoreListNode
*n,
qore_size_t
i) {
69
if
(!n)
return
NT_NOTHING
;
70
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
71
return
p ? p->
getType
() :
NT_NOTHING
;
72
}
73
75
static
inline
int
get_int_param
(
const
QoreListNode
*n,
qore_size_t
i) {
76
if
(!n)
return
0;
77
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
78
return
is_nothing
(p) ? 0 : p->
getAsInt
();
79
}
80
82
static
inline
int64
get_bigint_param
(
const
QoreListNode
*n,
qore_size_t
i) {
83
if
(!n)
return
0;
84
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
85
return
is_nothing
(p) ? 0 : p->
getAsBigInt
();
86
}
87
89
static
inline
int
get_int_param_with_default
(
const
QoreListNode
*n,
qore_size_t
i,
int
def) {
90
if
(!n)
return
def;
91
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
92
return
is_nothing
(p) ? def : p->
getAsInt
();
93
}
94
96
static
inline
int64
get_bigint_param_with_default
(
const
QoreListNode
*n,
qore_size_t
i, int64 def) {
97
if
(!n)
return
def;
98
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
99
return
is_nothing
(p) ? def : p->
getAsBigInt
();
100
}
101
103
static
inline
double
get_float_param
(
const
QoreListNode
*n,
qore_size_t
i) {
104
if
(!n)
return
0;
105
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
106
return
is_nothing
(p) ? 0 : p->
getAsFloat
();
107
}
108
110
static
inline
bool
get_bool_param
(
const
QoreListNode
*n,
qore_size_t
i) {
111
if
(!n)
return
0;
112
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
113
return
is_nothing
(p) ?
false
: p->
getAsBool
();
114
}
115
117
122
static
inline
const
BinaryNode
*
test_binary_param
(
const
QoreListNode
*n,
qore_size_t
i) {
123
if
(!n)
return
0;
124
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
125
// the following is faster than a dynamic_cast
126
return
p && p->
getType
() ==
NT_BINARY
?
reinterpret_cast<
const
BinaryNode
*
>
(p) : 0;
127
}
128
130
135
static
inline
const
QoreStringNode
*
test_string_param
(
const
QoreListNode
*n,
qore_size_t
i) {
136
if
(!n)
return
0;
137
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
138
// the following is faster than a dynamic_cast
139
return
p && p->
getType
() ==
NT_STRING
?
reinterpret_cast<
const
QoreStringNode
*
>
(p) : 0;
140
}
141
143
148
static
inline
QoreObject
*
test_object_param
(
const
QoreListNode
*n,
qore_size_t
i) {
149
if
(!n)
return
0;
150
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
151
// the following is faster than a dynamic_cast
152
return
p && p->
getType
() ==
NT_OBJECT
?
const_cast<
QoreObject
*
>
(
reinterpret_cast<
const
QoreObject
*
>
(p)) : 0;
153
}
154
156
161
static
inline
const
DateTimeNode
*
test_date_param
(
const
QoreListNode
*n,
qore_size_t
i) {
162
if
(!n)
return
0;
163
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
164
// the following is faster than a dynamic_cast
165
return
p && p->
getType
() ==
NT_DATE
?
reinterpret_cast<
const
DateTimeNode
*
>
(p) : 0;
166
}
167
169
174
static
inline
const
QoreHashNode
*
test_hash_param
(
const
QoreListNode
*n,
qore_size_t
i) {
175
if
(!n)
return
0;
176
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
177
// the following is faster than a dynamic_cast
178
return
p && p->
getType
() ==
NT_HASH
?
reinterpret_cast<
const
QoreHashNode
*
>
(p) : 0;
179
}
180
182
187
static
inline
const
QoreListNode
*
test_list_param
(
const
QoreListNode
*n,
qore_size_t
i) {
188
if
(!n)
return
0;
189
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
190
// the following is faster than a dynamic_cast
191
return
p && p->
getType
() ==
NT_LIST
?
reinterpret_cast<
const
QoreListNode
*
>
(p) : 0;
192
}
193
195
200
static
inline
const
ResolvedCallReferenceNode
*
test_callref_param
(
const
QoreListNode
*n,
qore_size_t
i) {
201
if
(!n)
return
0;
202
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
203
// the following is faster than a dynamic_cast
204
return
p && (p->
getType
() ==
NT_FUNCREF
|| p->
getType
() ==
NT_RUNTIME_CLOSURE
) ? reinterpret_cast<const ResolvedCallReferenceNode *>(p) : 0;
205
}
206
208
213
static
inline
const
ResolvedCallReferenceNode
*
test_funcref_param
(
const
QoreListNode
*n,
qore_size_t
i) {
214
return
test_callref_param
(n, i);
215
}
216
218
224
static
inline
const
ReferenceNode
*
test_reference_param
(
const
QoreListNode
*n,
qore_size_t
i) {
225
if
(!n)
return
0;
226
const
AbstractQoreNode
*p = n->
retrieve_entry
(i);
227
// the following is faster than a dynamic_cast
228
return
p && p->
getType
() ==
NT_REFERENCE
?
reinterpret_cast<
const
ReferenceNode
*
>
(p) : 0;
229
}
230
232
237
static
inline
bool
test_nothing_param
(
const
QoreListNode
*n,
qore_size_t
i) {
238
if
(!n)
return
true
;
239
return
is_nothing
(n->
retrieve_entry
(i));
240
}
241
243
static
inline
const
QoreEncoding
*
get_encoding_param
(
const
QoreListNode
*n,
qore_size_t
i,
const
QoreEncoding
*def = QCS_DEFAULT) {
244
const
QoreStringNode
*str =
test_string_param
(n, i);
245
return
str ?
QEM
.
findCreate
(str) : def;
246
}
247
249
template
<
typename
T>
250
static
inline
T *
get_hard_param
(
const
QoreListNode
*n,
qore_size_t
i) {
251
assert(n);
252
assert(dynamic_cast<T *>(n->
retrieve_entry
(i)));
253
return
reinterpret_cast<
T *
>
(n->
retrieve_entry
(i));
254
}
255
256
static
inline
void
HARD_QORE_DATA(
const
QoreListNode
*n,
qore_size_t
i,
const
void
*&ptr,
qore_size_t
&len) {
257
const
AbstractQoreNode
*p = get_hard_param<const AbstractQoreNode>(n, i);
258
if
(p->
getType
() ==
NT_STRING
) {
259
const
QoreStringNode
*str =
reinterpret_cast<
const
QoreStringNode
*
>
(p);
260
ptr = (
const
void
*)str->
getBuffer
();
261
len = str->
size
();
262
return
;
263
}
264
const
BinaryNode
*b =
reinterpret_cast<
const
BinaryNode
*
>
(p);
265
ptr = b->
getPtr
();
266
len = b->
size
();
267
}
268
270
#define HARD_QORE_PARAM(name, Type, list, i) Type *name = get_hard_param<Type>(list, i)
271
273
#define HARD_QORE_INT(list, i) get_hard_param<const QoreBigIntNode>(list, i)->val
274
276
#define HARD_QORE_FLOAT(list, i) get_hard_param<const QoreFloatNode>(list, i)->f
277
279
#define HARD_QORE_NUMBER(list, i) get_hard_param<const QoreNumberNode>(list, i)
280
282
#define HARD_QORE_BOOL(list, i) get_hard_param<const QoreBoolNode>(list, i)->getValue()
283
285
#define HARD_QORE_STRING(list, i) get_hard_param<const QoreStringNode>(list, i)
286
288
#define HARD_QORE_DATE(list, i) get_hard_param<const DateTimeNode>(list, i)
289
291
#define HARD_QORE_BINARY(list, i) get_hard_param<const BinaryNode>(list, i)
292
294
#define HARD_QORE_LIST(list, i) get_hard_param<const QoreListNode>(list, i)
295
297
#define HARD_QORE_HASH(list, i) get_hard_param<const QoreHashNode>(list, i)
298
300
#define HARD_QORE_REF(list, i) get_hard_param<const ReferenceNode>(list, i)
301
303
#define HARD_QORE_OBJECT(list, i) const_cast<QoreObject *>(get_hard_param<const QoreObject>(list, i))
304
305
// sets up an object pointer
306
#define HARD_QORE_OBJ_DATA(vname, Type, list, i, cid, dname, cname, xsink) HARD_QORE_PARAM(obj_##vname, const QoreObject, list, i); Type *vname = reinterpret_cast<Type *>(obj_##vname->getReferencedPrivateData(cid, xsink)); if (!vname && !*xsink) xsink->raiseException("OBJECT-ALREADY-DELETED", "cannot complete call setup to %s() because parameter %d (<class %s>) has already been deleted", cname, i + 1, dname)
307
309
static
inline
const
QoreEncoding
*
get_hard_qore_encoding_param
(
const
QoreListNode
*n,
qore_size_t
i) {
310
HARD_QORE_PARAM
(str,
const
QoreStringNode
, n, i);
311
return
QEM
.
findCreate
(str);
312
}
313
314
#endif