32 #ifndef _QORE_QOREVALUE_H 33 #define _QORE_QOREVALUE_H 37 typedef unsigned char valtype_t;
43 #define QV_Bool (valtype_t)0 44 #define QV_Int (valtype_t)1 45 #define QV_Float (valtype_t)2 46 #define QV_Node (valtype_t)3 47 #define QV_Ref (valtype_t)4 66 template<
typename Type>
68 typedef Type * Result;
71 static Result cast(QV *qv, valtype_t type) {
73 assert(!qv->v.n || dynamic_cast<Result>(qv->v.n));
74 return reinterpret_cast<Result
>(qv->v.n);
84 static bool cast(QV *qv, valtype_t type) {
85 return qv->getAsBool();
92 typedef double Result;
95 static double cast(QV *qv, valtype_t type) {
96 return qv->getAsFloat();
103 typedef int64 Result;
105 template<
typename QV>
106 static int64 cast(QV *qv, valtype_t type) {
107 return qv->getAsBigInt();
112 class QoreSimpleValue {
120 DLLLOCAL
void set(
int64 i) {
126 DLLLOCAL
void set(
double f) {
132 DLLLOCAL
void set(
bool b) {
138 DLLEXPORT
void set(QoreSimpleValue val);
144 DLLLOCAL QoreSimpleValue& assign(QoreSimpleValue& val) {
150 DLLLOCAL QoreSimpleValue& assign(
int64 i) {
156 DLLLOCAL QoreSimpleValue& assign(
double f) {
162 DLLLOCAL QoreSimpleValue& assign(
bool b) {
177 DLLEXPORT
const char* getTypeName()
const;
191 DLLEXPORT
void clear();
202 assert(dynamic_cast<T*>(v.
n));
203 T* rv =
reinterpret_cast<T*
>(v.
n);
213 DLLLOCAL
typename detail::QoreValueCastHelper<T>::Result
get() {
222 DLLLOCAL
typename detail::QoreValueCastHelper<const T>::Result
get()
const {
227 DLLEXPORT
bool getAsBool()
const;
230 DLLEXPORT
int64 getAsBigInt()
const;
233 DLLEXPORT
double getAsFloat()
const;
236 DLLEXPORT
bool hasEffect()
const;
239 DLLEXPORT
bool isNothing()
const;
242 DLLEXPORT
bool isNull()
const;
245 DLLEXPORT
bool isNullOrNothing()
const;
248 DLLEXPORT
bool isValue()
const;
251 DLLEXPORT
bool needsEval()
const;
256 DLLEXPORT
bool isScalar()
const;
259 DLLEXPORT
operator bool()
const;
292 DLLEXPORT
QoreValue(
unsigned long long i);
313 DLLEXPORT
QoreValue(
const QoreSimpleValue& v);
322 DLLEXPORT
void ref()
const;
428 DLLEXPORT
bool hasNode()
const;
495 DLLLOCAL
operator bool()
const {
531 DLLLOCAL
operator bool()
const {
577 return v.takeNodeIntern();
587 return v.takeNodeIntern();
643 DLLEXPORT
extern const char* qoreBoolTypeName;
645 DLLEXPORT
extern const char* qoreIntTypeName;
647 DLLEXPORT
extern const char* qoreFloatTypeName;
DLLEXPORT QoreValue()
creates with no value (i.e. QoreNothingNode)
DLLEXPORT void swap(QoreValue &val)
exchanges the values
DLLEXPORT ~ValueHolder()
dereferences any contained node
DLLEXPORT QoreValue getReferencedValue()
returns a referenced value; caller owns the reference; the current object is left undisturbed ...
double f
for double values
Definition: QoreValue.h:59
DLLLOCAL int evalIntern(const AbstractQoreNode *exp)
evaluates the argument, returns -1 for error, 0 = OK
DLLEXPORT bool isEqualSoft(const QoreValue v, ExceptionSink *xsink) const
returns trus if the argument value is equal to the current value with type conversions ...
base class for holding a QoreValue object
Definition: QoreValue.h:438
DLLEXPORT bool isReferenceCounted() const
returns true if the value holds a referenced-counted node
#define QV_Int
for integer values
Definition: QoreValue.h:44
this is the union that stores values in QoreValue
Definition: QoreValue.h:56
DLLEXPORT AbstractQoreNode * assignNothing()
sets the value of the object to QoreNothingNode and returns any node value held previously ...
DLLEXPORT QoreValue release()
returns a QoreValue object and leaves the current object empty; the caller owns any reference contain...
DLLLOCAL ValueHolder(ExceptionSink *xs)
creates an empty object
Definition: QoreValue.h:471
allows storing a value and setting a boolean flag that indicates if the value should be dereference i...
Definition: QoreValue.h:501
DLLLOCAL T * takeReferencedNode()
returns the stored node value and leaves the current object empty
Definition: QoreValue.h:560
evaluates an AbstractQoreNode and dereferences the stored value in the destructor ...
Definition: QoreValue.h:605
DLLEXPORT int getAsString(QoreString &str, int format_offset, ExceptionSink *xsink) const
appends the string value of the contained node to the string argument with optional formatting ...
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:57
DLLEXPORT const char * getFullTypeName() const
returns a string type description of the full type of the value contained (ex: "nothing" for a null A...
DLLEXPORT QoreValue & operator=(const QoreValue &n)
assigns a new value
DLLLOCAL bool isTemp() const
returns true if the value is temporary (needs dereferencing)
Definition: QoreValue.h:522
static void discard(AbstractQoreNode *n, ExceptionSink *xsink)
to deref an AbstractQoreNode (when the pointer may be 0)
Definition: QoreLib.h:324
DLLLOCAL ValueOptionalRefHolder(QoreValue n_v, bool nd, ExceptionSink *xs)
creates the object with the given values
Definition: QoreValue.h:512
DLLLOCAL AbstractQoreNode * takeNode(bool &nd)
returns the stored AbstractQoreNode pointer and sets the dereference flag as an output variable ...
Definition: QoreValue.h:574
bool needs_deref
flag indicating if the value should be dereferenced in the destructor or not
Definition: QoreValue.h:508
DLLEXPORT void ref() const
references the contained value if type == QV_Node
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:81
ExceptionSink * xsink
for possible Qore-language exceptions
Definition: QoreValue.h:443
used in QoreValue::get()
Definition: QoreValue.h:67
#define QV_Node
for heap-allocated values
Definition: QoreValue.h:46
namespace for implementation details of QoreValue functions
Definition: QoreValue.h:64
DLLEXPORT bool derefCanThrowException() const
returns true if a dereference could theoretically throw an exception (an object is reachable from thi...
DLLEXPORT const QoreTypeInfo * getFullTypeInfo() const
returns the exact type of the value; i.e. the class type for classes, hashdecl type for hashdecls ...
DLLEXPORT AbstractQoreNode * takeIfNode()
returns a referenced value; leaving the "this" untouched; the caller owns the reference returned ...
DLLEXPORT void sanitize()
converts any node pointers to efficient representations if possible and dereferences the node value c...
DLLEXPORT QoreValue getReferencedValue()
returns a referenced value; caller owns the reference; the current object is not disturbed ...
DLLLOCAL QoreValue takeValue(bool &nd)
returns the stored value and sets the dereference flag as an output variable
Definition: QoreValue.h:584
#define QV_Bool
for boolean values
Definition: QoreValue.h:43
DLLLOCAL void setValue(QoreValue nv)
assigns a new non-temporary value
Definition: QoreValue.h:536
QoreValue v
the value held
Definition: QoreValue.h:441
DLLLOCAL void takeValueFrom(ValueOptionalRefHolder &val)
returns the stored value which must be dereferenced if it is a node object (i.e. type == QV_Node) ...
Definition: QoreValue.h:594
DLLEXPORT bool isEqualValue(const QoreValue v)
returns true of the argument is exactly the same value as the current value, meaning also that if bot...
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:267
AbstractQoreNode * n
for all heap-allocated values
Definition: QoreValue.h:60
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
DLLEXPORT AbstractQoreNode * assign(const QoreValue n)
sets the value of the object and returns any node value held previously
DLLEXPORT const QoreTypeInfo * getTypeInfo() const
returns the type of the value
DLLEXPORT QoreValue takeReferencedValue()
returns a QoreValue after incrementing the reference count of any node value stored if necessary ...
DLLLOCAL QoreValue & operator*()
returns the value being managed
Definition: QoreValue.h:461
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:260
DLLLOCAL QoreValue & operator=(QoreValue nv)
assigns the object, any currently-held value is dereferenced before the assignment ...
Definition: QoreValue.h:488
int64 i
for integer values
Definition: QoreValue.h:58
DLLLOCAL ValueHolderBase(ExceptionSink *xs)
creates an ampty object
Definition: QoreValue.h:447
#define QV_Float
for floating-point values
Definition: QoreValue.h:45
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:70
DLLEXPORT QoreValue eval(ExceptionSink *xsink) const
evaluates the node and returns the result
DLLEXPORT ValueEvalRefHolder(const AbstractQoreNode *exp, ExceptionSink *xs)
evaluates the exp argument
bool b
for boolean values
Definition: QoreValue.h:57
DLLLOCAL QoreValue * operator->()
returns the value being managed
Definition: QoreValue.h:455
DLLEXPORT int eval(const AbstractQoreNode *exp)
evaluates the argument, returns -1 for error, 0 = OK
DLLEXPORT bool isEqualHard(const QoreValue v) const
returns trus if the argument value is equal to the current value without any type conversions ...
holds an object and dereferences it in the destructor
Definition: QoreValue.h:468
DLLEXPORT bool hasNode() const
returns true if the object contains a non-null AbstractQoreNode pointer (ie type == QV_Node && v...
DLLLOCAL void clearTemp()
sets needs_deref = false
Definition: QoreValue.h:525
DLLEXPORT QoreValue refSelf() const
references the contained value if type == QV_Node, returns itself
DLLEXPORT void ensureReferencedValue()
DLLEXPORT void discard(ExceptionSink *xsink)
dereferences any contained AbstractQoreNode pointer and sets to 0; does not modify other values ...