Qore Programming Language  0.9.3
QoreClass.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreClass.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2019 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 
70 DLLEXPORT extern QoreClass* QC_QUEUE;
71 DLLEXPORT extern QoreClass* QC_HTTPCLIENT;
72 DLLEXPORT extern QoreClass* QC_SSLCERTIFICATE;
73 DLLEXPORT extern QoreClass* QC_SSLPRIVATEKEY;
74 DLLEXPORT extern QoreClass* QC_PROGRAM;
75 
76 class BCList;
77 class BCSMList;
78 class BCAList;
79 class QoreObject;
80 class QoreClass;
81 class BCEAList;
82 class ParamList;
83 class QoreMemberInfo;
84 class BuiltinMethod;
85 class AbstractQoreFunctionVariant;
86 class AbstractFunctionSignature;
87 class UserMethod;
88 class BCANode;
89 class qore_method_private;
90 class MethodFunctionBase;
91 class NamedScope;
92 class ConstantList;
93 class MethodVariantBase;
94 
100 class QoreExternalMethodFunction;
105 
107 
109 enum method_type_e {
110  MT_None = 0, // not a method function/variant
111  MT_Normal = 1,
112  MT_Static = 2,
113  MT_Constructor = 3,
114  MT_Destructor = 4,
115  MT_Copy = 5,
116  MT_Pseudo = 6,
117 };
118 
120 
123 class QoreMethod {
124  friend class StaticMethodCallNode;
125  friend class QoreObject;
126  friend class qore_class_private;
127  friend class qore_method_private;
128  friend class BCList;
129 
130 private:
132  class qore_method_private* priv;
133 
135  DLLLOCAL QoreMethod(const QoreMethod&);
136 
138  DLLLOCAL QoreMethod& operator=(const QoreMethod&);
139 
140 public:
142 
144  DLLEXPORT bool isUser() const;
145 
147 
149  DLLEXPORT bool isBuiltin() const;
150 
152 
154  DLLEXPORT bool isPrivate() const;
155 
157  DLLEXPORT ClassAccess getAccess() const;
158 
160 
163  DLLEXPORT bool isStatic() const;
164 
166 
169  DLLEXPORT const char* getName() const;
170 
172 
175  DLLEXPORT const std::string& getNameStr() const;
176 
178  DLLEXPORT const QoreClass* getClass() const;
179 
181  DLLEXPORT const char* getClassName() const;
182 
184  DLLEXPORT bool existsVariant(const type_vec_t& paramTypeInfo) const;
185 
186  /* returns the return type information for the method if it is available and if
187  there is only one return type (there can be more return types if the method is
188  overloaded)
189  */
190  DLLEXPORT const QoreTypeInfo* getUniqueReturnTypeInfo() const;
191 
193 
197  DLLEXPORT QoreValue execManaged(QoreObject* self, const QoreListNode* args, ExceptionSink* xsink) const;
198 
200 
202  DLLEXPORT method_type_e getMethodType() const;
203 
205 
207  DLLEXPORT const QoreExternalMethodFunction* getFunction() const;
208 
209  DLLLOCAL QoreMethod(const QoreClass* p_class, MethodFunctionBase* n_func, bool n_static = false);
210 
211  DLLLOCAL bool inMethod(const QoreObject* self) const;
212  DLLLOCAL QoreMethod* copy(const QoreClass* p_class) const;
213  DLLLOCAL void assign_class(const QoreClass* p_class);
214  // non-exported destructor
215  DLLLOCAL ~QoreMethod();
216 };
217 
219 
222 public:
223  DLLEXPORT virtual ~AbstractQoreClassUserData();
224 
226  virtual AbstractQoreClassUserData* copy() const = 0;
227 
229  virtual void doDeref() = 0;
230 };
231 
233 
237 class QoreClass {
238  friend class BCList;
239  friend class BCNode;
240  friend class BCSMList;
241  friend class qore_object_private;
242  friend class qore_class_private;
243  friend class QoreObject;
244  friend class BCANode;
245  friend class qore_method_private;
246  friend class QoreMethodIterator;
247  friend class QoreStaticMethodIterator;
248  friend class ConstructorMethodFunction;
249 
250 public:
252 
260  DLLEXPORT QoreClass(const char* n_name, int64 n_domain = QDOM_DEFAULT);
261 
263 
270  DLLEXPORT explicit QoreClass(const char* n_name, int n_domain);
271 
273 
280  DLLEXPORT QoreClass(const char* n_name, int64 n_domain, const QoreTypeInfo* n_typeInfo);
281 
283 
285  DLLEXPORT QoreClass(const QoreClass &old);
286 
288 
317  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, ...);
318 
320 
354  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());
355 
357  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, ...);
358 
360 
362  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());
363 
365  DLLEXPORT void addAbstractMethod(const char* n_name, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
366 
368  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());
369 
371 
382  DLLEXPORT void setDestructor(q_destructor_t m);
383 
385 
397  DLLEXPORT void setDestructor(const void* ptr, q_external_destructor_t m);
398 
400  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, ...);
401 
403 
405  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());
406 
408 
412 
414 
425  DLLEXPORT void setCopy(q_copy_t m);
426 
428 
440  DLLEXPORT void setCopy(const void* ptr, q_external_copy_t m);
441 
443 
451  DLLEXPORT void setDeleteBlocker(q_delete_blocker_t m);
452 
454 
458  DLLEXPORT void setSerializer(q_serializer_t m);
459 
461 
465  DLLEXPORT void setDeserializer(q_deserializer_t m);
466 
468 
470  DLLEXPORT q_serializer_t getSerializer() const;
471 
473 
475  DLLEXPORT q_deserializer_t getDeserializer() const;
476 
478  DLLEXPORT void setFinal();
479 
481 
485  DLLEXPORT bool isPrivateMember(const char* str) const;
486 
488 
493  DLLEXPORT bool isPublicOrPrivateMember(const char* str, bool& priv) const;
494 
496 
502  DLLEXPORT QoreObject* execConstructor(const QoreListNode* args, ExceptionSink* xsink) const;
503 
505 
512  DLLEXPORT QoreObject* execConstructorVariant(const QoreExternalMethodVariant* mv, const QoreListNode *args, ExceptionSink* xsink) const;
513 
515 
519  DLLEXPORT QoreObject* execSystemConstructor(int code = 0, ...) const;
520 
522 
526  DLLEXPORT QoreObject* execCopy(QoreObject* old, ExceptionSink* xsink) const;
527 
529 
532  DLLEXPORT QoreListNode* getMethodList() const;
533 
535 
538  DLLEXPORT QoreListNode* getStaticMethodList() const;
539 
541 
549  DLLEXPORT QoreClass* getClass(qore_classid_t cid) const;
550 
552 
559  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
560 
562 
569  DLLEXPORT const QoreClass* getClass(const QoreClass& qc, bool& priv) const;
570 
572  DLLEXPORT int numMethods() const;
573 
575  DLLEXPORT int numStaticMethods() const;
576 
578  DLLEXPORT int numUserMethods() const;
579 
581  DLLEXPORT int numStaticUserMethods() const;
582 
584  DLLEXPORT bool hasCopy() const;
585 
587  DLLEXPORT qore_classid_t getID() const;
588 
590  DLLEXPORT bool isSystem() const;
591 
593 
595  DLLEXPORT bool isModulePublic() const;
596 
598 
600  DLLEXPORT bool isAbstract() const;
601 
603 
605  DLLEXPORT bool isFinal() const;
606 
608 
610  DLLEXPORT bool isInjected() const;
611 
613 
615  DLLEXPORT bool isPseudoClass() const;
616 
618 
622  DLLEXPORT qore_type_t getPseudoClassType() const;
623 
625 
629  DLLEXPORT QoreValue evalPseudoMethod(const QoreValue n, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
630 
632 
646  DLLEXPORT QoreValue evalPseudoMethod(const QoreMethod* m, const QoreExternalMethodVariant* variant, const QoreValue n, const QoreListNode* args, ExceptionSink* xsink) const;
647 
649  DLLEXPORT void setSystem();
650 
652  DLLEXPORT bool hasMemberGate() const;
653 
655  DLLEXPORT bool hasMethodGate() const;
656 
658  DLLEXPORT bool hasMemberNotification() const;
659 
661 
663  DLLEXPORT int64 getDomain() const;
664 
666  DLLEXPORT const char* getName() const;
667 
669 
673  DLLEXPORT const QoreMethod* findMethod(const char* nme) const;
674 
676 
680  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme) const;
681 
683 
687  DLLEXPORT const QoreMethod* findMethod(const char* nme, ClassAccess& access) const;
688 
690 
694  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme, ClassAccess& access) const;
695 
697 
701  DLLEXPORT const QoreMethod* findLocalMethod(const char* name) const;
702 
704 
708  DLLEXPORT const QoreMethod* findLocalStaticMethod(const char* name) const;
709 
711 
714  DLLEXPORT void addBuiltinBaseClass(QoreClass* qc);
715 
717 
722  DLLEXPORT void addDefaultBuiltinBaseClass(QoreClass* qc);
723 
725 
731  DLLEXPORT void addBuiltinVirtualBaseClass(QoreClass* qc);
732 
734 
736  DLLEXPORT void setSynchronousClass();
737 
739 
742  DLLEXPORT const QoreMethod* getConstructor() const;
743 
745 
748  DLLEXPORT const QoreMethod* getSystemConstructor() const;
749 
751 
754  DLLEXPORT const QoreMethod* getDestructor() const;
755 
757 
760  DLLEXPORT const QoreMethod* getCopyMethod() const;
761 
763 
766  DLLEXPORT const QoreMethod* getMemberGateMethod() const;
767 
769 
772  DLLEXPORT const QoreMethod* getMethodGate() const;
773 
775 
778  DLLEXPORT const QoreMethod* getMemberNotificationMethod() const;
779 
781  DLLEXPORT const QoreTypeInfo* getTypeInfo() const;
782 
784  DLLEXPORT const QoreTypeInfo* getOrNothingTypeInfo() const;
785 
787  DLLEXPORT void addMember(const char* mem, ClassAccess access, const QoreTypeInfo* n_typeInfo, QoreValue initial_value = QoreValue());
788 
790 
792  DLLEXPORT void setUserData(const void* ptr);
793 
795 
797  DLLEXPORT const void* getUserData() const;
798 
800 
802  DLLEXPORT void setManagedUserData(AbstractQoreClassUserData* cud);
803 
805 
808 
810 
812  template <typename T>
813  DLLLOCAL T* getManagedUserData() const {
814  return static_cast<T*>(getManagedUserData());
815  }
816 
818  DLLEXPORT void recheckBuiltinMethodHierarchy();
819 
821 
823  DLLEXPORT const QoreExternalMethodVariant* findUserMethodVariant(const char* name, const QoreMethod*& method, const type_vec_t& argTypeList) const;
824 
826 
831  DLLEXPORT void addBuiltinConstant(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
832 
834 
839  DLLEXPORT void addBuiltinStaticVar(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
840 
842 
848  DLLEXPORT void rescanParents();
849 
851 
853  DLLEXPORT void setPublicMemberFlag();
854 
856 
858  DLLEXPORT void setGateAccessFlag();
859 
861 
863  DLLEXPORT const QoreExternalNormalMember* findLocalMember(const char* name) const;
864 
866 
868  DLLEXPORT const QoreExternalStaticMember* findLocalStaticMember(const char* name) const;
869 
871 
875  DLLEXPORT std::string getNamespacePath(bool anchored = false) const;
876 
878 
880  DLLEXPORT bool isEqual(const QoreClass& cls) const;
881 
883 
885  DLLEXPORT BinaryNode* getBinaryHash() const;
886 
888 
890  DLLEXPORT int runtimeCheckInstantiateClass(ExceptionSink* xsink) const;
891 
893 
895  DLLEXPORT const QoreExternalConstant* findConstant(const char* name) const;
896 
898 
900  DLLEXPORT const QoreNamespace* getNamespace() const;
901 
903 
905  DLLEXPORT bool inHierarchy(const QoreClass& cls, ClassAccess& n_access) const;
906 
908 
910  DLLEXPORT bool hasTransientMember() const;
911 
913 
915  DLLEXPORT const char* getModuleName() const;
916 
918  DLLLOCAL QoreClass();
919 
920  // used when parsing, finds committed non-static methods within the entire class hierarchy (local class plus base classes)
921  DLLLOCAL const QoreMethod* parseFindCommittedMethod(const char* nme);
922 
923  // returns 0 for success, -1 for error
924  DLLLOCAL int parseAddBaseClassArgumentList(BCAList* bcal);
925  // only called when parsing, sets the name of the class
926  DLLLOCAL void setName(const char* n);
927 
928  DLLLOCAL qore_classid_t getIDForMethod() const;
929  // get base class list to add virtual class indexes for private data
930  DLLLOCAL BCSMList* getBCSMList() const;
931  // returns true if the class has a delete_blocker function (somewhere in the hierarchy)
932  DLLLOCAL bool has_delete_blocker() const;
933 
934  DLLLOCAL bool parseHasPublicMembersInHierarchy() const;
935  DLLLOCAL bool runtimeHasPublicMembersInHierarchy() const;
936 
937  // returns true if the class has one or more parent classes
938  DLLLOCAL bool hasParentClass() const;
939  DLLLOCAL bool hasPrivateCopyMethod() const;
940  // returns the status including the pending variant (if any)
941  DLLLOCAL bool parseHasPrivateCopyMethod() const;
942  DLLLOCAL const QoreMethod* parseGetConstructor() const;
943  // returns true if the class implements a "methodGate" method, also in pending uncommitted methods
944  DLLLOCAL bool parseHasMethodGate() const;
945  // called when there is an empty public member declaration or a "no_public" declaration
946  DLLLOCAL void parseSetEmptyPublicMemberDeclaration();
947  // unsets the public member flag for builtin classes
948  DLLLOCAL void unsetPublicMemberFlag();
949 
950 protected:
952  DLLEXPORT ~QoreClass();
953 
954 private:
956  QoreClass& operator=(const QoreClass&) = delete;
957 
959  class qore_class_private* priv;
960 
961  // private constructor only called when the class is copied
962  DLLLOCAL QoreClass(qore_class_private* priv);
963 
964  DLLLOCAL void insertMethod(QoreMethod* o);
965  DLLLOCAL void insertStaticMethod(QoreMethod* o);
966  DLLLOCAL QoreValue evalMethodGate(QoreObject* self, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
967  DLLLOCAL const QoreMethod* parseResolveSelfMethodIntern(const char* nme);
968 
970 
979  DLLLOCAL QoreValue evalMethod(QoreObject* self, const char* method_name, const QoreListNode* args, ExceptionSink* xsink) const;
980 
981  // This function must only be called from QoreObject
982  DLLLOCAL QoreValue evalMemberGate(QoreObject* self, const QoreString *nme, ExceptionSink* xsink) const;
983  // This function must only be called from QoreObject
984  DLLLOCAL void execMemberNotification(QoreObject* self, const char* mem, ExceptionSink* xsink) const;
985  // This function must only be called from QoreObject and BCList
986  DLLLOCAL bool execDeleteBlocker(QoreObject* self, ExceptionSink* xsink) const;
987  // This function must only be called from QoreObject
988  DLLLOCAL void execDestructor(QoreObject* self, ExceptionSink* xsink) const;
989 };
990 
993 private:
994  void* priv;
995 
996 public:
997  DLLEXPORT QoreMethodIterator(const QoreClass& qc);
998  DLLEXPORT ~QoreMethodIterator();
999  DLLEXPORT bool next();
1000  DLLEXPORT const QoreMethod* getMethod() const;
1001 };
1002 
1005 private:
1006  void* priv;
1007 
1008 public:
1009  DLLEXPORT QoreStaticMethodIterator(const QoreClass& qc);
1010  DLLEXPORT ~QoreStaticMethodIterator();
1011  DLLEXPORT bool next();
1012  DLLEXPORT const QoreMethod* getMethod() const;
1013 };
1014 
1016 
1019 public:
1021  DLLLOCAL QoreClassHolder(QoreClass* c) : c(c) {
1022  }
1023 
1025  DLLEXPORT ~QoreClassHolder();
1026 
1028  DLLLOCAL operator QoreClass*() const {
1029  return c;
1030  }
1031 
1033  DLLLOCAL QoreClass* release() {
1034  auto rv = c;
1035  c = 0;
1036  return rv;
1037  }
1038 
1039 private:
1041  QoreClass* c;
1042 };
1043 
1045 class QoreBuiltinClass : public QoreClass {
1046 public:
1048  DLLEXPORT QoreBuiltinClass(const char* name, int64 n_domain = QDOM_DEFAULT);
1049 
1051  DLLEXPORT QoreBuiltinClass(const QoreBuiltinClass& old);
1052 };
1053 
1055 
1058 public:
1060  DLLEXPORT QoreParentClassIterator(const QoreClass& cls);
1061 
1063  DLLEXPORT ~QoreParentClassIterator();
1064 
1066  DLLEXPORT bool next();
1067 
1069  DLLEXPORT bool valid() const;
1070 
1072  DLLEXPORT const QoreClass& getParentClass() const;
1073 
1075  DLLEXPORT ClassAccess getAccess() const;
1076 
1077 private:
1078  std::unique_ptr<class qore_parent_class_iterator_private> priv;
1079 };
1080 
1082 
1085 public:
1087  DLLEXPORT QoreClassMemberIterator(const QoreClass& cls);
1088 
1090  DLLEXPORT ~QoreClassMemberIterator();
1091 
1093  DLLEXPORT bool next();
1094 
1096  DLLEXPORT bool valid() const;
1097 
1099  DLLEXPORT const QoreExternalNormalMember& getMember() const;
1100 
1102  DLLEXPORT const char* getName() const;
1103 
1104 private:
1105  std::unique_ptr<class qore_class_member_iterator_private> priv;
1106 };
1107 
1109 
1112 public:
1114  DLLEXPORT QoreClassStaticMemberIterator(const QoreClass& cls);
1115 
1117  DLLEXPORT ~QoreClassStaticMemberIterator();
1118 
1120  DLLEXPORT bool next();
1121 
1123  DLLEXPORT bool valid() const;
1124 
1126  DLLEXPORT const QoreExternalStaticMember& getMember() const;
1127 
1129  DLLEXPORT const char* getName() const;
1130 
1131 private:
1132  std::unique_ptr<class qore_class_static_member_iterator_private> priv;
1133 };
1134 
1136 
1139 public:
1141  DLLEXPORT QoreClassConstantIterator(const QoreClass& cls);
1142 
1144  DLLEXPORT ~QoreClassConstantIterator();
1145 
1147  DLLEXPORT bool next();
1148 
1150  DLLEXPORT bool valid() const;
1151 
1153  DLLEXPORT const QoreExternalConstant& get() const;
1154 
1155 private:
1156  std::unique_ptr<class qore_class_constant_iterator> priv;
1157 };
1158 
1160 
1165 public:
1167  DLLEXPORT QoreClassHierarchyIterator(const QoreClass& cls);
1168 
1170  DLLEXPORT ~QoreClassHierarchyIterator();
1171 
1173  DLLEXPORT bool next();
1174 
1176  DLLEXPORT bool valid() const;
1177 
1179  DLLEXPORT const QoreClass& get() const;
1180 
1182 
1184  DLLEXPORT bool isVirtual() const;
1185 
1186 private:
1187  std::unique_ptr<class qore_class_hierarchy_iterator> priv;
1188 };
1189 
1191 
1196 public:
1198  DLLEXPORT QoreClassDestructorHierarchyIterator(const QoreClass* cls);
1199 
1202 
1204  DLLEXPORT bool next();
1205 
1207  DLLEXPORT bool valid() const;
1208 
1210  DLLEXPORT const QoreClass* get() const;
1211 
1213 
1215  DLLEXPORT bool isVirtual() const;
1216 
1217 private:
1218  class qore_class_destructor_hierarchy_iterator* priv;
1219 };
1220 
1221 DLLEXPORT const char* get_access_string(ClassAccess access);
1222 
1223 #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,...
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:366
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's normal (non-static) methods.
Definition: QoreClass.h:992
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'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:386
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:346
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:378
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:221
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:1138
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:1195
allows for temporary storage of a QoreClass pointer
Definition: QoreClass.h:1018
DLLEXPORT const char * getName() const
returns the method'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:64
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:1033
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:434
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's static methods.
Definition: QoreClass.h:1004
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:81
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:1164
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
DLLEXPORT const QoreExternalConstant & get() const
returns the
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'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's API
DLLEXPORT const QoreClass * get() const
returns the parent class
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,...
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:416
DLLEXPORT const QoreClass & get() const
returns the parent class
defines a Qore-language class
Definition: QoreClass.h:237
DLLEXPORT void addDefaultBuiltinBaseClass(QoreClass *qc)
make a builtin class a child of another builtin class and ensures that the given class'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:396
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:424
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'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:446
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:1045
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:354
iterates static members of a class
Definition: QoreClass.h:1111
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:318
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...
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'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:46
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:1021
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.
DLLLOCAL QoreClass()
constructor not exported in library's API
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'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 ~QoreClass()
deletes the object and frees all memory
DLLEXPORT QoreBuiltinClass(const char *name, int64 n_domain=QDOM_DEFAULT)
creates the object and marks it as a builtin class
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 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 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:1084
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's hierachy,...
DLLEXPORT void setPublicMemberFlag()
sets the class'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'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:405
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:333
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:123
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:1057
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 ClassAccess getAccess() const
returns the access of the parent class
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:152
DLLEXPORT ~QoreClassDestructorHierarchyIterator()
destroys the object