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) {
 
   72             assert(type == QV_Node);
 
   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();
 
  201         assert(type == QV_Node);
 
  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;
 
  264     DLLEXPORT 
bool isConstant() 
const;
 
  267     DLLEXPORT 
operator bool() 
const;
 
  330     DLLEXPORT 
void ref() 
const;
 
  503     DLLLOCAL 
operator bool()
 const {
 
  539     DLLLOCAL 
operator bool()
 const {
 
  583         if (
v.type == QV_Node) {
 
  585             return v.takeNodeIntern();
 
  593         if (
v.type == QV_Node) {
 
  595             return v.takeNodeIntern();
 
  651 DLLEXPORT 
extern const char* qoreBoolTypeName;
 
  653 DLLEXPORT 
extern const char* qoreIntTypeName;
 
  655 DLLEXPORT 
extern const char* qoreFloatTypeName;
 
static void discard(AbstractQoreNode *n, ExceptionSink *xsink)
to deref an AbstractQoreNode (when the pointer may be 0)
Definition: QoreLib.h:324
 
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:57
 
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
 
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:93
 
evaluates an AbstractQoreNode and dereferences the stored value in the destructor
Definition: QoreValue.h:613
 
DLLEXPORT ValueEvalRefHolder(const AbstractQoreNode *exp, ExceptionSink *xs)
evaluates the exp argument
 
DLLEXPORT int eval(const AbstractQoreNode *exp)
evaluates the argument, returns -1 for error, 0 = OK
 
DLLLOCAL int evalIntern(const AbstractQoreNode *exp)
evaluates the argument, returns -1 for error, 0 = OK
 
base class for holding a QoreValue object
Definition: QoreValue.h:446
 
DLLLOCAL QoreValue * operator->()
returns the value being managed
Definition: QoreValue.h:463
 
ExceptionSink * xsink
for possible Qore-language exceptions
Definition: QoreValue.h:451
 
DLLLOCAL QoreValue & operator*()
returns the value being managed
Definition: QoreValue.h:469
 
DLLLOCAL ValueHolderBase(ExceptionSink *xs)
creates an ampty object
Definition: QoreValue.h:455
 
QoreValue v
the value held
Definition: QoreValue.h:449
 
holds an object and dereferences it in the destructor
Definition: QoreValue.h:476
 
DLLEXPORT ~ValueHolder()
dereferences any contained node
 
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:479
 
DLLEXPORT QoreValue getReferencedValue()
returns a referenced value; caller owns the reference; the current object is left undisturbed
 
DLLLOCAL QoreValue & operator=(QoreValue nv)
assigns the object, any currently-held value is dereferenced before the assignment
Definition: QoreValue.h:496
 
allows storing a value and setting a boolean flag that indicates if the value should be dereference i...
Definition: QoreValue.h:509
 
DLLLOCAL bool isTemp() const
returns true if the value is temporary (needs dereferencing)
Definition: QoreValue.h:530
 
DLLLOCAL ValueOptionalRefHolder(QoreValue n_v, bool nd, ExceptionSink *xs)
creates the object with the given values
Definition: QoreValue.h:520
 
DLLLOCAL AbstractQoreNode * takeNode(bool &nd)
returns the stored AbstractQoreNode pointer and sets the dereference flag as an output variable
Definition: QoreValue.h:582
 
DLLLOCAL QoreValue takeValue(bool &nd)
returns the stored value and sets the dereference flag as an output variable
Definition: QoreValue.h:592
 
DLLLOCAL void setValue(QoreValue nv)
assigns a new non-temporary value
Definition: QoreValue.h:544
 
DLLEXPORT void ensureReferencedValue()
 
DLLEXPORT QoreValue takeReferencedValue()
returns a QoreValue after incrementing the reference count of any node value stored if necessary
 
DLLLOCAL void clearTemp()
sets needs_deref = false
Definition: QoreValue.h:533
 
DLLEXPORT QoreValue getReferencedValue()
returns a referenced value; caller owns the reference; the current object is not disturbed
 
bool needs_deref
flag indicating if the value should be dereferenced in the destructor or not
Definition: QoreValue.h:516
 
DLLLOCAL T * takeReferencedNode()
returns the stored node value and leaves the current object empty
Definition: QoreValue.h:568
 
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:602
 
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode)
Definition: common.h:70
 
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
 
namespace for implementation details of QoreValue functions
Definition: QoreValue.h:64
 
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:275
 
DLLEXPORT AbstractQoreNode * takeIfNode()
returns a referenced value; leaving the "this" untouched; the caller owns the reference returned
 
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
 
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 void discard(ExceptionSink *xsink)
dereferences any contained AbstractQoreNode pointer and sets to 0; does not modify other values
 
DLLEXPORT QoreValue & operator=(const QoreValue &n)
assigns a new value
 
DLLEXPORT const QoreTypeInfo * getTypeInfo() const
returns the type of the value
 
DLLEXPORT bool isReferenceCounted() const
returns true if the value holds a referenced-counted node
 
DLLEXPORT const QoreTypeInfo * getFullTypeInfo() const
returns the exact type of the value; i.e. the class type for classes, hashdecl type for hashdecls
 
DLLEXPORT void swap(QoreValue &val)
exchanges the values
 
DLLEXPORT bool hasNode() const
returns true if the object contains a non-null AbstractQoreNode pointer (ie type == QV_Node && v....
 
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...
 
DLLEXPORT AbstractQoreNode * assign(const QoreValue n)
sets the value of the object and returns any node value held previously
 
DLLEXPORT QoreValue eval(ExceptionSink *xsink) const
evaluates the node and returns the result
 
DLLEXPORT bool derefCanThrowException() const
returns true if a dereference could theoretically throw an exception (an object is reachable from thi...
 
DLLEXPORT QoreValue()
creates with no value (i.e. QoreNothingNode)
 
DLLEXPORT AbstractQoreNode * assignNothing()
sets the value of the object to QoreNothingNode and returns any node value held previously
 
DLLEXPORT bool isEqualHard(const QoreValue v) const
returns trus if the argument value is equal to the current value without any type conversions
 
DLLEXPORT void ref() const
references the contained value if type == QV_Node
 
DLLEXPORT QoreValue refSelf() const
references the contained value if type == QV_Node, returns itself
 
DLLEXPORT bool isEqualSoft(const QoreValue v, ExceptionSink *xsink) const
returns trus if the argument value is equal to the current value with type conversions
 
DLLEXPORT void sanitize()
converts any node pointers to efficient representations if possible and dereferences the node value c...
 
used in QoreValue::get()
Definition: QoreValue.h:67
 
this is the union that stores values in QoreValue
Definition: QoreValue.h:56
 
bool b
for boolean values
Definition: QoreValue.h:57
 
AbstractQoreNode * n
for all heap-allocated values
Definition: QoreValue.h:60
 
double f
for double values
Definition: QoreValue.h:59
 
int64 i
for integer values
Definition: QoreValue.h:58