Qore Programming Language  0.8.7
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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 
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 
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 
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 
310  HARD_QORE_PARAM(str, const QoreStringNode, n, i);
311  return QEM.findCreate(str);
312 }
313 
314 #endif