Qore Programming Language  0.8.11
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
AbstractQoreNode.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  AbstractQoreNode.h
4 
5  Qore Programming Language
6 
7  Copyright 2003 - 2014 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_ABSTRACTQORENODE_H
25 
26 #define _QORE_ABSTRACTQORENODE_H
27 
28 #include <qore/common.h>
29 #include <qore/QoreReferenceCounter.h>
30 #include <qore/node_types.h>
31 
32 #include <string>
33 
34 #include <assert.h>
35 
36 #define FMT_YAML_SHORT -2
37 #define FMT_NONE -1
38 #define FMT_NORMAL 0
39 
40 class LocalVar;
41 class QoreTypeInfo;
42 
44 
48 private:
50  DLLLOCAL AbstractQoreNode& operator=(const AbstractQoreNode&);
51 
53 
56  DLLLOCAL virtual bool getAsBoolImpl() const { return false; }
57 
59 
62  DLLLOCAL virtual int getAsIntImpl() const { return 0; }
63 
65 
68  DLLLOCAL virtual int64 getAsBigIntImpl() const { return 0; }
69 
71 
74  DLLLOCAL virtual double getAsFloatImpl() const { return 0.0; }
75 
77 
84  DLLEXPORT virtual AbstractQoreNode *evalImpl(ExceptionSink *xsink) const = 0;
85 
87 
93  DLLEXPORT virtual AbstractQoreNode *evalImpl(bool &needs_deref, ExceptionSink *xsink) const = 0;
94 
96 
100  DLLEXPORT virtual int64 bigIntEvalImpl(ExceptionSink *xsink) const;
101 
103 
107  DLLEXPORT virtual int integerEvalImpl(ExceptionSink *xsink) const;
108 
110 
114  DLLEXPORT virtual bool boolEvalImpl(ExceptionSink *xsink) const;
115 
117 
121  DLLEXPORT virtual double floatEvalImpl(ExceptionSink *xsink) const;
122 
124 
129  DLLEXPORT virtual bool derefImpl(ExceptionSink *xsink);
130 
132 
136  DLLEXPORT virtual void customRef() const;
137 
142  DLLEXPORT virtual void customDeref(ExceptionSink *xsink);
143 
144 protected:
146 
150 
152  bool value : 1;
153 
155  bool needs_eval_flag : 1;
156 
159 
162 
164 
167  DLLEXPORT virtual ~AbstractQoreNode();
168 
169 public:
171 
178  DLLEXPORT AbstractQoreNode(qore_type_t t, bool n_value, bool n_needs_eval, bool n_there_can_be_only_one = false, bool n_custom_reference_handlers = false);
179 
181  DLLEXPORT AbstractQoreNode(const AbstractQoreNode& v);
182 
184 
187  DLLEXPORT bool getAsBool() const;
188 
190 
193  DLLEXPORT int getAsInt() const;
194 
196 
199  DLLEXPORT int64 getAsBigInt() const;
200 
202 
205  DLLEXPORT double getAsFloat() const;
206 
208 
213  DLLEXPORT virtual QoreString *getStringRepresentation(bool &del) const;
214 
216 
219  DLLEXPORT virtual void getStringRepresentation(QoreString &str) const;
220 
222 
226  DLLEXPORT virtual class DateTime *getDateTimeRepresentation(bool &del) const;
227 
229 
232  DLLEXPORT virtual void getDateTimeRepresentation(DateTime &dt) const;
233 
235 
241  DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const = 0;
242 
244 
250  DLLEXPORT virtual QoreString *getAsString(bool &del, int foff, ExceptionSink *xsink) const = 0;
251 
253 
256  DLLLOCAL bool needs_eval() const {
257  return needs_eval_flag;
258  }
259 
261 
264  DLLEXPORT virtual AbstractQoreNode *realCopy() const = 0;
265 
267 
272  DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const = 0;
273 
275 
280  DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const = 0;
281 
283 
286  DLLLOCAL qore_type_t getType() const {
287  return type;
288  }
289 
291 
294  DLLEXPORT virtual const char *getTypeName() const = 0;
295 
297 
310  DLLEXPORT AbstractQoreNode *eval(ExceptionSink *xsink) const;
311 
313 
321  DLLEXPORT AbstractQoreNode *eval(bool &needs_deref, ExceptionSink *xsink) const;
322 
324 
328  DLLEXPORT int64 bigIntEval(ExceptionSink *xsink) const;
329 
331 
335  DLLEXPORT int integerEval(ExceptionSink *xsink) const;
336 
338 
342  DLLEXPORT bool boolEval(ExceptionSink *xsink) const;
343 
345 
349  DLLEXPORT double floatEval(ExceptionSink *xsink) const;
350 
352 
355  DLLLOCAL bool is_value() const {
356  return value;
357  }
358 
360 
364  DLLEXPORT void deref(ExceptionSink *xsink);
365 
367 
370  DLLEXPORT AbstractQoreNode *refSelf() const;
371 
373  DLLEXPORT void ref() const;
374 
376  DLLLOCAL bool isReferenceCounted() const { return !there_can_be_only_one; }
377 
379 
389  DLLEXPORT virtual AbstractQoreNode *parseInit(LocalVar *oflag, int pflag, int &lvids, const QoreTypeInfo *&typeInfo);
390 };
391 
393 
397 private:
399  DLLLOCAL SimpleQoreNode& operator=(const SimpleQoreNode&);
400 
401 public:
403  DLLLOCAL SimpleQoreNode(qore_type_t t, bool n_value, bool n_needs_eval, bool n_there_can_be_only_one = false) : AbstractQoreNode(t, n_value, n_needs_eval, n_there_can_be_only_one) { }
404 
406  DLLLOCAL SimpleQoreNode(const SimpleQoreNode& v) : AbstractQoreNode(v) { }
407 
409 
413  DLLEXPORT void deref();
414 };
415 
418 private:
419 
420 protected:
422 
424  DLLEXPORT virtual AbstractQoreNode *evalImpl(ExceptionSink *xsink) const;
425 
427 
429  DLLEXPORT virtual AbstractQoreNode *evalImpl(bool &needs_deref, ExceptionSink *xsink) const;
430 
432 
434  DLLEXPORT virtual int64 bigIntEvalImpl(ExceptionSink *xsink) const;
435 
437 
439  DLLEXPORT virtual int integerEvalImpl(ExceptionSink *xsink) const;
440 
442 
444  DLLEXPORT virtual bool boolEvalImpl(ExceptionSink *xsink) const;
445 
447 
449  DLLEXPORT virtual double floatEvalImpl(ExceptionSink *xsink) const;
450 
451 public:
453  DLLLOCAL SimpleValueQoreNode(qore_type_t t, bool n_there_can_be_only_one = false) : SimpleQoreNode(t, true, false, n_there_can_be_only_one) { }
454 
455  DLLLOCAL SimpleValueQoreNode(const SimpleValueQoreNode &v) : SimpleQoreNode(v) { }
456 };
457 
459 
462 private:
464  DLLLOCAL UniqueValueQoreNode& operator=(const UniqueValueQoreNode&);
465 
467  DLLLOCAL void *operator new(size_t);
468 
469 protected:
470 
471 public:
474 
477 
479  DLLEXPORT virtual AbstractQoreNode *realCopy() const;
480 };
481 
482 #endif
DLLEXPORT AbstractQoreNode * refSelf() const
returns "this" with an incremented reference count
virtual DLLEXPORT AbstractQoreNode * parseInit(LocalVar *oflag, int pflag, int &lvids, const QoreTypeInfo *&typeInfo)
for use by parse types to initialize them for execution during stage 1 parsing
DLLEXPORT bool getAsBool() const
returns the boolean value of the object
virtual DLLEXPORT int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const =0
concatenate the verbose string representation of the value (including all contained values for contai...
DLLEXPORT AbstractQoreNode * eval(ExceptionSink *xsink) const
evaluates the object and returns a value (or 0)
DLLEXPORT double getAsFloat() const
returns the float value of the object
virtual DLLEXPORT int64 bigIntEvalImpl(ExceptionSink *xsink) const
should never be called for value types
DLLEXPORT int64 bigIntEval(ExceptionSink *xsink) const
evaluates the object and returns a 64-bit integer value
Holds absolute and relative date/time values in Qore with precision to the microsecond.
Definition: DateTime.h:85
DLLLOCAL UniqueValueQoreNode(qore_type_t t)
constructor takes the type argument
Definition: AbstractQoreNode.h:473
DLLEXPORT int integerEval(ExceptionSink *xsink) const
evaluates the object and returns an integer value
DLLLOCAL SimpleQoreNode(const SimpleQoreNode &v)
copy constructor
Definition: AbstractQoreNode.h:406
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:47
virtual DLLEXPORT QoreString * getStringRepresentation(bool &del) const
returns the value of the type converted to a string, default implementation: returns the empty string...
DLLLOCAL UniqueValueQoreNode(const UniqueValueQoreNode &)
copy constructor
Definition: AbstractQoreNode.h:476
virtual DLLEXPORT class DateTime * getDateTimeRepresentation(bool &del) const
returns the DateTime representation of this type (default implementation: returns ZeroDate...
virtual DLLEXPORT bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const =0
tests for equality ("deep compare" including all contained values for container types) without type c...
DLLEXPORT bool boolEval(ExceptionSink *xsink) const
evaluates the object and returns a boolean value
DLLEXPORT int getAsInt() const
returns the integer value of the object
DLLEXPORT int64 getAsBigInt() const
returns the 64-bit integer value of the object
signed short qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:59
virtual DLLEXPORT const char * getTypeName() const =0
returns the type name as a c string
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:42
virtual DLLEXPORT AbstractQoreNode * evalImpl(ExceptionSink *xsink) const
should never be called for value types
bool custom_reference_handlers
set to one for objects that need custom reference handlers
Definition: AbstractQoreNode.h:161
bool needs_eval_flag
if this is true then the type can be evaluated
Definition: AbstractQoreNode.h:155
virtual DLLEXPORT double floatEvalImpl(ExceptionSink *xsink) const
should never be called for value types
this class is for value types that will exists only once in the Qore library, reference counting is d...
Definition: AbstractQoreNode.h:461
provides atomic reference counting to Qore objects
Definition: QoreReferenceCounter.h:34
DLLLOCAL bool is_value() const
returns true if the node represents a value
Definition: AbstractQoreNode.h:355
virtual DLLEXPORT int integerEvalImpl(ExceptionSink *xsink) const
should never be called for value types
DLLEXPORT void ref() const
increments the reference count
virtual DLLEXPORT AbstractQoreNode * realCopy() const =0
returns a copy of the object; the caller owns the reference count
The base class for all types in Qore expression trees that cannot throw an exception when deleted...
Definition: AbstractQoreNode.h:396
virtual DLLEXPORT bool boolEvalImpl(ExceptionSink *xsink) const
should never be called for value types
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:35
DLLLOCAL bool needs_eval() const
returns true if the object needs evaluation to return a value, false if not
Definition: AbstractQoreNode.h:256
DLLEXPORT void deref(ExceptionSink *xsink)
decrements the reference count and calls derefImpl() if there_can_be_only_one is false, otherwise does nothing
DLLLOCAL SimpleValueQoreNode(qore_type_t t, bool n_there_can_be_only_one=false)
creates the object by assigning the type code and setting the "value" flag, unsetting the "needs_eval...
Definition: AbstractQoreNode.h:453
DLLEXPORT AbstractQoreNode(qore_type_t t, bool n_value, bool n_needs_eval, bool n_there_can_be_only_one=false, bool n_custom_reference_handlers=false)
constructor takes the type
DLLLOCAL qore_type_t getType() const
returns the data type
Definition: AbstractQoreNode.h:286
bool there_can_be_only_one
if this is set to true, then reference counting is turned off for objects of this class ...
Definition: AbstractQoreNode.h:158
DLLLOCAL SimpleQoreNode(qore_type_t t, bool n_value, bool n_needs_eval, bool n_there_can_be_only_one=false)
constructor takes the type and value arguments
Definition: AbstractQoreNode.h:403
bool value
this is true for values, if false then either the type needs evaluation to produce a value or is a pa...
Definition: AbstractQoreNode.h:152
virtual DLLEXPORT AbstractQoreNode * realCopy() const
returns itself; objects of this type are not reference-counted and only deleted manually (by static d...
virtual DLLEXPORT ~AbstractQoreNode()
default destructor does nothing
base class for simple value types
Definition: AbstractQoreNode.h:417
virtual DLLEXPORT bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const =0
tests for equality ("deep compare" including all contained values for container types) with possible ...
DLLLOCAL bool isReferenceCounted() const
returns true if the object is reference-counted
Definition: AbstractQoreNode.h:376
DLLEXPORT double floatEval(ExceptionSink *xsink) const
evaluates the object and returns a floating-point value
qore_type_t type
the type of the object
Definition: AbstractQoreNode.h:149