Qore Programming Language - C/C++ Library  0.8.13.6
AbstractQoreNode.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  AbstractQoreNode.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2017 Qore Technologies, s.r.o.
8 
9  Permission is hereby granted, free of charge, to any person obtaining a
10  copy of this software and associated documentation files (the "Software"),
11  to deal in the Software without restriction, including without limitation
12  the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  and/or sell copies of the Software, and to permit persons to whom the
14  Software is furnished to do so, subject to the following conditions:
15 
16  The above copyright notice and this permission notice shall be included in
17  all copies or substantial portions of the Software.
18 
19  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  DEALINGS IN THE SOFTWARE.
26 
27  Note that the Qore library is released under a choice of three open-source
28  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29  information.
30 */
31 
32 #ifndef _QORE_ABSTRACTQORENODE_H
33 
34 #define _QORE_ABSTRACTQORENODE_H
35 
36 #include <qore/common.h>
37 #include <qore/QoreReferenceCounter.h>
38 #include <qore/node_types.h>
39 
40 #include <string>
41 
42 #include <assert.h>
43 
44 #define FMT_YAML_SHORT -2
45 #define FMT_NONE -1
46 #define FMT_NORMAL 0
47 
48 class LocalVar;
49 
51 
55 private:
57  DLLLOCAL AbstractQoreNode& operator=(const AbstractQoreNode&);
58 
60 
63  DLLLOCAL virtual bool getAsBoolImpl() const { return false; }
64 
66 
69  DLLLOCAL virtual int getAsIntImpl() const { return 0; }
70 
72 
75  DLLLOCAL virtual int64 getAsBigIntImpl() const { return 0; }
76 
78 
81  DLLLOCAL virtual double getAsFloatImpl() const { return 0.0; }
82 
84 
91  DLLEXPORT virtual AbstractQoreNode* evalImpl(ExceptionSink* xsink) const = 0;
92 
94 
100  DLLEXPORT virtual AbstractQoreNode* evalImpl(bool& needs_deref, ExceptionSink* xsink) const = 0;
101 
103 
107  DLLEXPORT virtual int64 bigIntEvalImpl(ExceptionSink* xsink) const;
108 
110 
114  DLLEXPORT virtual int integerEvalImpl(ExceptionSink* xsink) const;
115 
117 
121  DLLEXPORT virtual bool boolEvalImpl(ExceptionSink* xsink) const;
122 
124 
128  DLLEXPORT virtual double floatEvalImpl(ExceptionSink* xsink) const;
129 
131 
136  DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
137 
139 
143  DLLEXPORT virtual void customRef() const;
144 
149  DLLEXPORT virtual void customDeref(ExceptionSink* xsink);
150 
151 protected:
153 
157 
159  bool value : 1;
160 
162  bool needs_eval_flag : 1;
163 
166 
169 
171  bool has_value_api : 1;
172 
174 
177  DLLEXPORT virtual ~AbstractQoreNode();
178 
179 public:
181 
188  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);
189 
191  DLLEXPORT AbstractQoreNode(const AbstractQoreNode& v);
192 
194 
197  DLLEXPORT bool getAsBool() const;
198 
200 
203  DLLEXPORT int getAsInt() const;
204 
206 
209  DLLEXPORT int64 getAsBigInt() const;
210 
212 
215  DLLEXPORT double getAsFloat() const;
216 
218 
223  DLLEXPORT virtual QoreString *getStringRepresentation(bool& del) const;
224 
226 
229  DLLEXPORT virtual void getStringRepresentation(QoreString &str) const;
230 
232 
236  DLLEXPORT virtual class DateTime *getDateTimeRepresentation(bool& del) const;
237 
239 
242  DLLEXPORT virtual void getDateTimeRepresentation(DateTime &dt) const;
243 
245 
251  DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const = 0;
252 
254 
260  DLLEXPORT virtual QoreString *getAsString(bool& del, int foff, ExceptionSink* xsink) const = 0;
261 
263 
266  DLLLOCAL bool needs_eval() const {
267  return needs_eval_flag;
268  }
269 
271 
274  DLLEXPORT virtual AbstractQoreNode* realCopy() const = 0;
275 
277 
282  DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const = 0;
283 
285 
290  DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const = 0;
291 
293 
296  DLLLOCAL qore_type_t getType() const {
297  return type;
298  }
299 
301 
304  DLLEXPORT virtual const char* getTypeName() const = 0;
305 
307 
320  DLLEXPORT AbstractQoreNode* eval(ExceptionSink* xsink) const;
321 
323 
331  DLLEXPORT AbstractQoreNode* eval(bool& needs_deref, ExceptionSink* xsink) const;
332 
334 
338  DLLEXPORT int64 bigIntEval(ExceptionSink* xsink) const;
339 
341 
345  DLLEXPORT int integerEval(ExceptionSink* xsink) const;
346 
348 
352  DLLEXPORT bool boolEval(ExceptionSink* xsink) const;
353 
355 
359  DLLEXPORT double floatEval(ExceptionSink* xsink) const;
360 
362 
365  DLLLOCAL bool is_value() const {
366  return value;
367  }
368 
370 
374  DLLEXPORT void deref(ExceptionSink* xsink);
375 
377 
380  DLLEXPORT AbstractQoreNode* refSelf() const;
381 
383  DLLEXPORT void ref() const;
384 
386  DLLLOCAL bool isReferenceCounted() const { return !there_can_be_only_one; }
387 
389 
399  DLLEXPORT virtual AbstractQoreNode* parseInit(LocalVar* oflag, int pflag, int& lvids, const QoreTypeInfo*& typeInfo);
400 
401  // new eval APIs - to be virtual in bew API
402  DLLEXPORT QoreValue evalValue(ExceptionSink* xsink) const;
403  DLLEXPORT QoreValue evalValue(bool& needs_deref, ExceptionSink* xsink) const;
404 
406  DLLLOCAL bool hasValueApi() const;
407 };
408 
410 
414 private:
416  DLLLOCAL SimpleQoreNode& operator=(const SimpleQoreNode&);
417 
418 public:
420  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) { }
421 
423  DLLLOCAL SimpleQoreNode(const SimpleQoreNode& v) : AbstractQoreNode(v) { }
424 
426 
430  DLLEXPORT void deref();
431 };
432 
435 private:
436 
437 protected:
439 
441  DLLEXPORT virtual AbstractQoreNode* evalImpl(ExceptionSink* xsink) const;
442 
444 
446  DLLEXPORT virtual AbstractQoreNode* evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
447 
449 
451  DLLEXPORT virtual int64 bigIntEvalImpl(ExceptionSink* xsink) const;
452 
454 
456  DLLEXPORT virtual int integerEvalImpl(ExceptionSink* xsink) const;
457 
459 
461  DLLEXPORT virtual bool boolEvalImpl(ExceptionSink* xsink) const;
462 
464 
466  DLLEXPORT virtual double floatEvalImpl(ExceptionSink* xsink) const;
467 
468 public:
470  DLLLOCAL SimpleValueQoreNode(qore_type_t t, bool n_there_can_be_only_one = false) : SimpleQoreNode(t, true, false, n_there_can_be_only_one) { }
471 
472  DLLLOCAL SimpleValueQoreNode(const SimpleValueQoreNode& v) : SimpleQoreNode(v) { }
473 };
474 
476 
479 private:
481  DLLLOCAL UniqueValueQoreNode& operator=(const UniqueValueQoreNode&);
482 
484  DLLLOCAL void *operator new(size_t);
485 
486 protected:
487 
488 public:
491 
494 
496  DLLEXPORT virtual AbstractQoreNode* realCopy() const;
497 };
498 
499 #endif
DLLLOCAL qore_type_t getType() const
returns the data type
Definition: AbstractQoreNode.h:296
virtual DLLEXPORT QoreString * getStringRepresentation(bool &del) const
returns the value of the type converted to a string, default implementation: returns the empty string...
DLLEXPORT int getAsInt() const
returns the integer value of the object
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
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...
DLLLOCAL bool is_value() const
returns true if the node represents a value
Definition: AbstractQoreNode.h:365
DLLEXPORT int64 bigIntEval(ExceptionSink *xsink) const
evaluates the object and returns a 64-bit integer value
DLLEXPORT bool getAsBool() const
returns the boolean value of the object
Holds absolute and relative date/time values in Qore with precision to the microsecond.
Definition: DateTime.h:93
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:54
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 AbstractQoreNode * refSelf() const
returns "this" with an incremented reference count
virtual DLLEXPORT const char * getTypeName() const =0
returns the type name as a c string
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:82
bool custom_reference_handlers
set to one for objects that need custom reference handlers
Definition: AbstractQoreNode.h:168
bool needs_eval_flag
if this is true then the type can be evaluated
Definition: AbstractQoreNode.h:162
DLLEXPORT double floatEval(ExceptionSink *xsink) const
evaluates the object and returns a floating-point value
this class is for value types that will exists only once in the Qore library, reference counting is d...
Definition: AbstractQoreNode.h:478
provides atomic reference counting to Qore objects
Definition: QoreReferenceCounter.h:44
DLLEXPORT int integerEval(ExceptionSink *xsink) const
evaluates the object and returns an integer value
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:112
virtual DLLEXPORT class DateTime * getDateTimeRepresentation(bool &del) const
returns the DateTime representation of this type (default implementation: returns ZeroDate...
virtual DLLEXPORT AbstractQoreNode * realCopy() const =0
returns a copy of the object; the caller owns the reference count
DLLEXPORT int64 getAsBigInt() const
returns the 64-bit integer value of the object
The base class for all types in Qore expression trees that cannot throw an exception when deleted...
Definition: AbstractQoreNode.h:413
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:47
bool has_value_api
set to flag with new QoreValue API (derived from ParseNode) - FIXME: to be removed when new ABI is im...
Definition: AbstractQoreNode.h:171
DLLEXPORT void deref(ExceptionSink *xsink)
decrements the reference count and calls derefImpl() if there_can_be_only_one is false, otherwise does nothing
DLLLOCAL bool needs_eval() const
returns true if the object needs evaluation to return a value, false if not
Definition: AbstractQoreNode.h:266
DLLLOCAL bool hasValueApi() const
returns the "has value api" flags - FIXME: remove with new ABI
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition: common.h:241
DLLEXPORT void ref() const
increments the reference count
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
DLLEXPORT double getAsFloat() const
returns the float value of the object
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:165
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:71
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:159
virtual DLLEXPORT ~AbstractQoreNode()
default destructor does nothing
base class for simple value types
Definition: AbstractQoreNode.h:434
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:386
qore_type_t type
the type of the object
Definition: AbstractQoreNode.h:156
DLLEXPORT bool boolEval(ExceptionSink *xsink) const
evaluates the object and returns a boolean value
DLLEXPORT AbstractQoreNode * eval(ExceptionSink *xsink) const
evaluates the object and returns a value (or 0)