Qore Programming Language  0.9.0
QoreClass.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreClass.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2018 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 <stdarg.h>
37 #include <string>
38 
39 // all qore class IDs
40 DLLEXPORT extern qore_classid_t CID_AUTOGATE;
41 DLLEXPORT extern qore_classid_t CID_AUTOLOCK;
42 DLLEXPORT extern qore_classid_t CID_AUTOREADLOCK;
43 DLLEXPORT extern qore_classid_t CID_AUTOWRITELOCK;
44 DLLEXPORT extern qore_classid_t CID_CONDITION;
45 DLLEXPORT extern qore_classid_t CID_COUNTER;
46 DLLEXPORT extern qore_classid_t CID_DATASOURCE;
47 DLLEXPORT extern qore_classid_t CID_DATASOURCEPOOL;
48 DLLEXPORT extern qore_classid_t CID_FILE;
49 DLLEXPORT extern qore_classid_t CID_FTPCLIENT;
50 DLLEXPORT extern qore_classid_t CID_GATE;
51 DLLEXPORT extern qore_classid_t CID_GETOPT;
52 DLLEXPORT extern qore_classid_t CID_HTTPCLIENT;
53 DLLEXPORT extern qore_classid_t CID_MUTEX;
54 DLLEXPORT extern qore_classid_t CID_PROGRAM;
55 DLLEXPORT extern qore_classid_t CID_PROGRAMDEBUG;
56 DLLEXPORT extern qore_classid_t CID_QUEUE;
57 DLLEXPORT extern qore_classid_t CID_RWLOCK;
58 DLLEXPORT extern qore_classid_t CID_SSLCERTIFICATE;
59 DLLEXPORT extern qore_classid_t CID_SSLPRIVATEKEY;
60 DLLEXPORT extern qore_classid_t CID_SEQUENCE;
61 DLLEXPORT extern qore_classid_t CID_SOCKET;
62 DLLEXPORT extern qore_classid_t CID_TERMIOS;
63 DLLEXPORT extern qore_classid_t CID_INPUTSTREAM;
64 DLLEXPORT extern qore_classid_t CID_OUTPUTSTREAM;
65 DLLEXPORT extern qore_classid_t CID_INPUTSTREAMBASE;
66 DLLEXPORT extern qore_classid_t CID_OUTPUTSTREAMBASE;
67 
68 DLLEXPORT extern QoreClass* QC_QUEUE;
69 DLLEXPORT extern QoreClass* QC_HTTPCLIENT;
70 DLLEXPORT extern QoreClass* QC_SSLCERTIFICATE;
71 DLLEXPORT extern QoreClass* QC_SSLPRIVATEKEY;
72 
73 class BCList;
74 class BCSMList;
75 class BCAList;
76 class QoreObject;
77 class QoreClass;
78 class BCEAList;
79 class ParamList;
80 class QoreMemberInfo;
81 class BuiltinMethod;
82 class AbstractQoreFunctionVariant;
83 class AbstractFunctionSignature;
84 class UserMethod;
85 class BCANode;
86 class qore_method_private;
87 class MethodFunctionBase;
88 class NamedScope;
89 class ConstantList;
90 class MethodVariantBase;
91 
97 class QoreExternalMethodFunction;
102 
104 
106 enum method_type_e {
107  MT_None = 0, // not a method function/variant
108  MT_Normal = 1,
109  MT_Static = 2,
110  MT_Constructor = 3,
111  MT_Destructor = 4,
112  MT_Copy = 5,
113  MT_Pseudo = 6,
114 };
115 
117 
120 class QoreMethod {
121  friend class StaticMethodCallNode;
122  friend class QoreObject;
123  friend class qore_class_private;
124  friend class qore_method_private;
125  friend class BCList;
126 
127 private:
129  class qore_method_private* priv;
130 
132  DLLLOCAL QoreMethod(const QoreMethod&);
133 
135  DLLLOCAL QoreMethod& operator=(const QoreMethod&);
136 
137 public:
139 
141  DLLEXPORT bool isUser() const;
142 
144 
146  DLLEXPORT bool isBuiltin() const;
147 
149 
151  DLLEXPORT bool isPrivate() const;
152 
154  DLLEXPORT ClassAccess getAccess() const;
155 
157 
160  DLLEXPORT bool isStatic() const;
161 
163 
166  DLLEXPORT const char* getName() const;
167 
169 
172  DLLEXPORT const std::string& getNameStr() const;
173 
175  DLLEXPORT const QoreClass* getClass() const;
176 
178  DLLEXPORT const char* getClassName() const;
179 
181  DLLEXPORT bool existsVariant(const type_vec_t& paramTypeInfo) const;
182 
183  /* returns the return type information for the method if it is available and if
184  there is only one return type (there can be more return types if the method is
185  overloaded)
186  */
187  DLLEXPORT const QoreTypeInfo* getUniqueReturnTypeInfo() const;
188 
190 
194  DLLEXPORT QoreValue execManaged(QoreObject* self, const QoreListNode* args, ExceptionSink* xsink) const;
195 
197 
199  DLLEXPORT method_type_e getMethodType() const;
200 
202 
204  DLLEXPORT const QoreExternalMethodFunction* getFunction() const;
205 
206  DLLLOCAL QoreMethod(const QoreClass* p_class, MethodFunctionBase* n_func, bool n_static = false);
207 
208  DLLLOCAL bool inMethod(const QoreObject* self) const;
209  DLLLOCAL QoreMethod* copy(const QoreClass* p_class) const;
210  DLLLOCAL void assign_class(const QoreClass* p_class);
211  // non-exported destructor
212  DLLLOCAL ~QoreMethod();
213 };
214 
216 
219 public:
220  DLLEXPORT virtual ~AbstractQoreClassUserData();
221 
223  virtual AbstractQoreClassUserData* copy() const = 0;
224 
226  virtual void doDeref() = 0;
227 };
228 
230 
234 class QoreClass {
235  friend class BCList;
236  friend class BCNode;
237  friend class BCSMList;
238  friend class qore_object_private;
239  friend class qore_class_private;
240  friend class QoreObject;
241  friend class BCANode;
242  friend class qore_method_private;
243  friend class QoreMethodIterator;
244  friend class QoreStaticMethodIterator;
245  friend class ConstructorMethodFunction;
246 
247 public:
249 
257  DLLEXPORT QoreClass(const char* n_name, int64 n_domain = QDOM_DEFAULT);
258 
260 
267  DLLEXPORT explicit QoreClass(const char* n_name, int n_domain);
268 
270 
277  DLLEXPORT QoreClass(const char* n_name, int64 n_domain, const QoreTypeInfo* n_typeInfo);
278 
280 
282  DLLEXPORT QoreClass(const QoreClass &old);
283 
285 
314  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, ...);
315 
317 
351  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());
352 
354  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, ...);
355 
357 
359  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());
360 
362  DLLEXPORT void addAbstractMethod(const char* n_name, ClassAccess access = Public, int64 n_flags = QCF_NO_FLAGS, const QoreTypeInfo* returnTypeInfo = 0, unsigned num_params = 0, ...);
363 
365  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());
366 
368 
379  DLLEXPORT void setDestructor(q_destructor_t m);
380 
382 
394  DLLEXPORT void setDestructor(const void* ptr, q_external_destructor_t m);
395 
397  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, ...);
398 
400 
402  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());
403 
405 
409 
411 
422  DLLEXPORT void setCopy(q_copy_t m);
423 
425 
437  DLLEXPORT void setCopy(const void* ptr, q_external_copy_t m);
438 
440 
448  DLLEXPORT void setDeleteBlocker(q_delete_blocker_t m);
449 
451 
455  DLLEXPORT void setSerializer(q_serializer_t m);
456 
458 
462  DLLEXPORT void setDeserializer(q_deserializer_t m);
463 
465 
467  DLLEXPORT q_serializer_t getSerializer() const;
468 
470 
472  DLLEXPORT q_deserializer_t getDeserializer() const;
473 
475  DLLEXPORT void setFinal();
476 
478 
482  DLLEXPORT bool isPrivateMember(const char* str) const;
483 
485 
490  DLLEXPORT bool isPublicOrPrivateMember(const char* str, bool& priv) const;
491 
493 
499  DLLEXPORT QoreObject* execConstructor(const QoreListNode* args, ExceptionSink* xsink) const;
500 
502 
509  DLLEXPORT QoreObject* execConstructorVariant(const QoreExternalMethodVariant* mv, const QoreListNode *arsg, ExceptionSink* xsink) const;
510 
512 
516  DLLEXPORT QoreObject* execSystemConstructor(int code = 0, ...) const;
517 
519 
523  DLLEXPORT QoreObject* execCopy(QoreObject* old, ExceptionSink* xsink) const;
524 
526 
529  DLLEXPORT QoreListNode* getMethodList() const;
530 
532 
535  DLLEXPORT QoreListNode* getStaticMethodList() const;
536 
538 
546  DLLEXPORT QoreClass* getClass(qore_classid_t cid) const;
547 
549 
556  DLLEXPORT const QoreClass* getClass(qore_classid_t cid, bool& priv) const;
557 
559 
566  DLLEXPORT const QoreClass* getClass(const QoreClass& qc, bool& priv) const;
567 
569  DLLEXPORT int numMethods() const;
570 
572  DLLEXPORT int numStaticMethods() const;
573 
575  DLLEXPORT int numUserMethods() const;
576 
578  DLLEXPORT int numStaticUserMethods() const;
579 
581  DLLEXPORT bool hasCopy() const;
582 
584  DLLEXPORT qore_classid_t getID() const;
585 
587  DLLEXPORT bool isSystem() const;
588 
590 
592  DLLEXPORT bool isModulePublic() const;
593 
595 
597  DLLEXPORT bool isAbstract() const;
598 
600 
602  DLLEXPORT bool isFinal() const;
603 
605 
607  DLLEXPORT bool isInjected() const;
608 
610 
612  DLLEXPORT bool isPseudoClass() const;
613 
615 
619  DLLEXPORT qore_type_t getPseudoClassType() const;
620 
622 
626  DLLEXPORT QoreValue evalPseudoMethod(const QoreValue n, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
627 
629 
643  DLLEXPORT QoreValue evalPseudoMethod(const QoreMethod* m, const QoreExternalMethodVariant* variant, const QoreValue n, const QoreListNode* args, ExceptionSink* xsink) const;
644 
646  DLLEXPORT void setSystem();
647 
649  DLLEXPORT bool hasMemberGate() const;
650 
652  DLLEXPORT bool hasMethodGate() const;
653 
655  DLLEXPORT bool hasMemberNotification() const;
656 
658 
660  DLLEXPORT int64 getDomain() const;
661 
663  DLLEXPORT const char* getName() const;
664 
666 
670  DLLEXPORT const QoreMethod* findMethod(const char* nme) const;
671 
673 
677  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme) const;
678 
680 
684  DLLEXPORT const QoreMethod* findMethod(const char* nme, ClassAccess& access) const;
685 
687 
691  DLLEXPORT const QoreMethod* findStaticMethod(const char* nme, ClassAccess& access) const;
692 
694 
698  DLLEXPORT const QoreMethod* findLocalMethod(const char* name) const;
699 
701 
705  DLLEXPORT const QoreMethod* findLocalStaticMethod(const char* name) const;
706 
708 
711  DLLEXPORT void addBuiltinBaseClass(QoreClass* qc);
712 
714 
719  DLLEXPORT void addDefaultBuiltinBaseClass(QoreClass* qc);
720 
722 
728  DLLEXPORT void addBuiltinVirtualBaseClass(QoreClass* qc);
729 
731 
733  DLLEXPORT void setSynchronousClass();
734 
736 
739  DLLEXPORT const QoreMethod* getConstructor() const;
740 
742 
745  DLLEXPORT const QoreMethod* getSystemConstructor() const;
746 
748 
751  DLLEXPORT const QoreMethod* getDestructor() const;
752 
754 
757  DLLEXPORT const QoreMethod* getCopyMethod() const;
758 
760 
763  DLLEXPORT const QoreMethod* getMemberGateMethod() const;
764 
766 
769  DLLEXPORT const QoreMethod* getMethodGate() const;
770 
772 
775  DLLEXPORT const QoreMethod* getMemberNotificationMethod() const;
776 
778  DLLEXPORT const QoreTypeInfo* getTypeInfo() const;
779 
781  DLLEXPORT const QoreTypeInfo* getOrNothingTypeInfo() const;
782 
784  DLLEXPORT void addMember(const char* mem, ClassAccess access, const QoreTypeInfo* n_typeInfo, QoreValue initial_value = QoreValue());
785 
787 
789  DLLEXPORT void setUserData(const void* ptr);
790 
792 
794  DLLEXPORT const void* getUserData() const;
795 
797 
799  DLLEXPORT void setManagedUserData(AbstractQoreClassUserData* cud);
800 
802 
805 
807 
809  template <typename T>
810  DLLLOCAL T* getManagedUserData() const {
811  return static_cast<T*>(getManagedUserData());
812  }
813 
815  DLLEXPORT void recheckBuiltinMethodHierarchy();
816 
818 
820  DLLEXPORT const QoreExternalMethodVariant* findUserMethodVariant(const char* name, const QoreMethod*& method, const type_vec_t& argTypeList) const;
821 
823 
828  DLLEXPORT void addBuiltinConstant(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
829 
831 
836  DLLEXPORT void addBuiltinStaticVar(const char* name, QoreValue value, ClassAccess access = Public, const QoreTypeInfo* typeInfo = nullptr);
837 
839 
845  DLLEXPORT void rescanParents();
846 
848 
850  DLLEXPORT void setPublicMemberFlag();
851 
853 
855  DLLEXPORT void setGateAccessFlag();
856 
858 
860  DLLEXPORT const QoreExternalNormalMember* findLocalMember(const char* name) const;
861 
863 
865  DLLEXPORT const QoreExternalStaticMember* findLocalStaticMember(const char* name) const;
866 
868 
872  DLLEXPORT std::string getNamespacePath(bool anchored = false) const;
873 
875 
877  DLLEXPORT bool isEqual(const QoreClass& cls) const;
878 
880 
882  DLLEXPORT BinaryNode* getBinaryHash() const;
883 
885 
887  DLLEXPORT int runtimeCheckInstantiateClass(ExceptionSink* xsink) const;
888 
890 
892  DLLEXPORT const QoreExternalConstant* findConstant(const char* name) const;
893 
895 
897  DLLEXPORT const QoreNamespace* getNamespace() const;
898 
900 
902  DLLEXPORT bool inHierarchy(const QoreClass& cls, ClassAccess& n_access) const;
903 
905 
907  DLLEXPORT bool hasTransientMember() const;
908 
910 
912  DLLEXPORT const char* getModuleName() const;
913 
915  DLLLOCAL QoreClass();
916 
917  // used when parsing, finds committed non-static methods within the entire class hierarchy (local class plus base classes)
918  DLLLOCAL const QoreMethod* parseFindCommittedMethod(const char* nme);
919 
920  // returns 0 for success, -1 for error
921  DLLLOCAL int parseAddBaseClassArgumentList(BCAList* bcal);
922  // only called when parsing, sets the name of the class
923  DLLLOCAL void setName(const char* n);
924 
925  DLLLOCAL qore_classid_t getIDForMethod() const;
926  // get base class list to add virtual class indexes for private data
927  DLLLOCAL BCSMList* getBCSMList() const;
928  // returns true if the class has a delete_blocker function (somewhere in the hierarchy)
929  DLLLOCAL bool has_delete_blocker() const;
930 
931  DLLLOCAL bool parseHasPublicMembersInHierarchy() const;
932  DLLLOCAL bool runtimeHasPublicMembersInHierarchy() const;
933 
934  // returns true if the class has one or more parent classes
935  DLLLOCAL bool hasParentClass() const;
936  DLLLOCAL bool hasPrivateCopyMethod() const;
937  // returns the status including the pending variant (if any)
938  DLLLOCAL bool parseHasPrivateCopyMethod() const;
939  DLLLOCAL const QoreMethod* parseGetConstructor() const;
940  // returns true if the class implements a "methodGate" method, also in pending uncommitted methods
941  DLLLOCAL bool parseHasMethodGate() const;
942  // called when there is an empty public member declaration or a "no_public" declaration
943  DLLLOCAL void parseSetEmptyPublicMemberDeclaration();
944  // unsets the public member flag for builtin classes
945  DLLLOCAL void unsetPublicMemberFlag();
946 
947 protected:
949  DLLEXPORT ~QoreClass();
950 
951 private:
953  QoreClass& operator=(const QoreClass&) = delete;
954 
956  class qore_class_private* priv;
958  class qore_class_private_local* priv_local;
959 
960  // private constructor only called when the class is copied
961  DLLLOCAL QoreClass(qore_class_private* priv);
962 
963  DLLLOCAL void insertMethod(QoreMethod* o);
964  DLLLOCAL void insertStaticMethod(QoreMethod* o);
965  DLLLOCAL QoreValue evalMethodGate(QoreObject* self, const char* nme, const QoreListNode* args, ExceptionSink* xsink) const;
966  DLLLOCAL const QoreMethod* parseResolveSelfMethodIntern(const char* nme);
967 
969 
978  DLLLOCAL QoreValue evalMethod(QoreObject* self, const char* method_name, const QoreListNode* args, ExceptionSink* xsink) const;
979 
980  // This function must only be called from QoreObject
981  DLLLOCAL QoreValue evalMemberGate(QoreObject* self, const QoreString *nme, ExceptionSink* xsink) const;
982  // This function must only be called from QoreObject
983  DLLLOCAL void execMemberNotification(QoreObject* self, const char* mem, ExceptionSink* xsink) const;
984  // This function must only be called from QoreObject and BCList
985  DLLLOCAL bool execDeleteBlocker(QoreObject* self, ExceptionSink* xsink) const;
986  // This function must only be called from QoreObject
987  DLLLOCAL void execDestructor(QoreObject* self, ExceptionSink* xsink) const;
988 };
989 
992 private:
993  void* priv;
994 
995 public:
996  DLLEXPORT QoreMethodIterator(const QoreClass* qc);
997  DLLEXPORT ~QoreMethodIterator();
998  DLLEXPORT bool next();
999  DLLEXPORT const QoreMethod* getMethod() const;
1000 };
1001 
1004 private:
1005  void* priv;
1006 
1007 public:
1008  DLLEXPORT QoreStaticMethodIterator(const QoreClass* qc);
1009  DLLEXPORT ~QoreStaticMethodIterator();
1010  DLLEXPORT bool next();
1011  DLLEXPORT const QoreMethod* getMethod() const;
1012 };
1013 
1015 
1018 public:
1020  DLLLOCAL QoreClassHolder(QoreClass* c) : c(c) {
1021  }
1022 
1024  DLLEXPORT ~QoreClassHolder();
1025 
1027  DLLLOCAL operator QoreClass*() const {
1028  return c;
1029  }
1030 
1032  DLLLOCAL QoreClass* release() {
1033  auto rv = c;
1034  c = 0;
1035  return rv;
1036  }
1037 
1038 private:
1040  QoreClass* c;
1041 };
1042 
1044 class QoreBuiltinClass : public QoreClass {
1045 public:
1047  DLLEXPORT QoreBuiltinClass(const char* name, int64 n_domain = QDOM_DEFAULT);
1048 
1050  DLLEXPORT QoreBuiltinClass(const QoreBuiltinClass& old);
1051 };
1052 
1054 
1057 public:
1059  DLLEXPORT QoreParentClassIterator(const QoreClass* cls);
1060 
1062  DLLEXPORT ~QoreParentClassIterator();
1063 
1065  DLLEXPORT bool next();
1066 
1068  DLLEXPORT bool valid() const;
1069 
1071  DLLEXPORT const QoreClass* getParentClass() const;
1072 
1074  DLLEXPORT ClassAccess getAccess() const;
1075 
1076 private:
1077  class qore_parent_class_iterator_private* priv;
1078 };
1079 
1081 
1084 public:
1086  DLLEXPORT QoreClassMemberIterator(const QoreClass* cls);
1087 
1089  DLLEXPORT ~QoreClassMemberIterator();
1090 
1092  DLLEXPORT bool next();
1093 
1095  DLLEXPORT bool valid() const;
1096 
1098  DLLEXPORT const QoreExternalNormalMember* getMember() const;
1099 
1101  DLLEXPORT const char* getName() const;
1102 
1103 private:
1104  class qore_class_member_iterator_private* priv;
1105 };
1106 
1108 
1111 public:
1113  DLLEXPORT QoreClassStaticMemberIterator(const QoreClass* cls);
1114 
1116  DLLEXPORT ~QoreClassStaticMemberIterator();
1117 
1119  DLLEXPORT bool next();
1120 
1122  DLLEXPORT bool valid() const;
1123 
1125  DLLEXPORT const QoreExternalStaticMember* getMember() const;
1126 
1128  DLLEXPORT const char* getName() const;
1129 
1130 private:
1131  class qore_class_static_member_iterator_private* priv;
1132 };
1133 
1135 
1138 public:
1140  DLLEXPORT QoreClassConstantIterator(const QoreClass* cls);
1141 
1143  DLLEXPORT ~QoreClassConstantIterator();
1144 
1146  DLLEXPORT bool next();
1147 
1149  DLLEXPORT bool valid() const;
1150 
1152  DLLEXPORT const QoreExternalConstant* get() const;
1153 
1154 private:
1155  class qore_class_constant_iterator* priv;
1156 };
1157 
1159 
1164 public:
1166  DLLEXPORT QoreClassHierarchyIterator(const QoreClass* cls);
1167 
1169  DLLEXPORT ~QoreClassHierarchyIterator();
1170 
1172  DLLEXPORT bool next();
1173 
1175  DLLEXPORT bool valid() const;
1176 
1178  DLLEXPORT const QoreClass* get() const;
1179 
1181 
1183  DLLEXPORT bool isVirtual() const;
1184 
1185 private:
1186  class qore_class_hierarchy_iterator* priv;
1187 };
1188 
1190 
1195 public:
1197  DLLEXPORT QoreClassDestructorHierarchyIterator(const QoreClass* cls);
1198 
1201 
1203  DLLEXPORT bool next();
1204 
1206  DLLEXPORT bool valid() const;
1207 
1209  DLLEXPORT const QoreClass* get() const;
1210 
1212 
1214  DLLEXPORT bool isVirtual() const;
1215 
1216 private:
1217  class qore_class_destructor_hierarchy_iterator* priv;
1218 };
1219 
1220 DLLEXPORT const char* get_access_string(ClassAccess access);
1221 
1222 #endif // _QORE_QORECLASS_H
DLLEXPORT const QoreExternalStaticMember * getMember() const
returns the member
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 void setUserData(const void *ptr)
sets a pointer to user-specific data in the class
DLLEXPORT QoreClassConstantIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
DLLEXPORT QoreClassHierarchyIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
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&#39;s normal (non-static) methods.
Definition: QoreClass.h:991
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 const QoreNamespace * getNamespace() const
Returns the namespace that owns this class.
DLLEXPORT const QoreExternalNormalMember * getMember() const
returns the member
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 QoreParentClassIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
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:218
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:1137
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:1194
allows for temporary storage of a QoreClass pointer
Definition: QoreClass.h:1017
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:1032
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 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:1003
Qore&#39;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:1163
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 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 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:416
defines a Qore-language class
Definition: QoreClass.h:234
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: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&#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: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:1044
DLLEXPORT QoreClassMemberIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
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:1110
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&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:61
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:1020
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 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&#39;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 QoreObject * execConstructorVariant(const QoreExternalMethodVariant *mv, const QoreListNode *arsg, ExceptionSink *xsink) const
creates a new object and executes the constructor on it and returns the new object ...
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 ~QoreClass()
deletes the object and frees all memory
DLLEXPORT const QoreClass * getParentClass() const
returns the parent class
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:1083
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: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:120
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 QoreClassStaticMemberIterator(const QoreClass *cls)
creates the iterator; call next() to start iterating
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:1056
DLLEXPORT bool hasTransientMember() const
Returns true if the class has at least one locally-declared transient member.
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