Qore Programming Language  0.9.16
QoreClass.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreClass.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2020 Qore Technologies, s.r.o.
8 
9  Permission is hereby granted, free of charge, to any person obtaining a
10  copy of this software and associated documentation files (the "Software"),
11  to deal in the Software without restriction, including without limitation
12  the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  and/or sell copies of the Software, and to permit persons to whom the
14  Software is furnished to do so, subject to the following conditions:
15 
16  The above copyright notice and this permission notice shall be included in
17  all copies or substantial portions of the Software.
18 
19  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  DEALINGS IN THE SOFTWARE.
26 
27  Note that the Qore library is released under a choice of three open-source
28  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29  information.
30 */
31 
32 #ifndef _QORE_QORECLASS_H
33 
34 #define _QORE_QORECLASS_H
35 
36 #include <cstdarg>
37 #include <memory>
38 #include <string>
39 
40 // all qore class IDs
41 DLLEXPORT extern qore_classid_t CID_AUTOGATE;
42 DLLEXPORT extern qore_classid_t CID_AUTOLOCK;
43 DLLEXPORT extern qore_classid_t CID_AUTOREADLOCK;
44 DLLEXPORT extern qore_classid_t CID_AUTOWRITELOCK;
45 DLLEXPORT extern qore_classid_t CID_CONDITION;
46 DLLEXPORT extern qore_classid_t CID_COUNTER;
47 DLLEXPORT extern qore_classid_t CID_DATASOURCE;
48 DLLEXPORT extern qore_classid_t CID_DATASOURCEPOOL;
49 DLLEXPORT extern qore_classid_t CID_FILE;
50 DLLEXPORT extern qore_classid_t CID_FTPCLIENT;
51 DLLEXPORT extern qore_classid_t CID_GATE;
52 DLLEXPORT extern qore_classid_t CID_GETOPT;
53 DLLEXPORT extern qore_classid_t CID_HTTPCLIENT;
54 DLLEXPORT extern qore_classid_t CID_MUTEX;
55 DLLEXPORT extern qore_classid_t CID_PROGRAM;
56 DLLEXPORT extern qore_classid_t CID_PROGRAMDEBUG;
57 DLLEXPORT extern qore_classid_t CID_QUEUE;
58 DLLEXPORT extern qore_classid_t CID_RWLOCK;
59 DLLEXPORT extern qore_classid_t CID_SSLCERTIFICATE;
60 DLLEXPORT extern qore_classid_t CID_SSLPRIVATEKEY;
61 DLLEXPORT extern qore_classid_t CID_SEQUENCE;
62 DLLEXPORT extern qore_classid_t CID_SOCKET;
63 DLLEXPORT extern qore_classid_t CID_TERMIOS;
64 DLLEXPORT extern qore_classid_t CID_INPUTSTREAM;
65 DLLEXPORT extern qore_classid_t CID_OUTPUTSTREAM;
66 DLLEXPORT extern qore_classid_t CID_INPUTSTREAMBASE;
67 DLLEXPORT extern qore_classid_t CID_OUTPUTSTREAMBASE;
68 DLLEXPORT extern qore_classid_t CID_PROGRAM;
69 DLLEXPORT extern qore_classid_t CID_SERIALIZABLE;
70 
71 DLLEXPORT extern QoreClass* QC_QUEUE;
72 DLLEXPORT extern QoreClass* QC_HTTPCLIENT;
73 DLLEXPORT extern QoreClass* QC_SSLCERTIFICATE;
74 DLLEXPORT extern QoreClass* QC_SSLPRIVATEKEY;
75 DLLEXPORT extern QoreClass* QC_PROGRAM;
76 DLLEXPORT extern QoreClass* QC_SERIALIZABLE;
77 
78 class BCList;
79 class BCSMList;
80 class BCAList;
81 class QoreObject;
82 class QoreClass;
83 class BCEAList;
84 class ParamList;
85 class QoreMemberInfo;
86 class BuiltinMethod;
87 class AbstractQoreFunctionVariant;
88 class AbstractFunctionSignature;
89 class UserMethod;
90 class BCANode;
91 class qore_method_private;
92 class MethodFunctionBase;
93 class NamedScope;
94 class ConstantList;
95 class MethodVariantBase;
96 
102 class QoreExternalMethodFunction;
107 
109 
111 enum method_type_e {
112  MT_None = 0, // not a method function/variant
113  MT_Normal = 1,
114  MT_Static = 2,
115  MT_Constructor = 3,
116  MT_Destructor = 4,
117  MT_Copy = 5,
118  MT_Pseudo = 6,
119 };
120 
122 
125 class QoreMethod {
126  friend class StaticMethodCallNode;
127  friend class QoreObject;
128  friend class qore_class_private;
129  friend class qore_method_private;
130  friend class BCList;
131 
132 private:
134  class qore_method_private* priv;
135 
137  DLLLOCAL QoreMethod(const QoreMethod&);
138 
140  DLLLOCAL QoreMethod& operator=(const QoreMethod&);
141 
142 public:
144 
146  DLLEXPORT bool isUser() const;
147 
149 
151  DLLEXPORT bool isBuiltin() const;
152 
154 
156  DLLEXPORT bool isPrivate() const;
157 
159  DLLEXPORT ClassAccess getAccess() const;
160 
162 
165  DLLEXPORT bool isStatic() const;
166 
168 
171  DLLEXPORT const char* getName() const;
172 
174 
177  DLLEXPORT const std::string& getNameStr() const;
178 
180  DLLEXPORT const QoreClass* getClass() const;
181 
183  DLLEXPORT const char* getClassName() const;
184 
186  DLLEXPORT bool existsVariant(const type_vec_t& paramTypeInfo) const;
187 
188  /* returns the return type information for the method if it is available and if
189  there is only one return type (there can be more return types if the method is
190  overloaded)
191  */
192  DLLEXPORT const QoreTypeInfo* getUniqueReturnTypeInfo() const;
193 
195 
199  DLLEXPORT QoreValue execManaged(QoreObject* self, const QoreListNode* args, ExceptionSink* xsink) const;
200 
202 
204  DLLEXPORT method_type_e getMethodType() const;
205 
207 
209  DLLEXPORT const QoreExternalMethodFunction* getFunction() const;
210 
211  DLLLOCAL QoreMethod(const QoreClass* p_class, MethodFunctionBase* n_func, bool n_static = false);
212 
213  DLLLOCAL bool inMethod(const QoreObject* self) const;
214  DLLLOCAL QoreMethod* copy(const QoreClass* p_class) const;
215  DLLLOCAL void assign_class(const QoreClass* p_class);
216  // non-exported destructor
217  DLLLOCAL ~QoreMethod();
218 };
219 
221 
224 public:
225  DLLEXPORT virtual ~AbstractQoreClassUserData();
226 
228  virtual AbstractQoreClassUserData* copy() const = 0;
229 
231  virtual void doDeref() = 0;
232 };
233 
235 
239 class QoreClass {
240  friend class BCList;
241  friend class BCNode;
242  friend class BCSMList;
243  friend class qore_object_private;
244  friend class qore_class_private;
245  friend class QoreObject;
246  friend class BCANode;
247  friend class qore_method_private;
248  friend class QoreMethodIterator;
249  friend class QoreStaticMethodIterator;
250  friend class ConstructorMethodFunction;
251 
252 public:
254 
262  DLLEXPORT QoreClass(std::string&& n_name, int64 n_domain = QDOM_DEFAULT);
263 
265 
273  DLLEXPORT QoreClass(const char* n_name, int64 n_domain = QDOM_DEFAULT);
274 
276 
283  DLLEXPORT explicit QoreClass(const char* n_name, int n_domain);
284 
286 
293  DLLEXPORT QoreClass(const char* n_name, int64 n_domain, const QoreTypeInfo* n_typeInfo);
294 
296 
298  DLLEXPORT QoreClass(const QoreClass& old);
299 
301 
303  DLLEXPORT virtual QoreClass* copyImport();
304 
306 
308  DLLEXPORT virtual QoreClass* copy();
309 
311 
313  DLLEXPORT QoreProgram* getProgram() const;
314 
316 
345  DLLEXPORT void addMethod(const char* n_name, q_method_n_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
346 
348 
382  DLLEXPORT void addMethod(const void* ptr, const char* n_name, q_external_method_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, const QoreTypeInfo* returnTypeInfo = 0, const type_vec_t& n_typeList = type_vec_t(), const arg_vec_t& defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t());
383 
385  DLLEXPORT void addStaticMethod(const char* n_name, q_func_n_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
386 
388 
390  DLLEXPORT void addStaticMethod(const void* ptr, const char* n_name, q_external_static_method_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, const QoreTypeInfo* returnTypeInfo = 0, const type_vec_t& n_typeList = type_vec_t(), const arg_vec_t& defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t());
391 
393  DLLEXPORT void addAbstractMethod(const char* n_name, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
394 
396  DLLEXPORT void addAbstractMethod(const char* n_name, ClassAccess access, int64 n_flags, const QoreTypeInfo* returnTypeInfo, const type_vec_t& n_typeList, const arg_vec_t& defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t());
397 
399 
410  DLLEXPORT void setDestructor(q_destructor_t m);
411 
413 
425  DLLEXPORT void setDestructor(const void* ptr, q_external_destructor_t m);
426 
428  DLLEXPORT void addConstructor(q_constructor_n_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, unsigned num_params = 0, ...);
429 
431 
433  DLLEXPORT void addConstructor(const void* ptr, q_external_constructor_t meth, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, int64 n_domain = QDOM_DEFAULT, const type_vec_t& n_typeList = type_vec_t(), const arg_vec_t& defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t());
434 
436 
440 
442 
453  DLLEXPORT void setCopy(q_copy_t m);
454 
456 
468  DLLEXPORT void setCopy(const void* ptr, q_external_copy_t m);
469 
471 
479  DLLEXPORT void setDeleteBlocker(q_delete_blocker_t m);
480 
482 
486  DLLEXPORT void setSerializer(q_serializer_t m);
487 
489 
493  DLLEXPORT void setDeserializer(q_deserializer_t m);
494 
496 
498  DLLEXPORT q_serializer_t getSerializer() const;
499 
501 
503  DLLEXPORT q_deserializer_t getDeserializer() const;
504 
506  DLLEXPORT void setFinal();
507 
509 
513  DLLEXPORT bool isPrivateMember(const char* str) const;
514 
516 
521  DLLEXPORT bool isPublicOrPrivateMember(const char* str, bool& priv) const;
522 
524 
530  DLLEXPORT QoreObject* execConstructor(const QoreListNode* args, ExceptionSink* xsink) const;
531 
533 
546  DLLEXPORT QoreObject* execConstructor(const QoreClass& obj_cls, const QoreListNode* args, bool allow_abstract,
547  ExceptionSink* xsink) const;
548 
550 
557  DLLEXPORT QoreObject* execConstructorVariant(const QoreExternalMethodVariant* mv, const QoreListNode *args, ExceptionSink* xsink) const;
558 
560 
564  DLLEXPORT QoreObject* execSystemConstructor(int code = 0, ...) const;
565 
567 
571  DLLEXPORT QoreObject* execCopy(QoreObject* old, ExceptionSink* xsink) const;
572 
574 
577  DLLEXPORT QoreListNode* getMethodList() const;
578 
580 
583  DLLEXPORT QoreListNode* getStaticMethodList() const;
584 
586 
594  DLLEXPORT QoreClass* getClass(qore_classid_t cid) const;
595 
597 
604  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
605 
607 
614  DLLEXPORT const QoreClass* getClass(const QoreClass& qc, bool& priv) const;
615 
617  DLLEXPORT int numMethods() const;
618 
620  DLLEXPORT int numStaticMethods() const;
621 
623  DLLEXPORT int numUserMethods() const;
624 
626  DLLEXPORT int numStaticUserMethods() const;
627 
629  DLLEXPORT bool hasCopy() const;
630 
632  DLLEXPORT qore_classid_t getID() const;
633 
635  DLLEXPORT bool isSystem() const;
636 
638 
640  DLLEXPORT bool isModulePublic() const;
641 
643 
645  DLLEXPORT bool isAbstract() const;
646 
648 
650  DLLEXPORT bool isFinal() const;
651 
653 
655  DLLEXPORT bool isInjected() const;
656 
658 
660  DLLEXPORT bool isPseudoClass() const;
661 
663 
667  DLLEXPORT qore_type_t getPseudoClassType() const;
668 
670 
674  DLLEXPORT QoreValue evalPseudoMethod(const QoreValue n, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
675 
677 
691  DLLEXPORT QoreValue evalPseudoMethod(const QoreMethod* m, const QoreExternalMethodVariant* variant, const QoreValue n, const QoreListNode* args, ExceptionSink* xsink) const;
692 
694  DLLEXPORT void setSystem();
695 
697  DLLEXPORT bool hasMemberGate() const;
698 
700  DLLEXPORT bool hasMethodGate() const;
701 
703  DLLEXPORT bool hasMemberNotification() const;
704 
706 
708  DLLEXPORT int64 getDomain() const;
709 
711  DLLEXPORT const char* getName() const;
712 
714 
718  DLLEXPORT const QoreMethod* findMethod(const char* nme) const;
719 
721 
725  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme) const;
726 
728 
732  DLLEXPORT const QoreMethod* findMethod(const char* nme, ClassAccess& access) const;
733 
735 
739  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme, ClassAccess& access) const;
740 
742 
746  DLLEXPORT const QoreMethod* findLocalMethod(const char* name) const;
747 
749 
753  DLLEXPORT const QoreMethod* findLocalStaticMethod(const char* name) const;
754 
756 
759  DLLEXPORT void addBuiltinBaseClass(QoreClass* qc);
760 
762 
767  DLLEXPORT void addDefaultBuiltinBaseClass(QoreClass* qc);
768 
770 
776  DLLEXPORT void addBuiltinVirtualBaseClass(QoreClass* qc);
777 
779 
784  DLLEXPORT void addBaseClass(QoreClass* qc, bool virt = false);
785 
787 
789  DLLEXPORT void setSynchronousClass();
790 
792 
795  DLLEXPORT const QoreMethod* getConstructor() const;
796 
798 
801  DLLEXPORT const QoreMethod* getSystemConstructor() const;
802 
804 
807  DLLEXPORT const QoreMethod* getDestructor() const;
808 
810 
813  DLLEXPORT const QoreMethod* getCopyMethod() const;
814 
816 
819  DLLEXPORT const QoreMethod* getMemberGateMethod() const;
820 
822 
825  DLLEXPORT const QoreMethod* getMethodGate() const;
826 
828 
831  DLLEXPORT const QoreMethod* getMemberNotificationMethod() const;
832 
834  DLLEXPORT const QoreTypeInfo* getTypeInfo() const;
835 
837  DLLEXPORT const QoreTypeInfo* getOrNothingTypeInfo() const;
838 
840  DLLEXPORT void addMember(const char* mem, ClassAccess access, const QoreTypeInfo* n_typeInfo, QoreValue initial_value = QoreValue());
841 
843 
845  DLLEXPORT void setUserData(const void* ptr);
846 
848 
850  DLLEXPORT const void* getUserData() const;
851 
853 
855  DLLEXPORT void setManagedUserData(AbstractQoreClassUserData* cud);
856 
858 
861 
863 
865  template <typename T>
866  DLLLOCAL T* getManagedUserData() const {
867  return static_cast<T*>(getManagedUserData());
868  }
869 
871  DLLEXPORT void recheckBuiltinMethodHierarchy();
872 
874 
876  DLLEXPORT const QoreExternalMethodVariant* findUserMethodVariant(const char* name, const QoreMethod*& method, const type_vec_t& argTypeList) const;
877 
879 
884  DLLEXPORT void addBuiltinConstant(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
885 
887 
892  DLLEXPORT void addBuiltinStaticVar(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
893 
895 
901  DLLEXPORT void rescanParents();
902 
904 
906  DLLEXPORT void setPublicMemberFlag();
907 
909 
911  DLLEXPORT void setGateAccessFlag();
912 
914 
916  DLLEXPORT const QoreExternalNormalMember* findLocalMember(const char* name) const;
917 
919 
921  DLLEXPORT const QoreExternalStaticMember* findLocalStaticMember(const char* name) const;
922 
924 
928  DLLEXPORT std::string getNamespacePath(bool anchored = false) const;
929 
931 
933  DLLEXPORT bool isEqual(const QoreClass& cls) const;
934 
936 
938  DLLEXPORT BinaryNode* getBinaryHash() const;
939 
941 
943  DLLEXPORT int runtimeCheckInstantiateClass(ExceptionSink* xsink) const;
944 
946 
948  DLLEXPORT const QoreExternalConstant* findConstant(const char* name) const;
949 
951 
953  DLLEXPORT const QoreNamespace* getNamespace() const;
954 
956 
958  DLLEXPORT bool inHierarchy(const QoreClass& cls, ClassAccess& n_access) const;
959 
961 
963  DLLEXPORT bool hasTransientMember() const;
964 
966 
968  DLLEXPORT const char* getModuleName() const;
969 
970  // used when parsing, finds committed non-static methods within the entire class hierarchy (local class plus base classes)
971  DLLLOCAL const QoreMethod* parseFindCommittedMethod(const char* nme);
972 
973  // returns 0 for success, -1 for error
974  DLLLOCAL int parseAddBaseClassArgumentList(BCAList* bcal);
975  // only called when parsing, sets the name of the class
976  DLLLOCAL void setName(const char* n);
977 
978  DLLLOCAL qore_classid_t getIDForMethod() const;
979  // get base class list to add virtual class indexes for private data
980  DLLLOCAL BCSMList* getBCSMList() const;
981  // returns true if the class has a delete_blocker function (somewhere in the hierarchy)
982  DLLLOCAL bool has_delete_blocker() const;
983 
984  DLLLOCAL bool parseHasPublicMembersInHierarchy() const;
985  DLLLOCAL bool runtimeHasPublicMembersInHierarchy() const;
986 
987  // returns true if the class has one or more parent classes
988  DLLLOCAL bool hasParentClass() const;
989  DLLLOCAL bool hasPrivateCopyMethod() const;
990  // returns the status including the pending variant (if any)
991  DLLLOCAL bool parseHasPrivateCopyMethod() const;
992  DLLLOCAL const QoreMethod* parseGetConstructor() const;
993  // returns true if the class implements a "methodGate" method, also in pending uncommitted methods
994  DLLLOCAL bool parseHasMethodGate() const;
995  // called when there is an empty public member declaration or a "no_public" declaration
996  DLLLOCAL void parseSetEmptyPublicMemberDeclaration();
997  // unsets the public member flag for builtin classes
998  DLLLOCAL void unsetPublicMemberFlag();
999 
1000 protected:
1002  DLLEXPORT virtual ~QoreClass();
1003 
1005  DLLEXPORT QoreClass();
1006 
1007 private:
1009  QoreClass& operator=(const QoreClass&) = delete;
1010 
1012  class qore_class_private* priv;
1013 
1014  DLLLOCAL void insertMethod(QoreMethod* o);
1015  DLLLOCAL void insertStaticMethod(QoreMethod* o);
1016  DLLLOCAL QoreValue evalMethodGate(QoreObject* self, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
1017  DLLLOCAL const QoreMethod* parseResolveSelfMethodIntern(const char* nme);
1018 
1020 
1031  DLLLOCAL QoreValue evalMethod(QoreObject* self, const char* method_name, const QoreListNode* args, ExceptionSink* xsink) const;
1032 
1033  // This function must only be called from QoreObject
1034  DLLLOCAL void execMemberNotification(QoreObject* self, const char* mem, ExceptionSink* xsink) const;
1035  // This function must only be called from QoreObject and BCList
1036  DLLLOCAL bool execDeleteBlocker(QoreObject* self, ExceptionSink* xsink) const;
1037  // This function must only be called from QoreObject
1038  DLLLOCAL void execDestructor(QoreObject* self, ExceptionSink* xsink) const;
1039 };
1040 
1043 private:
1044  void* priv;
1045 
1046 public:
1047  DLLEXPORT QoreMethodIterator(const QoreClass& qc);
1048  DLLEXPORT ~QoreMethodIterator();
1049  DLLEXPORT bool next();
1050  DLLEXPORT const QoreMethod* getMethod() const;
1051 };
1052 
1055 private:
1056  void* priv;
1057 
1058 public:
1059  DLLEXPORT QoreStaticMethodIterator(const QoreClass& qc);
1060  DLLEXPORT ~QoreStaticMethodIterator();
1061  DLLEXPORT bool next();
1062  DLLEXPORT const QoreMethod* getMethod() const;
1063 };
1064 
1066 
1069 public:
1071  DLLLOCAL QoreClassHolder(QoreClass* c) : c(c) {
1072  }
1073 
1075  DLLEXPORT ~QoreClassHolder();
1076 
1078  DLLLOCAL operator QoreClass*() const {
1079  return c;
1080  }
1081 
1083  DLLLOCAL QoreClass* release() {
1084  auto rv = c;
1085  c = 0;
1086  return rv;
1087  }
1088 
1089 private:
1091  QoreClass* c;
1092 };
1093 
1095 class QoreBuiltinClass : public QoreClass {
1096 public:
1098  DLLEXPORT QoreBuiltinClass(const char* name, int64 n_domain = QDOM_DEFAULT);
1099 
1101  DLLEXPORT QoreBuiltinClass(const QoreBuiltinClass& old);
1102 
1103 protected:
1105  DLLEXPORT QoreBuiltinClass();
1106 };
1107 
1109 
1112 public:
1114  DLLEXPORT QoreParentClassIterator(const QoreClass& cls);
1115 
1117  DLLEXPORT ~QoreParentClassIterator();
1118 
1120  DLLEXPORT bool next();
1121 
1123  DLLEXPORT bool valid() const;
1124 
1126  DLLEXPORT const QoreClass& getParentClass() const;
1127 
1129  DLLEXPORT ClassAccess getAccess() const;
1130 
1131 private:
1132  std::unique_ptr<class qore_parent_class_iterator_private> priv;
1133 };
1134 
1136 
1139 public:
1141  DLLEXPORT QoreClassMemberIterator(const QoreClass& cls);
1142 
1144  DLLEXPORT ~QoreClassMemberIterator();
1145 
1147  DLLEXPORT bool next();
1148 
1150  DLLEXPORT bool valid() const;
1151 
1153  DLLEXPORT const QoreExternalNormalMember& getMember() const;
1154 
1156  DLLEXPORT const char* getName() const;
1157 
1158 private:
1159  std::unique_ptr<class qore_class_member_iterator_private> priv;
1160 };
1161 
1163 
1166 public:
1168  DLLEXPORT QoreClassStaticMemberIterator(const QoreClass& cls);
1169 
1171  DLLEXPORT ~QoreClassStaticMemberIterator();
1172 
1174  DLLEXPORT bool next();
1175 
1177  DLLEXPORT bool valid() const;
1178 
1180  DLLEXPORT const QoreExternalStaticMember& getMember() const;
1181 
1183  DLLEXPORT const char* getName() const;
1184 
1185 private:
1186  std::unique_ptr<class qore_class_static_member_iterator_private> priv;
1187 };
1188 
1190 
1193 public:
1195  DLLEXPORT QoreClassConstantIterator(const QoreClass& cls);
1196 
1198  DLLEXPORT ~QoreClassConstantIterator();
1199 
1201  DLLEXPORT bool next();
1202 
1204  DLLEXPORT bool valid() const;
1205 
1207  DLLEXPORT const QoreExternalConstant& get() const;
1208 
1209 private:
1210  std::unique_ptr<class qore_class_constant_iterator> priv;
1211 };
1212 
1214 
1219 public:
1221  DLLEXPORT QoreClassHierarchyIterator(const QoreClass& cls);
1222 
1224  DLLEXPORT ~QoreClassHierarchyIterator();
1225 
1227  DLLEXPORT bool next();
1228 
1230  DLLEXPORT bool valid() const;
1231 
1233  DLLEXPORT const QoreClass& get() const;
1234 
1236 
1238  DLLEXPORT bool isVirtual() const;
1239 
1240 private:
1241  std::unique_ptr<class qore_class_hierarchy_iterator> priv;
1242 };
1243 
1245 
1250 public:
1252  DLLEXPORT QoreClassDestructorHierarchyIterator(const QoreClass* cls);
1253 
1256 
1258  DLLEXPORT bool next();
1259 
1261  DLLEXPORT bool valid() const;
1262 
1264  DLLEXPORT const QoreClass* get() const;
1265 
1267 
1269  DLLEXPORT bool isVirtual() const;
1270 
1271 private:
1272  class qore_class_destructor_hierarchy_iterator* priv;
1273 };
1274 
1275 DLLEXPORT const char* get_access_string(ClassAccess access);
1276 
1277 #endif // _QORE_QORECLASS_H
DLLEXPORT QoreClassHierarchyIterator(const QoreClass &cls)
creates the iterator; call next() to start iterating
DLLEXPORT bool isPrivate() const
returns true if all overloaded variants of a methods are private or class internal, false if at least one variant is public
DLLEXPORT QoreParentClassIterator(const QoreClass &cls)
creates the iterator; call next() to start iterating
DLLEXPORT void setUserData(const void *ptr)
sets a pointer to user-specific data in the class
DLLEXPORT QoreClass * getClass(qore_classid_t cid) const
returns a pointer to the QoreClass object representing the class ID passed if it exists in the class ...
DLLEXPORT int runtimeCheckInstantiateClass(ExceptionSink *xsink) const
Throws a Qore-language exception if the class cannot be instantiated.
external wrapper base class for class normal members
Definition: QoreReflection.h:174
void(* q_external_constructor_t)(const QoreMethod &method, const void *ptr, QoreObject *self, const QoreListNode *args, q_rt_flags_t rtflags, ExceptionSink *xsink)
the type used for builtin QoreClass constructor method signatures
Definition: common.h:378
DLLEXPORT void setDestructor(q_destructor_t m)
sets the builtin destructor method for the class
DLLEXPORT void addBuiltinVirtualBaseClass(QoreClass *qc)
sets "virtual" base class for a class, meaning that the base class data is appropriate for use in the...
To be used to iterate through a class&#39;s normal (non-static) methods.
Definition: QoreClass.h:1042
DLLEXPORT ~QoreClassStaticMemberIterator()
destroys the object
external wrapper class for constants
Definition: QoreReflection.h:200
DLLEXPORT bool isBuiltin() const
returns true if all variants of the method are builtin variants
DLLEXPORT QoreObject * execCopy(QoreObject *old, ExceptionSink *xsink) const
executes a class&#39;s "copy" method on an object and returns the new object (or 0 in the case of an exce...
DLLEXPORT QoreClassConstantIterator(const QoreClass &cls)
creates the iterator; call next() to start iterating
DLLEXPORT const QoreNamespace * getNamespace() const
Returns the namespace that owns this class.
DLLEXPORT QoreObject * execSystemConstructor(int code=0,...) const
creates a new "system" object for use as the value of a constant, executes the system constructor on ...
DLLEXPORT bool isPrivateMember(const char *str) const
returns true if the member is private
void(* q_destructor_t)(QoreObject *self, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass destructor signatures
Definition: common.h:398
DLLEXPORT ~QoreParentClassIterator()
destroys the object
DLLEXPORT void setCopy(q_copy_t m)
sets the builtin copy method for the class
DLLEXPORT bool isVirtual() const
returns true if the class has virtual inheritance, meaning that it is a builtin class without its own...
DLLEXPORT const QoreExternalStaticMember & getMember() const
returns the member
DLLEXPORT void setSerializer(q_serializer_t m)
sets the serializer method for builtin classes
DLLEXPORT void addStaticMethod(const char *n_name, q_func_n_t meth, ClassAccess access=Public, int64 n_flags=QCF_NO_FLAGS, int64 n_domain=QDOM_DEFAULT, const QoreTypeInfo *returnTypeInfo=0, unsigned num_params=0,...)
adds a builtin static method with extended information; additional functional domain info...
QoreValue(* q_external_static_method_t)(const QoreMethod &method, const void *ptr, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for external static methods
Definition: common.h:358
DLLEXPORT void setDeleteBlocker(q_delete_blocker_t m)
sets the deleteBlocker method for the class
virtual void doDeref()=0
for non-reference counted classes, deletes the object immediately
DLLEXPORT bool isAbstract() const
returns true if the class has at least one unimplemented abstract method variant
void(* q_system_constructor_t)(QoreObject *self, int code, va_list args)
the type used for builtin QoreClass system constructor method signatures
Definition: common.h:390
DLLEXPORT const QoreMethod * findLocalMethod(const char *name) const
finds a normal (non-static) method in the class hierarchy
an abstract class for class-specific external user data
Definition: QoreClass.h:223
external wrapper base class for class static members
Definition: QoreReflection.h:153
external wrapper class for function and call variants
Definition: QoreReflection.h:38
iterates class constants
Definition: QoreClass.h:1192
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
iterates the class hierarchy in the order of destructor execution
Definition: QoreClass.h:1249
allows for temporary storage of a QoreClass pointer
Definition: QoreClass.h:1068
DLLEXPORT const char * getName() const
returns the method&#39;s name
DLLEXPORT bool isPublicOrPrivateMember(const char *str, bool &priv) const
returns true if the member is private or public
contains constants, classes, and subnamespaces in QoreProgram objects
Definition: QoreNamespace.h:65
DLLEXPORT const QoreExternalStaticMember * findLocalStaticMember(const char *name) const
Finds the given local static member or returns nullptr.
virtual AbstractQoreClassUserData * copy() const =0
for reference-counted classes, returns the same object with the reference count incremented ...
DLLEXPORT int64 getDomain() const
returns the functional domain of the class
DLLLOCAL QoreClass * release()
releases the QoreClass*
Definition: QoreClass.h:1083
DLLEXPORT const QoreMethod * getDestructor() const
returns a const pointer to the QoreMethod object of the constructor method, if any is set ...
DLLEXPORT bool hasMethodGate() const
returns true if the class implements a "methodGate" method
QoreHashNode *(* q_serializer_t)(const QoreObject &self, const AbstractPrivateData &data, QoreSerializationContext &context, ExceptionSink *xsink)
the type used for builtin QoreClass serializer method signatures
Definition: common.h:446
DLLEXPORT QoreValue execManaged(QoreObject *self, const QoreListNode *args, ExceptionSink *xsink) const
evaluates the method and returns the value, does not reference the object for the call ...
DLLEXPORT const QoreMethod * findMethod(const char *nme) const
finds a normal (non-static) method in the class hierarchy
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
DLLEXPORT const QoreMethod * findStaticMethod(const char *nme) const
finds a static method in the class hierarchy
DLLEXPORT QoreObject * execConstructor(const QoreListNode *args, ExceptionSink *xsink) const
creates a new object and executes the constructor on it and returns the new object ...
DLLEXPORT const QoreTypeInfo * getOrNothingTypeInfo() const
returns the "or nothing" type information structure for this class
DLLEXPORT const char * getModuleName() const
Returns the module name the class was loaded from or nullptr if it is a builtin class.
DLLEXPORT const QoreExternalNormalMember & getMember() const
returns the member
DLLEXPORT int numStaticMethods() const
returns the number of static methods in this class (user and builtin)
DLLEXPORT void setManagedUserData(AbstractQoreClassUserData *cud)
sets a pointer to user-specific data in the class
DLLEXPORT bool isUser() const
returns true if all variants of the method are user variants
To be used to iterate through a class&#39;s static methods.
Definition: QoreClass.h:1054
virtual DLLEXPORT QoreClass * copyImport()
Called when a class is copied for import.
DLLEXPORT const QoreClass * getClass() const
returns a pointer to the parent class
DLLEXPORT int numUserMethods() const
returns the number of non-static user methods in this class
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
iterates the class hierarchy in the order of constructor execution
Definition: QoreClass.h:1218
DLLEXPORT q_serializer_t getSerializer() const
returns the serializer method or nullptr if not present
DLLEXPORT void addMember(const char *mem, ClassAccess access, const QoreTypeInfo *n_typeInfo, QoreValue initial_value=QoreValue())
adds a member
DLLEXPORT bool existsVariant(const type_vec_t &paramTypeInfo) const
returns true if a variant with the given parameter signature already exists in the method ...
virtual DLLEXPORT QoreClass * copy()
Called when a class is copied.
DLLEXPORT QoreListNode * getMethodList() const
returns a list strings of all non-static methods in the class, the caller owns the reference count re...
DLLEXPORT const QoreMethod * getMemberGateMethod() const
returns a const pointer to the QoreMethod object of the memberGate method, if any is set ...
DLLEXPORT const std::string & getNameStr() const
returns the method&#39;s name
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
external wrapper base class for class members
Definition: QoreReflection.h:137
DLLEXPORT BinaryNode * getBinaryHash() const
returns a binary hash for the class&#39;s API
DLLEXPORT QoreObject * execConstructorVariant(const QoreExternalMethodVariant *mv, const QoreListNode *args, ExceptionSink *xsink) const
creates a new object and executes the constructor on it and returns the new object ...
DLLEXPORT const QoreMethod * getConstructor() const
returns a const pointer to the QoreMethod object of the constuctor method, if any is set ...
DLLEXPORT const QoreMethod * getMemberNotificationMethod() const
returns a const pointer to the QoreMethod object of the memberNotification method, if any is set
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
void(* q_external_copy_t)(const QoreClass &thisclass, const void *ptr, QoreObject *self, QoreObject *old, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass copy signatures with the new generic calling convention ...
Definition: common.h:428
defines a Qore-language class
Definition: QoreClass.h:239
DLLEXPORT void addDefaultBuiltinBaseClass(QoreClass *qc)
make a builtin class a child of another builtin class and ensures that the given class&#39;s private data...
void(* q_external_destructor_t)(const QoreClass &thisclass, const void *ptr, QoreObject *self, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass destructor signatures with the new generic calling convention and...
Definition: common.h:408
DLLEXPORT bool isStatic() const
returns true if the method is static
bool(* q_delete_blocker_t)(QoreObject *self, AbstractPrivateData *private_data)
the typed used for QoreClass deleteBlocker signatures
Definition: common.h:436
DLLEXPORT QoreClassDestructorHierarchyIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
DLLEXPORT void setDeserializer(q_deserializer_t m)
sets the deserializer method for builtin classes
DLLEXPORT const char * getName() const
returns the member&#39;s name
DLLEXPORT bool isFinal() const
returns true if the class is final
void(* q_deserializer_t)(QoreObject &self, const QoreHashNode *sdata, QoreDeserializationContext &context, ExceptionSink *xsink)
the type used for builtin QoreClass deserializer method signatures
Definition: common.h:458
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
DLLEXPORT const QoreMethod * getCopyMethod() const
returns a const pointer to the QoreMethod object of the destructor method, if any is set ...
DLLEXPORT const char * getClassName() const
returns the class name for the method
creates a builtin class
Definition: QoreClass.h:1095
virtual DLLEXPORT ~QoreClass()
Deletes the object and frees all memory.
DLLEXPORT bool hasCopy() const
returns true if the class implements a copy method
void(* q_constructor_n_t)(QoreObject *self, const QoreListNode *args, q_rt_flags_t rtflags, ExceptionSink *xsink)
the type used for builtin QoreClass constructor method signatures
Definition: common.h:366
iterates static members of a class
Definition: QoreClass.h:1165
QoreValue(* q_method_n_t)(QoreObject *self, AbstractPrivateData *private_data, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin QoreClass method signatures
Definition: common.h:330
DLLEXPORT bool isEqual(const QoreClass &cls) const
returns true if the classes are equal
DLLEXPORT void addMethod(const char *n_name, q_method_n_t meth, ClassAccess access=Public, int64 n_flags=QCF_NO_FLAGS, int64 n_domain=QDOM_DEFAULT, const QoreTypeInfo *returnTypeInfo=0, unsigned num_params=0,...)
adds a builtin method variant to a class
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:262
DLLEXPORT bool isVirtual() const
returns true if the class has virtual inheritance, meaning that it is a builtin class without its own...
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only ...
Definition: QoreProgram.h:126
DLLEXPORT bool hasMemberGate() const
returns true if the class implements a "memberGate" method
DLLEXPORT const QoreMethod * getSystemConstructor() const
returns a const pointer to the QoreMethod object of the constuctor method, if any is set ...
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:61
DLLEXPORT const QoreClass & getParentClass() const
returns the parent class
unsigned qore_classid_t
used for the unique class ID for QoreClass objects
Definition: common.h:79
static unsigned num_params(const QoreListNode *n)
returns the number of arguments passed to the function
Definition: params.h:54
DLLEXPORT bool hasMemberNotification() const
returns true if the class implements a "memberNotification" method
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
DLLEXPORT const QoreExternalConstant * findConstant(const char *name) const
Finds the given constant or returns nullptr if not found.
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
std::vector< std::string > name_vec_t
vector of parameter names for parameter lists
Definition: common.h:257
DLLEXPORT ClassAccess getAccess() const
returns the lowest access code of all variants in the method
DLLEXPORT std::string getNamespacePath(bool anchored=false) const
returns the full namespace path of the class
DLLEXPORT void recheckBuiltinMethodHierarchy()
rechecks for inherited methods in base classes when adding builtin classes
DLLLOCAL QoreClassHolder(QoreClass *c)
creates the object
Definition: QoreClass.h:1071
DLLEXPORT void addConstructor(q_constructor_n_t meth, ClassAccess access=Public, int64 n_flags=QCF_NO_FLAGS, int64 n_domain=QDOM_DEFAULT, unsigned num_params=0,...)
adds a constructor method variant with the access specifier, additional functional domain info...
DLLEXPORT const QoreExternalMethodFunction * getFunction() const
returns the function for the method
external wrapper class for source code location information
Definition: QoreReflection.h:187
DLLEXPORT bool isModulePublic() const
returns true if the class has its module public flag set
DLLEXPORT method_type_e getMethodType() const
returns the type of method
DLLEXPORT qore_classid_t getID() const
returns the class ID of this class
DLLEXPORT QoreClassMemberIterator(const QoreClass &cls)
creates the iterator; call next() to start iterating
DLLEXPORT void setSystem()
marks the class as a builtin class
DLLEXPORT const QoreTypeInfo * getTypeInfo() const
returns the type information structure for this class
DLLEXPORT const QoreExternalNormalMember * findLocalMember(const char *name) const
Finds the given local member or returns nullptr.
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
std::vector< QoreValue > arg_vec_t
vector of value information for default argument lists
Definition: common.h:254
DLLEXPORT const void * getUserData() const
retrieves the user-specific data pointer
DLLEXPORT ~QoreClassMemberIterator()
destroys the object
DLLEXPORT void setGateAccessFlag()
sets the class&#39;s gate access flag so that memberGate() and methodGate() methods will be called with a...
DLLEXPORT const QoreMethod * getMethodGate() const
returns a const pointer to the QoreMethod object of the methodGate method, if any is set ...
DLLEXPORT const QoreExternalMethodVariant * findUserMethodVariant(const char *name, const QoreMethod *&method, const type_vec_t &argTypeList) const
returns the user variant for the given non-static method and argument types
DLLEXPORT void setSynchronousClass()
call this function if your builtin class requires *all* methods (except the constructor) to be run in...
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
DLLEXPORT int numStaticUserMethods() const
returns the number of static user methods in this class
DLLEXPORT ~QoreClassHolder()
deletes the QoreClass object if still managed
DLLEXPORT void addBuiltinStaticVar(const char *name, QoreValue value, ClassAccess access=Public, const QoreTypeInfo *typeInfo=nullptr)
adds a static variable to the class
DLLEXPORT QoreProgram * getProgram() const
Returns the owning QoreProgram object (if not the static system namespace)
DLLEXPORT bool isPseudoClass() const
returns true if the class is a pseudo class
DLLEXPORT bool isInjected() const
returns true if the class has been injected as a dependency injection
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode) ...
Definition: common.h:70
DLLEXPORT AbstractQoreClassUserData * getManagedUserData() const
retrieves the user-specific data pointer
DLLEXPORT QoreBuiltinClass()
for use with QoreClass::copyImport()
DLLEXPORT bool valid() const
returns true if the iterator is pointing at a valid element
DLLEXPORT QoreValue evalPseudoMethod(const QoreValue n, const char *nme, const QoreListNode *args, ExceptionSink *xsink) const
evaluates a pseudo-method on a pseudo-class
DLLEXPORT int numMethods() const
returns the number of non-static methods in this class (user and builtin)
iterates normal (non-static) members of a class
Definition: QoreClass.h:1138
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
DLLEXPORT void addBuiltinConstant(const char *name, QoreValue value, ClassAccess access=Public, const QoreTypeInfo *typeInfo=nullptr)
adds a class constant to the class
DLLEXPORT q_deserializer_t getDeserializer() const
returns the deserializer method or nullptr if not present
DLLEXPORT bool inHierarchy(const QoreClass &cls, ClassAccess &n_access) const
Returns true if the class passed as an argument is present in the current class&#39;s hierachy...
DLLEXPORT void setPublicMemberFlag()
sets the class&#39;s public member flag so that undeclared member references will fail ...
DLLEXPORT void addBuiltinBaseClass(QoreClass *qc)
make a builtin class a child of another builtin class
DLLEXPORT const char * getName() const
returns the member&#39;s name
void(* q_copy_t)(QoreObject *self, QoreObject *old, AbstractPrivateData *private_data, ExceptionSink *xsink)
the type used for builtin QoreClass copy signatures
Definition: common.h:417
QoreValue(* q_external_method_t)(const QoreMethod &method, const void *ptr, QoreObject *self, AbstractPrivateData *private_data, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin QoreClass method signatures
Definition: common.h:345
std::vector< const QoreTypeInfo * > type_vec_t
vector of type information for parameter lists
Definition: common.h:251
a method in a QoreClass
Definition: QoreClass.h:125
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
DLLEXPORT const QoreMethod * findLocalStaticMethod(const char *name) const
finds a static method in the class hierarchy
DLLEXPORT void rescanParents()
rescan builtin parent classes in a class hierarchy; to be used with out-of-order class hierarchy cons...
DLLEXPORT void setFinal()
sets the final flag of the class
DLLEXPORT QoreListNode * getStaticMethodList() const
returns a list strings of all static methods in the class, the caller owns the reference count return...
DLLEXPORT qore_type_t getPseudoClassType() const
returns a pseudo-classes base type
DLLEXPORT ~QoreClassConstantIterator()
destroys the object
DLLEXPORT bool next()
returns advances to the next element (or to the first element if starting to iterate) and returns tru...
DLLEXPORT void setSystemConstructor(q_system_constructor_t m)
sets the builtin constructor for system objects (ex: used as constant values)
DLLEXPORT void addAbstractMethod(const char *n_name, ClassAccess access=Public, int64 n_flags=QCF_NO_FLAGS, const QoreTypeInfo *returnTypeInfo=0, unsigned num_params=0,...)
adds an unimplemented abstract method variant to the class with extended information; with return and...
DLLEXPORT bool isSystem() const
returns true if the class is a builtin class
DLLEXPORT const char * getName() const
returns the class name
iterates parent classes for a class with inheritance access information
Definition: QoreClass.h:1111
DLLEXPORT bool hasTransientMember() const
Returns true if the class has at least one locally-declared transient member.
DLLEXPORT QoreClassStaticMemberIterator(const QoreClass &cls)
creates the iterator; call next() to start iterating
QoreValue(* q_func_n_t)(const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin function signatures
Definition: common.h:307
DLLEXPORT ~QoreClassHierarchyIterator()
destroys the object
holds arbitrary binary data
Definition: BinaryNode.h:41
DLLEXPORT QoreClass()
For use with QoreClass::copyImport()
DLLEXPORT ClassAccess getAccess() const
returns the access of the parent class
DLLEXPORT void addBaseClass(QoreClass *qc, bool virt=false)
Adds a base class to the current class.
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:156
DLLEXPORT ~QoreClassDestructorHierarchyIterator()
destroys the object