Qore Programming Language - C/C++ Library  0.8.12.2
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
QoreObject.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreObject.h
4 
5  thread-safe object definition
6 
7  references: how many variables are pointing at this object?
8 
9  Qore Programming Language
10 
11  Copyright (C) 2003 - 2016 David Nichols
12 
13  Permission is hereby granted, free of charge, to any person obtaining a
14  copy of this software and associated documentation files (the "Software"),
15  to deal in the Software without restriction, including without limitation
16  the rights to use, copy, modify, merge, publish, distribute, sublicense,
17  and/or sell copies of the Software, and to permit persons to whom the
18  Software is furnished to do so, subject to the following conditions:
19 
20  The above copyright notice and this permission notice shall be included in
21  all copies or substantial portions of the Software.
22 
23  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29  DEALINGS IN THE SOFTWARE.
30 
31  Note that the Qore library is released under a choice of three open-source
32  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
33  information.
34 */
35 
36 #ifndef _QORE_QOREOBJECT_H
37 
38 #define _QORE_QOREOBJECT_H
39 
40 class AutoVLock;
41 class VRMutex;
42 class BuiltinCopy;
43 class BuiltinDeleteBlocker;
44 class BuiltinNormalMethodVariantBase;
45 class BuiltinCopyVariantBase;
46 class QoreExternalMethodVariant;
47 class QoreExternalStaticMethodVariant;
48 class QoreProgram;
49 
51 
64 class QoreObject : public AbstractQoreNode {
65  friend class qore_object_private;
66  friend class ObjectRSetHelper;
67  friend class ObjectRSet;
68 
69 private:
71  class qore_object_private* priv;
72 
74  DLLLOCAL QoreObject(const QoreObject&);
75 
77  DLLLOCAL QoreObject& operator=(const QoreObject&);
78 
79 protected:
81 
85  DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
86 
88 
90  DLLLOCAL virtual AbstractQoreNode* evalImpl(ExceptionSink* xsink) const;
91 
93 
95  DLLLOCAL virtual AbstractQoreNode* evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
96 
98 
100  DLLLOCAL virtual int64 bigIntEvalImpl(ExceptionSink* xsink) const;
101 
103 
105  DLLLOCAL virtual int integerEvalImpl(ExceptionSink* xsink) const;
106 
108 
110  DLLLOCAL virtual bool boolEvalImpl(ExceptionSink* xsink) const;
111 
113 
115  DLLLOCAL virtual double floatEvalImpl(ExceptionSink* xsink) const;
116 
118  DLLLOCAL void customRefIntern() const;
119 
121  DLLLOCAL virtual void customRef() const;
122 
124  DLLLOCAL virtual void customDeref(ExceptionSink* xsink);
125 
127  DLLLOCAL virtual ~QoreObject();
128 
129 public:
131 
135  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p);
136 
138 
143  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p, AbstractPrivateData *data);
144 
146 
148  DLLEXPORT virtual bool getAsBoolImpl() const;
149 
151 
157  DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
158 
160 
167  DLLEXPORT virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
168 
170  DLLEXPORT virtual AbstractQoreNode* realCopy() const;
171 
173 
177  DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const;
178 
180 
184  DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const;
185 
187  DLLEXPORT virtual const char* getTypeName() const;
188 
190  DLLLOCAL static const char* getStaticTypeName() {
191  return "object";
192  }
193 
195  DLLLOCAL static qore_type_t getStaticTypeCode() {
196  return NT_OBJECT;
197  }
198 
200 
204  DLLEXPORT bool validInstanceOf(qore_classid_t cid) const;
205 
207 
209  DLLEXPORT bool validInstanceOf(const QoreClass& qc) const;
210 
212 
217  DLLEXPORT void setValue(const char* key, AbstractQoreNode* val, ExceptionSink* xsink);
218 
220 
223  DLLEXPORT QoreListNode* getMemberList(ExceptionSink* xsink) const;
224 
226 
230  DLLEXPORT void deleteMemberValue(const QoreString* key, ExceptionSink* xsink);
231 
233 
237  DLLEXPORT void deleteMemberValue(const char* key, ExceptionSink* xsink);
238 
240 
244  DLLEXPORT void removeMember(const QoreString* key, ExceptionSink* xsink);
245 
247 
251  DLLEXPORT void removeMember(const char* key, ExceptionSink* xsink);
252 
254 
259  DLLEXPORT AbstractQoreNode* takeMember(const QoreString* key, ExceptionSink* xsink);
260 
262 
267  DLLEXPORT AbstractQoreNode* takeMember(const char* key, ExceptionSink* xsink);
268 
270 
273  DLLEXPORT int size(ExceptionSink* xsink) const;
274 
276 
280  DLLEXPORT bool compareSoft(const QoreObject* obj, ExceptionSink* xsink) const;
281 
283 
287  DLLEXPORT bool compareHard(const QoreObject* obj, ExceptionSink* xsink) const;
288 
290 
295  DLLEXPORT AbstractQoreNode* getReferencedMemberNoMethod(const char* mem, ExceptionSink* xsink) const;
296 
298 
304  DLLEXPORT int64 getMemberAsBigInt(const char* mem, bool& found, ExceptionSink* xsink) const;
305 
307 
310  DLLEXPORT QoreHashNode* copyData(ExceptionSink* xsink) const;
311 
313 
317  DLLEXPORT void mergeDataToHash(QoreHashNode* hash, ExceptionSink* xsink);
318 
320 
324  DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData *pd);
325 
327 
332 
334 
339  DLLEXPORT QoreValue evalMethodValue(const QoreString* name, const QoreListNode* args, ExceptionSink* xsink);
340 
342 
347  DLLEXPORT QoreValue evalMethodValue(const char* name, const QoreListNode* args, ExceptionSink* xsink);
348 
350 
357  DLLEXPORT AbstractQoreNode* evalMethod(const QoreString* name, const QoreListNode* args, ExceptionSink* xsink);
358 
360 
367  DLLEXPORT AbstractQoreNode* evalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
368 
370 
377  DLLEXPORT int64 bigIntEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
378 
380 
387  DLLEXPORT int intEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
388 
390 
397  DLLEXPORT bool boolEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
398 
400 
407  DLLEXPORT double floatEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
408 
410 
415  DLLEXPORT QoreValue evalMethodValue(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
416 
418 
425  DLLEXPORT AbstractQoreNode* evalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
426 
428 
435  DLLEXPORT int64 bigIntEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
436 
438 
445  DLLEXPORT int intEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
446 
448 
455  DLLEXPORT bool boolEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
456 
458 
465  DLLEXPORT double floatEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
466 
468 
471  DLLEXPORT void doDelete(ExceptionSink* xsink);
472 
474 
478  DLLEXPORT const QoreClass* getClass(qore_classid_t cid) const;
479 
481 
488  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
489 
491 
494  DLLEXPORT const QoreClass* getClass() const;
495 
497 
500  DLLEXPORT const char* getClassName() const;
501 
503 
506  DLLEXPORT bool isValid() const;
507 
509 
512  DLLEXPORT QoreProgram* getProgram() const;
513 
515 
518  DLLEXPORT bool isSystemObject() const;
519 
521 
526  DLLEXPORT void tRef() const;
527 
529 
532  DLLEXPORT void tDeref();
533 
535 
543  DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const QoreString* key, AutoVLock* vl, ExceptionSink* xsink) const;
544 
546 
552  DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const char* key, AutoVLock* vl, ExceptionSink* xsink) const;
553 
555 
557  DLLEXPORT void deleteBlockerRef() const;
558 
560 
564  DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink* xsink);
565 
567  DLLEXPORT AbstractQoreNode* evalMethodVariant(const QoreMethod& method, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
568 
569  DLLLOCAL int getStatus() const;
570 
572 
576  DLLLOCAL QoreValue evalMember(const QoreString* member, ExceptionSink* xsink);
577 
579 
583  DLLLOCAL QoreHashNode* getRuntimeMemberHash(ExceptionSink* xsink) const;
584 
585  DLLLOCAL class KeyNode* getReferencedPrivateDataNode(qore_classid_t key);
586 
588 
593 
595 
601  DLLLOCAL QoreValue evalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
602 
604  DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase* meth, QoreObject* self, ExceptionSink* xsink);
605 
607 
611  DLLLOCAL void addPrivateDataToString(QoreString* str, ExceptionSink* xsink) const;
612 
614 
617  DLLLOCAL void obliterate(ExceptionSink* xsink);
618 
620 
624  DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink* xsink);
625 
627 
635  DLLLOCAL AbstractQoreNode** getExistingValuePtr(const QoreString* mem, AutoVLock* vl, ExceptionSink* xsink) const;
636 
638 
645  DLLLOCAL AbstractQoreNode** getExistingValuePtr(const char* mem, AutoVLock* vl, ExceptionSink* xsink) const;
646 
647  // returns a new hash consisting of just the members of value_list
648  DLLLOCAL QoreHashNode* getSlice(const QoreListNode* value_list, ExceptionSink* xsink) const;
649 
651  DLLLOCAL QoreObject(const QoreClass* oc, QoreProgram* p, QoreHashNode* d);
652 
654  DLLLOCAL bool evalDeleteBlocker(qore_classid_t classid_for_method, BuiltinDeleteBlocker* meth);
655 
657  DLLLOCAL bool hasMemberNotification() const;
658 
660  DLLLOCAL void execMemberNotification(const char* member, ExceptionSink* xsink);
661 
663  DLLLOCAL AbstractQoreNode** getMemberValuePtrForInitialization(const char* member);
664 };
665 
667 template <class T>
669 public:
670  DLLLOCAL PrivateDataRefHolder(const QoreObject* o, qore_classid_t cid, ExceptionSink* xsink) : ReferenceHolder<T>(reinterpret_cast<T*>(o->getReferencedPrivateData(cid, xsink)), xsink) {
671  }
672 };
673 
674 class QorePrivateObjectAccessHelper {
675 private:
676  // not implemented
677  DLLLOCAL QorePrivateObjectAccessHelper(const QorePrivateObjectAccessHelper&);
678  DLLLOCAL QorePrivateObjectAccessHelper& operator=(const QorePrivateObjectAccessHelper&);
679  DLLLOCAL void* operator new(size_t);
680 
681 protected:
682  ExceptionSink* xsink;
683  void* ptr;
684 
685 public:
686  DLLLOCAL QorePrivateObjectAccessHelper(ExceptionSink* xs) : xsink(xs), ptr(0) {
687  }
688 
689  DLLLOCAL operator bool() const {
690  return (bool)ptr;
691  }
692 };
693 
694 #endif
DLLLOCAL QoreHashNode * getRuntimeMemberHash(ExceptionSink *xsink) const
retuns member data of the object (or 0 if there&#39;s an exception), private members are excluded if call...
DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase *meth, QoreObject *self, ExceptionSink *xsink)
called on the old object (this) to acquire private data, copy method called with pointer to &quot;self&quot; (n...
DLLEXPORT bool compareHard(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion of c...
AutoVLock is a container for safely managing global variable and object lock handovers, required for functions accessing global variables and object data where locking is necessary.
Definition: AutoVLock.h:80
DLLEXPORT bool isSystemObject() const
returns true if the object is a system object (created with the system constructor) ...
DLLLOCAL void execMemberNotification(const char *member, ExceptionSink *xsink)
executes the member notification on the object the given member
This is the hash or associative list container type in Qore, dynamically allocated only...
Definition: QoreHashNode.h:49
DLLEXPORT void setValue(const char *key, AbstractQoreNode *val, ExceptionSink *xsink)
sets the value of the given member to the given value
DLLLOCAL AbstractQoreNode ** getMemberValuePtrForInitialization(const char *member)
returns a pointer to an object member during initialization (no locking; interal use only) ...
DLLEXPORT void doDelete(ExceptionSink *xsink)
runs the destructor on the object (if it hasn&#39;t already been deleted)
virtual DLLLOCAL bool boolEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
the base class for all data to be used as private data of Qore objects
Definition: AbstractPrivateData.h:44
DLLEXPORT void mergeDataToHash(QoreHashNode *hash, ExceptionSink *xsink)
copies all member data of the current object to the passed QoreHashNode
DLLEXPORT const char * getClassName() const
returns the name of the class
DLLEXPORT bool compareSoft(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion of c...
DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink *xsink)
call this function when an object&#39;s private data is deleted externally
DLLEXPORT void removeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors; the value is only dereferenc...
DLLEXPORT AbstractPrivateData * getReferencedPrivateData(qore_classid_t key, ExceptionSink *xsink) const
returns the private data corresponding to the class ID passed with an incremented reference count...
DLLEXPORT int size(ExceptionSink *xsink) const
returns the number of members of the object
DLLEXPORT AbstractQoreNode * takeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors and returns the value removed...
virtual DLLEXPORT bool getAsBoolImpl() const
returns false unless perl-boolean-evaluation is enabled, in which case it returns false only when emp...
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:55
const qore_type_t NT_OBJECT
type value for QoreObject
Definition: node_types.h:52
virtual DLLLOCAL ~QoreObject()
destructor
DLLEXPORT bool boolEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as a bool ...
DLLEXPORT const QoreClass * getClass() const
returns a pointer to the QoreClass of this object
DLLEXPORT int64 bigIntEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as an int64 ...
DLLEXPORT QoreListNode * getMemberList(ExceptionSink *xsink) const
returns the list of members, caller owns the list returned
virtual DLLEXPORT AbstractQoreNode * realCopy() const
performs a deep copy of the list and returns the new list
virtual DLLLOCAL AbstractQoreNode * evalImpl(ExceptionSink *xsink) const
should never be called, does nothing
DLLEXPORT AbstractQoreNode * evalMethod(const QoreString *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value, caller owns the AbstractQoreNode (reference) returned
virtual DLLLOCAL void customDeref(ExceptionSink *xsink)
custom dereference handler - with delete
DLLEXPORT QoreProgram * getProgram() const
returns the QoreProgram object associated with this object
virtual DLLEXPORT bool derefImpl(ExceptionSink *xsink)
runs the destructor if necessary and dereferences all members
DLLLOCAL bool hasMemberNotification() const
returns true if the class has a memberNotification method
DLLEXPORT QoreHashNode * copyData(ExceptionSink *xsink) const
retuns all member data of the object (or 0 if there&#39;s an exception), caller owns the QoreHashNode ref...
virtual DLLEXPORT bool is_equal_soft(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) with possible type conversion (sof...
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:82
DLLLOCAL void obliterate(ExceptionSink *xsink)
destroys all members and dereferences all private data structures
virtual DLLLOCAL void customRef() const
custom reference handler
static DLLLOCAL qore_type_t getStaticTypeCode()
returns the type code (useful in templates)
Definition: QoreObject.h:195
DLLEXPORT void tDeref()
decrements the existence reference count, when it reaches 0 the C++ object (&quot;this&quot;) will be deleted ...
virtual DLLEXPORT const char * getTypeName() const
returns the type name as a c string
DLLEXPORT double floatEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as a double ...
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
virtual DLLEXPORT bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality (&quot;deep compare&quot; including all contained values) without type conversions (hard com...
convenience class for holding AbstractPrivateData references
Definition: QoreObject.h:668
DLLLOCAL bool evalDeleteBlocker(qore_classid_t classid_for_method, BuiltinDeleteBlocker *meth)
evaluates the delete blocker function for the managed private data
DLLLOCAL void addPrivateDataToString(QoreString *str, ExceptionSink *xsink) const
concatenates info about private data to a string
defines a Qore-language class
Definition: QoreClass.h:195
DLLEXPORT QoreValue evalMethodValue(const QoreString *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value, caller owns the AbstractQoreNode (reference) returned
DLLLOCAL QoreValue evalMember(const QoreString *member, ExceptionSink *xsink)
returns the value of the member with an incremented reference count, or executes the memberGate() met...
DLLEXPORT AbstractQoreNode * getReferencedMemberNoMethod(const char *mem, ExceptionSink *xsink) const
returns the value of the given member with the reference count incremented, the caller owns the Abstr...
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:103
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:64
DLLEXPORT AbstractQoreNode * getMemberValueNoMethod(const QoreString *key, AutoVLock *vl, ExceptionSink *xsink) const
returns the pointer to the value of the member
DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink *xsink)
runs the destructor for system objects
unsigned qore_classid_t
used for the unique class ID for QoreClass objects
Definition: common.h:77
container for holding Qore-language exception information and also for registering a &quot;thread_exit&quot; ca...
Definition: ExceptionSink.h:43
virtual DLLLOCAL int integerEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
virtual DLLLOCAL double floatEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
virtual DLLEXPORT int getAsString(QoreString &str, int foff, ExceptionSink *xsink) const
concatenate the verbose string representation of the list (including all contained values) to an exis...
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:228
DLLLOCAL AbstractPrivateData * getAndClearPrivateData(qore_classid_t key, ExceptionSink *xsink)
retrieves the private data pointer and clears it from the object&#39;s private data store, used when executing destructors
DLLLOCAL void customRefIntern() const
custom reference handler - unlocked
DLLLOCAL AbstractQoreNode ** getExistingValuePtr(const QoreString *mem, AutoVLock *vl, ExceptionSink *xsink) const
returns a pointer to a pointer to the value of the member only if it already exists, so it can be set externally
DLLEXPORT AbstractQoreNode * evalMethodVariant(const QoreMethod &method, const QoreExternalMethodVariant *variant, const QoreListNode *args, ExceptionSink *xsink)
executes a normal object method variant
virtual DLLLOCAL int64 bigIntEvalImpl(ExceptionSink *xsink) const
should never be called, does nothing
DLLEXPORT void deleteMemberValue(const QoreString *key, ExceptionSink *xsink)
removes a member from the object, if the member&#39;s value is an object it is deleted as well (destructo...
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:68
DLLEXPORT void deleteBlockerRef() const
increment the reference count of the object, to be called only from within a delete blocker ...
static DLLLOCAL const char * getStaticTypeName()
returns the type name (useful in templates)
Definition: QoreObject.h:190
a method in a QoreClass
Definition: QoreClass.h:91
DLLEXPORT void tRef() const
increments the existence reference count
DLLLOCAL QoreValue evalBuiltinMethodWithPrivateData(const QoreMethod &method, const BuiltinNormalMethodVariantBase *meth, const QoreListNode *args, ExceptionSink *xsink)
called to evaluate a builtin method when private data is available
DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData *pd)
sets private data for the object against the class ID passed, used in C++ functions implementing Qore...
DLLEXPORT bool isValid() const
returns true if the object is valid
a templated class to manage a reference count of an object that can throw a Qore-language exception w...
Definition: ReferenceHolder.h:51
DLLEXPORT int64 getMemberAsBigInt(const char *mem, bool &found, ExceptionSink *xsink) const
returns the value of the given member as an int64
DLLEXPORT bool validInstanceOf(qore_classid_t cid) const
returns true if this object is a valid instance of the classid passed
DLLEXPORT int intEvalMethod(const char *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value as an int ...