Qore Programming Language  0.8.9
 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 2003 - 2013 David Nichols
12 
13  This library is free software; you can redistribute it and/or
14  modify it under the terms of the GNU Lesser General Public
15  License as published by the Free Software Foundation; either
16  version 2.1 of the License, or (at your option) any later version.
17 
18  This library is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  Lesser General Public License for more details.
22 
23  You should have received a copy of the GNU Lesser General Public
24  License along with this library; if not, write to the Free Software
25  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 */
27 
28 #ifndef _QORE_QOREOBJECT_H
29 
30 #define _QORE_QOREOBJECT_H
31 
32 class AutoVLock;
33 class VRMutex;
34 class BuiltinCopy;
35 class BuiltinDeleteBlocker;
36 class BuiltinNormalMethodVariantBase;
37 class BuiltinCopyVariantBase;
38 class QoreExternalMethodVariant;
39 class QoreExternalStaticMethodVariant;
40 class QoreProgram;
41 
43 
56 class QoreObject : public AbstractQoreNode {
57  friend class qore_object_private;
58  friend class ObjectRSetHelper;
59  friend class ObjectRSet;
60 
61 private:
63  class qore_object_private* priv;
64 
66  DLLLOCAL QoreObject(const QoreObject&);
67 
69  DLLLOCAL QoreObject& operator=(const QoreObject&);
70 
71 protected:
73 
77  DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
78 
80 
82  DLLLOCAL virtual AbstractQoreNode* evalImpl(ExceptionSink* xsink) const;
83 
85 
87  DLLLOCAL virtual AbstractQoreNode* evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
88 
90 
92  DLLLOCAL virtual int64 bigIntEvalImpl(ExceptionSink* xsink) const;
93 
95 
97  DLLLOCAL virtual int integerEvalImpl(ExceptionSink* xsink) const;
98 
100 
102  DLLLOCAL virtual bool boolEvalImpl(ExceptionSink* xsink) const;
103 
105 
107  DLLLOCAL virtual double floatEvalImpl(ExceptionSink* xsink) const;
108 
110  DLLLOCAL void customRefIntern() const;
111 
113  DLLLOCAL virtual void customRef() const;
114 
116  DLLLOCAL virtual void customDeref(ExceptionSink* xsink);
117 
119  DLLLOCAL virtual ~QoreObject();
120 
121 public:
123 
127  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p);
128 
130 
135  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p, AbstractPrivateData *data);
136 
138 
140  DLLEXPORT virtual bool getAsBoolImpl() const;
141 
143 
149  DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
150 
152 
159  DLLEXPORT virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
160 
162  DLLEXPORT virtual AbstractQoreNode* realCopy() const;
163 
165 
169  DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const;
170 
172 
176  DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const;
177 
179  DLLEXPORT virtual const char* getTypeName() const;
180 
182  DLLLOCAL static const char* getStaticTypeName() {
183  return "object";
184  }
185 
187  DLLLOCAL static qore_type_t getStaticTypeCode() {
188  return NT_OBJECT;
189  }
190 
192 
196  DLLEXPORT bool validInstanceOf(qore_classid_t cid) const;
197 
199 
201  DLLEXPORT bool validInstanceOf(const QoreClass& qc) const;
202 
204 
209  DLLEXPORT void setValue(const char* key, AbstractQoreNode* val, ExceptionSink* xsink);
210 
212 
215  DLLEXPORT QoreListNode* getMemberList(ExceptionSink* xsink) const;
216 
218 
222  DLLEXPORT void deleteMemberValue(const QoreString* key, ExceptionSink* xsink);
223 
225 
229  DLLEXPORT void deleteMemberValue(const char* key, ExceptionSink* xsink);
230 
232 
236  DLLEXPORT void removeMember(const QoreString* key, ExceptionSink* xsink);
237 
239 
243  DLLEXPORT void removeMember(const char* key, ExceptionSink* xsink);
244 
246 
251  DLLEXPORT AbstractQoreNode* takeMember(const QoreString* key, ExceptionSink* xsink);
252 
254 
259  DLLEXPORT AbstractQoreNode* takeMember(const char* key, ExceptionSink* xsink);
260 
262 
265  DLLEXPORT int size(ExceptionSink* xsink) const;
266 
268 
272  DLLEXPORT bool compareSoft(const QoreObject* obj, ExceptionSink* xsink) const;
273 
275 
279  DLLEXPORT bool compareHard(const QoreObject* obj, ExceptionSink* xsink) const;
280 
282 
287  DLLEXPORT AbstractQoreNode* getReferencedMemberNoMethod(const char* mem, ExceptionSink* xsink) const;
288 
290 
296  DLLEXPORT int64 getMemberAsBigInt(const char* mem, bool& found, ExceptionSink* xsink) const;
297 
299 
302  DLLEXPORT QoreHashNode* copyData(ExceptionSink* xsink) const;
303 
305 
309  DLLEXPORT void mergeDataToHash(QoreHashNode* hash, ExceptionSink* xsink);
310 
312 
316  DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData *pd);
317 
319 
324 
326 
331  DLLEXPORT AbstractQoreNode* evalMethod(const QoreString* name, const QoreListNode* args, ExceptionSink* xsink);
332 
334 
339  DLLEXPORT AbstractQoreNode* evalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
340 
342 
347  DLLEXPORT int64 bigIntEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
348 
350 
355  DLLEXPORT int intEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
356 
358 
363  DLLEXPORT bool boolEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
364 
366 
371  DLLEXPORT double floatEvalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
372 
374 
379  DLLEXPORT AbstractQoreNode* evalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
380 
382 
387  DLLEXPORT int64 bigIntEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
388 
390 
395  DLLEXPORT int intEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
396 
398 
403  DLLEXPORT bool boolEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
404 
406 
411  DLLEXPORT double floatEvalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
412 
414 
417  DLLEXPORT void doDelete(ExceptionSink* xsink);
418 
420 
424  DLLEXPORT const QoreClass* getClass(qore_classid_t cid) const;
425 
427 
434  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
435 
437 
440  DLLEXPORT const QoreClass* getClass() const;
441 
443 
446  DLLEXPORT const char* getClassName() const;
447 
449 
452  DLLEXPORT bool isValid() const;
453 
455 
458  DLLEXPORT QoreProgram* getProgram() const;
459 
461 
464  DLLEXPORT bool isSystemObject() const;
465 
467 
472  DLLEXPORT void tRef() const;
473 
475 
478  DLLEXPORT void tDeref();
479 
481 
489  DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const QoreString* key, AutoVLock* vl, ExceptionSink* xsink) const;
490 
492 
498  DLLEXPORT AbstractQoreNode* getMemberValueNoMethod(const char* key, AutoVLock* vl, ExceptionSink* xsink) const;
499 
501 
503  DLLEXPORT void deleteBlockerRef() const;
504 
506 
510  DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink* xsink);
511 
513  DLLEXPORT AbstractQoreNode* evalMethodVariant(const QoreMethod& method, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
514 
515  DLLLOCAL int getStatus() const;
516 
518 
522  DLLLOCAL AbstractQoreNode* evalMember(const QoreString* member, ExceptionSink* xsink);
523 
525 
529  DLLLOCAL QoreHashNode* getRuntimeMemberHash(ExceptionSink* xsink) const;
530 
531  DLLLOCAL class KeyNode* getReferencedPrivateDataNode(qore_classid_t key);
532 
534 
539 
541 
547  DLLLOCAL AbstractQoreNode* evalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
548  DLLLOCAL int64 bigIntEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
549  DLLLOCAL int intEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
550  DLLLOCAL bool boolEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
551  DLLLOCAL double floatEvalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
552 
554  DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase* meth, QoreObject* self, ExceptionSink* xsink);
555 
557 
561  DLLLOCAL void addPrivateDataToString(QoreString* str, ExceptionSink* xsink) const;
562 
564 
567  DLLLOCAL void obliterate(ExceptionSink* xsink);
568 
570 
574  DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink* xsink);
575 
577 
585  DLLLOCAL AbstractQoreNode** getExistingValuePtr(const QoreString* mem, AutoVLock* vl, ExceptionSink* xsink) const;
586 
588 
595  DLLLOCAL AbstractQoreNode** getExistingValuePtr(const char* mem, AutoVLock* vl, ExceptionSink* xsink) const;
596 
597  // returns a new hash consisting of just the members of value_list
598  DLLLOCAL QoreHashNode* getSlice(const QoreListNode* value_list, ExceptionSink* xsink) const;
599 
601  DLLLOCAL QoreObject(const QoreClass* oc, QoreProgram* p, QoreHashNode* d);
602 
604  DLLLOCAL bool evalDeleteBlocker(qore_classid_t classid_for_method, BuiltinDeleteBlocker* meth);
605 
607  DLLLOCAL bool hasMemberNotification() const;
608 
610  DLLLOCAL void execMemberNotification(const char* member, ExceptionSink* xsink);
611 
613  DLLLOCAL AbstractQoreNode** getMemberValuePtrForInitialization(const char* member);
614 };
615 
617 template <class T>
619 public:
620  DLLLOCAL PrivateDataRefHolder(const QoreObject* o, qore_classid_t cid, ExceptionSink* xsink) : ReferenceHolder<T>(reinterpret_cast<T*>(o->getReferencedPrivateData(cid, xsink)), xsink) {
621  }
622 };
623 
624 class QorePrivateObjectAccessHelper {
625 private:
626  // not implemented
627  DLLLOCAL QorePrivateObjectAccessHelper(const QorePrivateObjectAccessHelper&);
628  DLLLOCAL QorePrivateObjectAccessHelper& operator=(const QorePrivateObjectAccessHelper&);
629  DLLLOCAL void* operator new(size_t);
630 
631 protected:
632  ExceptionSink* xsink;
633  void* ptr;
634 
635 public:
636  DLLLOCAL QorePrivateObjectAccessHelper(ExceptionSink* xs) : xsink(xs), ptr(0) {
637  }
638 
639  DLLLOCAL operator bool() const {
640  return (bool)ptr;
641  }
642 };
643 
644 #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:72
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:41
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:36
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:47
const qore_type_t NT_OBJECT
type value for QoreObject
Definition: node_types.h:44
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
DLLLOCAL AbstractQoreNode * evalMember(const QoreString *member, ExceptionSink *xsink)
returns the value of the member with an incremented reference count, or executes the memberGate() met...
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...
signed short qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:59
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:42
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:187
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:44
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:618
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:186
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:95
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:56
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:68
container for holding Qore-language exception information and also for registering a &quot;thread_exit&quot; ca...
Definition: ExceptionSink.h:35
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...
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...
DLLLOCAL AbstractQoreNode * 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 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:182
a method in a QoreClass
Definition: QoreClass.h:83
DLLEXPORT void tRef() const
increments the existence reference count
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:43
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 ...