Qore Programming Language - C/C++ Library  1.0.1
QoreObject.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreObject.h
4 
5  thread-safe object definition
6 
7  Qore Programming Language
8 
9  Copyright (C) 2003 - 2020 Qore Technologies, s.r.o.
10 
11  Permission is hereby granted, free of charge, to any person obtaining a
12  copy of this software and associated documentation files (the "Software"),
13  to deal in the Software without restriction, including without limitation
14  the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  and/or sell copies of the Software, and to permit persons to whom the
16  Software is furnished to do so, subject to the following conditions:
17 
18  The above copyright notice and this permission notice shall be included in
19  all copies or substantial portions of the Software.
20 
21  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  DEALINGS IN THE SOFTWARE.
28 
29  Note that the Qore library is released under a choice of three open-source
30  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
31  information.
32 */
33 
34 #ifndef _QORE_QOREOBJECT_H
35 
36 #define _QORE_QOREOBJECT_H
37 
38 class AutoVLock;
39 class VRMutex;
40 class BuiltinCopy;
41 class BuiltinNormalMethodVariantBase;
42 class BuiltinCopyVariantBase;
44 class QoreProgram;
45 
47 
60 class QoreObject : public AbstractQoreNode {
61  friend class qore_object_private;
62  friend class ObjectRSetHelper;
63  friend class ObjectRSet;
64  friend class qore_object_dereference_helper;
65 
66 private:
68  class qore_object_private* priv;
69 
71  DLLLOCAL QoreObject(const QoreObject&);
72 
74  DLLLOCAL QoreObject& operator=(const QoreObject&);
75 
76 protected:
78 
82  DLLEXPORT virtual bool derefImpl(ExceptionSink* xsink);
83 
85 
87  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
88 
90  DLLLOCAL virtual void customRef() const;
91 
93  DLLLOCAL virtual void customDeref(ExceptionSink* xsink);
94 
96  DLLLOCAL virtual ~QoreObject();
97 
98  public:
100 
104  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p);
105 
107 
112  DLLEXPORT QoreObject(const QoreClass* oc, QoreProgram* p, AbstractPrivateData* data);
113 
115  DLLEXPORT bool hasMember(const char* mem, ExceptionSink* xsink) const;
116 
118 
120  DLLEXPORT virtual bool getAsBoolImpl() const;
121 
123 
129  DLLEXPORT virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
130 
132 
139  DLLEXPORT virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
140 
142  DLLEXPORT virtual AbstractQoreNode* realCopy() const;
143 
145 
149  DLLEXPORT virtual bool is_equal_soft(const AbstractQoreNode* v, ExceptionSink* xsink) const;
150 
152 
156  DLLEXPORT virtual bool is_equal_hard(const AbstractQoreNode* v, ExceptionSink* xsink) const;
157 
159  DLLEXPORT virtual const char* getTypeName() const;
160 
162  DLLLOCAL static const char* getStaticTypeName() {
163  return "object";
164  }
165 
167  DLLLOCAL static qore_type_t getStaticTypeCode() {
168  return NT_OBJECT;
169  }
170 
172 
176  DLLEXPORT bool validInstanceOf(qore_classid_t cid) const;
177 
179 
181  DLLEXPORT bool validInstanceOf(const QoreClass& qc) const;
182 
184 
189  DLLEXPORT void setValue(const char* key, QoreValue val, ExceptionSink* xsink);
190 
192 
195  DLLEXPORT QoreListNode* getMemberList(ExceptionSink* xsink) const;
196 
198 
202  DLLEXPORT void deleteMemberValue(const QoreString* key, ExceptionSink* xsink);
203 
205 
209  DLLEXPORT void deleteMemberValue(const char* key, ExceptionSink* xsink);
210 
212 
216  DLLEXPORT void removeMember(const QoreString* key, ExceptionSink* xsink);
217 
219 
223  DLLEXPORT void removeMember(const char* key, ExceptionSink* xsink);
224 
226 
231  DLLEXPORT QoreValue takeMember(const QoreString* key, ExceptionSink* xsink);
232 
234 
239  DLLEXPORT QoreValue takeMember(const char* key, ExceptionSink* xsink);
240 
242 
245  DLLEXPORT int size(ExceptionSink* xsink) const;
246 
248 
252  DLLEXPORT bool compareSoft(const QoreObject* obj, ExceptionSink* xsink) const;
253 
255 
259  DLLEXPORT bool compareHard(const QoreObject* obj, ExceptionSink* xsink) const;
260 
262 
267  DLLEXPORT QoreValue getReferencedMemberNoMethod(const char* mem, ExceptionSink* xsink) const;
268 
270 
276  DLLEXPORT int64 getMemberAsBigInt(const char* mem, bool& found, ExceptionSink* xsink) const;
277 
279 
282  DLLEXPORT QoreHashNode* copyData(ExceptionSink* xsink) const;
283 
285 
289  DLLEXPORT void setPrivate(qore_classid_t key, AbstractPrivateData* pd);
290 
292 
297 
299 
306 
308 
313  DLLEXPORT QoreValue evalMethod(const QoreString* name, const QoreListNode* args, ExceptionSink* xsink);
314 
316 
321  DLLEXPORT QoreValue evalMethod(const char* name, const QoreListNode* args, ExceptionSink* xsink);
322 
324 
329  DLLEXPORT QoreValue evalMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
330 
332 
342  DLLEXPORT QoreValue evalMethod(const QoreMethod& method, const QoreClass* class_ctx, const QoreListNode* args, ExceptionSink* xsink);
343 
345 
348  DLLEXPORT void doDelete(ExceptionSink* xsink);
349 
351 
355  DLLEXPORT const QoreClass* getClass(qore_classid_t cid) const;
356 
358 
365  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
366 
368 
374  DLLEXPORT ClassAccess getClassAccess(const QoreClass& cls) const;
375 
377 
380  DLLEXPORT const QoreClass* getClass() const;
381 
383 
386  DLLEXPORT const char* getClassName() const;
387 
389 
392  DLLEXPORT bool isValid() const;
393 
395 
398  DLLEXPORT QoreProgram* getProgram() const;
399 
401 
404  DLLEXPORT bool isSystemObject() const;
405 
407 
412  DLLEXPORT void tRef() const;
413 
415 
418  DLLEXPORT void tDeref();
419 
421  DLLEXPORT void realRef();
422 
424  DLLEXPORT void realDeref(ExceptionSink* xsink);
425 
427 
435  DLLEXPORT QoreValue getMemberValueNoMethod(const QoreString* key, AutoVLock* vl, ExceptionSink* xsink) const;
436 
438 
444  DLLEXPORT QoreValue getMemberValueNoMethod(const char* key, AutoVLock* vl, ExceptionSink* xsink) const;
445 
447 
453  DLLEXPORT QoreValue getReferencedMemberNoMethod(const char* key, const QoreClass* cls, ExceptionSink* xsink) const;
454 
456 
465  DLLEXPORT int setMemberValue(const char* key, const QoreClass* cls, const QoreValue val, ExceptionSink* xsink);
466 
468 
472  DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink* xsink);
473 
475  DLLEXPORT QoreValue evalMethodVariant(const QoreMethod& method, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
476 
478 
480  DLLEXPORT QoreValue evalMethodVariant(const QoreMethod& method, const QoreClass* class_ctx, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
481 
483 
485  DLLEXPORT static QoreValue evalStaticMethod(const QoreMethod& method, const QoreListNode* args, ExceptionSink* xsink);
486 
488 
490  DLLEXPORT static QoreValue evalStaticMethod(const QoreMethod& method, const QoreClass* class_ctx, const QoreListNode* args, ExceptionSink* xsink);
491 
493 
495  DLLEXPORT static QoreValue evalStaticMethodVariant(const QoreMethod& method, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
496 
498 
500  DLLEXPORT static QoreValue evalStaticMethodVariant(const QoreMethod& method, const QoreClass* class_ctx, const QoreExternalMethodVariant* variant, const QoreListNode* args, ExceptionSink* xsink);
501 
503 
509  DLLEXPORT QoreValue evalMember(const QoreString* member, ExceptionSink* xsink);
510 
512 
519  DLLEXPORT QoreValue evalMember(const char* member, ExceptionSink* xsink);
520 
521  DLLLOCAL int getStatus() const;
522 
523  DLLLOCAL class KeyNode* getReferencedPrivateDataNode(qore_classid_t key);
524 
526 
531 
533 
539  DLLLOCAL QoreValue evalBuiltinMethodWithPrivateData(const QoreMethod& method, const BuiltinNormalMethodVariantBase* meth, const QoreListNode* args, ExceptionSink* xsink);
540 
542  DLLLOCAL void evalCopyMethodWithPrivateData(const QoreClass &thisclass, const BuiltinCopyVariantBase* meth, QoreObject* self, ExceptionSink* xsink);
543 
545 
549  DLLLOCAL void addPrivateDataToString(QoreString* str, ExceptionSink* xsink) const;
550 
552 
555  DLLLOCAL void obliterate(ExceptionSink* xsink);
556 
558 
562  DLLLOCAL void defaultSystemDestructor(qore_classid_t classID, ExceptionSink* xsink);
563 
564  // returns a new hash consisting of just the members of value_list
565  DLLLOCAL QoreHashNode* getSlice(const QoreListNode* value_list, ExceptionSink* xsink) const;
566 
568  DLLLOCAL QoreObject(const QoreClass* oc, QoreProgram* p, QoreHashNode* d);
569 
571  DLLLOCAL bool hasMemberNotification() const;
572 
574  DLLLOCAL void execMemberNotification(const char* member, ExceptionSink* xsink);
575 };
576 
578 template <class T>
580 public:
581  DLLLOCAL PrivateDataRefHolder(ExceptionSink* xsink) : ReferenceHolder<T>(xsink) {
582  }
583 
584  DLLLOCAL PrivateDataRefHolder(const QoreObject* o, qore_classid_t cid, ExceptionSink* xsink) : ReferenceHolder<T>(reinterpret_cast<T*>(o->getReferencedPrivateData(cid, xsink)), xsink) {
585  }
586 
588  DLLLOCAL void operator=(T *nv) {
589  if (this->p)
590  this->p->deref(this->xsink);
591  this->p = nv;
592  }
593 };
594 
596 template <class T>
598 public:
599  DLLLOCAL TryPrivateDataRefHolder(const QoreObject* o, qore_classid_t cid, ExceptionSink* xsink) : ReferenceHolder<T>(reinterpret_cast<T*>(o->tryGetReferencedPrivateData(cid, xsink)), xsink) {
600  }
601 
603  DLLLOCAL void operator=(T *nv) {
604  if (this->p)
605  this->p->deref(this->xsink);
606  this->p = nv;
607  }
608 };
609 
610 class QorePrivateObjectAccessHelper {
611 public:
612  DLLLOCAL QorePrivateObjectAccessHelper(ExceptionSink* xs) : xsink(xs), ptr(0) {
613  }
614 
615  DLLLOCAL operator bool() const {
616  return (bool)ptr;
617  }
618 
619 private:
620  DLLLOCAL QorePrivateObjectAccessHelper(const QorePrivateObjectAccessHelper&) = delete;
621  DLLLOCAL QorePrivateObjectAccessHelper& operator=(const QorePrivateObjectAccessHelper&) = delete;
622  DLLLOCAL void* operator new(size_t) = delete;
623 
624 protected:
625  ExceptionSink* xsink;
626  void* ptr;
627 };
628 
629 #endif
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 "self" (n...
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
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 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:50
virtual DLLEXPORT const char * getTypeName() const
returns the type name as a c string
virtual DLLLOCAL void customRef() const
custom reference handler
DLLEXPORT void doDelete(ExceptionSink *xsink)
runs the destructor on the object (if it hasn&#39;t already been deleted)
the base class for all data to be used as private data of Qore objects
Definition: AbstractPrivateData.h:44
DLLEXPORT int64 getMemberAsBigInt(const char *mem, bool &found, ExceptionSink *xsink) const
returns the value of the given member as an int64
DLLEXPORT void externalDelete(qore_classid_t key, ExceptionSink *xsink)
call this function when an object&#39;s private data is deleted externally
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 ("deep compare" including all contained values) with possible type conversion (sof...
DLLEXPORT void removeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors; the value is only dereferenc...
DLLEXPORT bool compareHard(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality ("deep compare" including all contained values) with possible type conversion of c...
DLLEXPORT void realRef()
increments the standard reference count of the object for references that cannot be part of a recursi...
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:57
virtual DLLLOCAL QoreValue evalImpl(bool &needs_deref, ExceptionSink *xsink) const
should never be called, does nothing
const qore_type_t NT_OBJECT
type value for QoreObject
Definition: node_types.h:52
DLLEXPORT bool compareSoft(const QoreObject *obj, ExceptionSink *xsink) const
tests for equality ("deep compare" including all contained values) with possible type conversion of c...
DLLLOCAL bool hasMemberNotification() const
returns true if the class has a memberNotification method
virtual DLLLOCAL ~QoreObject()
destructor
DLLEXPORT ClassAccess getClassAccess(const QoreClass &cls) const
returns the accessibility of the class in the object&#39;s hierachy or Inaccessible the object does not i...
DLLEXPORT void tRef() const
increments the existence reference count
DLLEXPORT bool isValid() const
returns true if the object is valid
virtual DLLLOCAL void customDeref(ExceptionSink *xsink)
custom dereference handler - with delete
virtual DLLEXPORT bool derefImpl(ExceptionSink *xsink)
runs the destructor if necessary and dereferences all members
DLLLOCAL void operator=(T *nv)
assigns a new pointer to the holder, dereferences the current pointer if any
Definition: QoreObject.h:588
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:81
DLLLOCAL void obliterate(ExceptionSink *xsink)
destroys all members and dereferences all private data structures
DLLEXPORT int setMemberValue(const char *key, const QoreClass *cls, const QoreValue val, ExceptionSink *xsink)
sets the value of the given member as accessed from the given class
DLLEXPORT QoreValue evalMember(const QoreString *member, ExceptionSink *xsink)
returns the value of the member with an incremented reference count, or executes the memberGate() met...
static DLLLOCAL qore_type_t getStaticTypeCode()
returns the type code (useful in templates)
Definition: QoreObject.h:167
DLLEXPORT void tDeref()
decrements the existence reference count, when it reaches 0 the C++ object ("this") will be deleted ...
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
convenience class for holding AbstractPrivateData references
Definition: QoreObject.h:579
defines a Qore-language class
Definition: QoreClass.h:239
DLLEXPORT QoreListNode * getMemberList(ExceptionSink *xsink) const
returns the list of members, caller owns the list returned
DLLEXPORT const QoreClass * getClass() const
returns a pointer to the QoreClass of this object
virtual DLLEXPORT bool getAsBoolImpl() const
returns false unless perl-boolean-evaluation is enabled, in which case it returns false only when emp...
DLLEXPORT bool isSystemObject() const
returns true if the object is a system object (created with the system constructor) ...
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:267
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:127
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...
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:60
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:79
external wrapper class for method variants
Definition: QoreReflection.h:90
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
static DLLEXPORT QoreValue evalStaticMethod(const QoreMethod &method, const QoreListNode *args, ExceptionSink *xsink)
executes a static method
DLLEXPORT QoreValue takeMember(const QoreString *key, ExceptionSink *xsink)
removes a member from the object without explicitly calling destructors and returns the value removed...
virtual DLLEXPORT bool is_equal_hard(const AbstractQoreNode *v, ExceptionSink *xsink) const
tests for equality ("deep compare" including all contained values) without type conversions (hard com...
DLLEXPORT bool hasMember(const char *mem, ExceptionSink *xsink) const
returns true if the object has the given member (note that the member may not have a value) ...
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
virtual DLLEXPORT AbstractQoreNode * realCopy() const
performs a the same object with its reference count increased
DLLEXPORT bool validInstanceOf(qore_classid_t cid) const
returns true if this object is a valid instance of the classid passed
DLLEXPORT QoreValue evalMethod(const QoreString *name, const QoreListNode *args, ExceptionSink *xsink)
evaluates the given method with the arguments passed and returns the return value, caller owns any reference returned
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
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...
DLLEXPORT QoreProgram * getProgram() const
returns the QoreProgram object associated with this object
DLLEXPORT void realDeref(ExceptionSink *xsink)
decrements the standard reference count of the object for references that cannot be part of a recursi...
DLLEXPORT QoreValue evalMethodVariant(const QoreMethod &method, const QoreExternalMethodVariant *variant, const QoreListNode *args, ExceptionSink *xsink)
executes a normal object method variant
convenience class for holding AbstractPrivateData references
Definition: QoreObject.h:597
static DLLEXPORT QoreValue evalStaticMethodVariant(const QoreMethod &method, const QoreExternalMethodVariant *variant, const QoreListNode *args, ExceptionSink *xsink)
executes a static method variant
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:70
static DLLLOCAL const char * getStaticTypeName()
returns the type name (useful in templates)
Definition: QoreObject.h:162
DLLEXPORT QoreValue getReferencedMemberNoMethod(const char *mem, ExceptionSink *xsink) const
returns the value of the given member with the reference count incremented, the caller owns any refer...
DLLEXPORT void setValue(const char *key, QoreValue val, ExceptionSink *xsink)
sets the value of the given member to the given value
DLLEXPORT AbstractPrivateData * tryGetReferencedPrivateData(qore_classid_t key, ExceptionSink *xsink) const
returns the private data corresponding to the class ID passed with an incremented reference count if ...
DLLEXPORT int size(ExceptionSink *xsink) const
returns the number of members of the object
DLLEXPORT const char * getClassName() const
returns the name of the class
a method in a QoreClass
Definition: QoreClass.h:125
DLLLOCAL void operator=(T *nv)
assigns a new pointer to the holder, dereferences the current pointer if any
Definition: QoreObject.h:603
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...
a templated class to manage a reference count of an object that can throw a Qore-language exception w...
Definition: ReferenceHolder.h:52
DLLLOCAL void addPrivateDataToString(QoreString *str, ExceptionSink *xsink) const
concatenates info about private data to a string
DLLEXPORT QoreValue getMemberValueNoMethod(const QoreString *key, AutoVLock *vl, ExceptionSink *xsink) const
returns the pointer to the value of the member