00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #ifndef INC_SML_CLASS_H
00067 #define INC_SML_CLASS_H
00068
00069 #ifndef INC_SML_CLASSMEMBER_H
00070 #include <sml/classmember.h>
00071 #endif
00072
00073 #ifndef INC_SML_CONTEXTTYPE_H
00074 #include <sml/contexttype.h>
00075 #endif
00076
00077 #ifndef INC_SML_FUNCTION_H
00078 #include <sml/function.h>
00079 #endif
00080
00081 #ifndef INC_SML_RESTRICTION_H
00082 #include <sml/restriction.h>
00083 #endif
00084
00085 #ifndef INC_MI32_MISTRINGLIST_H
00086 #include <mi32/mistringlist.h>
00087 #endif
00088
00089 #ifndef INC_MI32_MICALLBACKLIST_H
00090 #include <mi32/micallbacklist.h>
00091 #endif
00092
00093 #ifdef RVCSYSDLL
00094 #define RVCSYSLIBEXPORT MI_DLLEXPORT
00095 #define RVCSYSLIBCLASSEXPORT MI_DLLCLASSEXPORT
00096 #else
00097 #define RVCSYSLIBEXPORT MI_DLLIMPORT
00098 #define RVCSYSLIBCLASSEXPORT MI_DLLCLASSIMPORT
00099 #endif
00100
00101
00102 namespace SML {
00103 class CLASSAUTOREG;
00104 class CLASSHASH;
00105 class AUTOCLASS;
00106
00107
00111 class CLASS {
00112 public:
00113 const char *name;
00114 const char *BaseClassName;
00115 CLASSMEMBER *members;
00116
00123 void *(*Constructor)(void *data, CONTEXT *context, CLASS *);
00124
00131 void *(*Destructor)(void *data, CONTEXT *context, CLASS*);
00132
00141 void *(*CopyConstructor)(void *src, CONTEXT *context, CLASS*, void* dest);
00142
00144 void GenerateBuilderText (
00145 MISTRING& code,
00146 const MISTRING& name,
00147 const MISTRINGLIST& ParamList
00148 ) { GenerateBuilderTextFunc(code, name, ParamList); }
00149
00151 void (*GenerateBuilderTextFunc)(MISTRING& code, const MISTRING& name, const MISTRINGLIST& ParamList);
00152
00153 int size;
00154 INT32 CreateDate;
00155 INT32 ModDate;
00156 const char *description;
00157 CLASS *next;
00158 CLASS *BaseClass;
00159 #ifndef GENERATING_DOXYGEN_OUTPUT
00160 INT8 Deprecated;
00161 #endif // GENERATING_DOXYGEN_OUTPUT
00162 INT8 NotInWin32Native;
00163 #ifndef GENERATING_DOXYGEN_OUTPUT
00164 INT8 SpareByte1;
00165 INT8 SpareByte2;
00166 #endif // GENERATING_DOXYGEN_OUTPUT
00167 int OffsetToNext;
00168 void *privdata;
00169 int sizeofSMLCLASS;
00170 int sizeofSMLCLASSMEMBER;
00171 void (*UninstallClass)(CLASS*);
00172 const RESTRICTION* m_Restriction;
00173
00174 };
00175
00176
00177
00178
00216 class RVCSYSLIBCLASSEXPORT AUTOCLASS {
00217 public:
00218
00223 DEPRECATED AUTOCLASS (
00224 void (*SetupFunc)(),
00225 CONTEXTTYPE ContextTypesToAllow,
00226 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00227 ) :
00228 m_bIsSetup(false),
00229 m_bIsRegistered(false),
00230 m_SetupFunc(SetupFunc),
00231 m_ContextType((CONTEXTTYPE)(ContextTypesToAllow & ~ContextTypesToDisallow))
00232 {
00233 ::memset(&m_class, 0, sizeof(CLASS));
00234 m_class.sizeofSMLCLASS = sizeof(CLASS);
00235 m_class.sizeofSMLCLASSMEMBER = sizeof(CLASSMEMBER);
00236 m_class.m_Restriction = &m_Restriction;
00237 m_class.size = 0;
00238 m_class.Constructor = NULL;
00239 m_class.Destructor = NULL;
00240 m_class.CopyConstructor = NULL;
00241 m_class.GenerateBuilderTextFunc = NULL;
00242 RegisterSelf();
00243 }
00244
00249 AUTOCLASS (
00250 void (*SetupFunc)()
00251 ) :
00252 m_bIsSetup(false),
00253 m_bIsRegistered(false),
00254 m_SetupFunc(SetupFunc),
00255 m_ContextType(CONTEXTTYPE_ANY)
00256 {
00257 ::memset(&m_class, 0, sizeof(CLASS));
00258 m_class.sizeofSMLCLASS = sizeof(CLASS);
00259 m_class.sizeofSMLCLASSMEMBER = sizeof(CLASSMEMBER);
00260 m_class.m_Restriction = &m_Restriction;
00261 m_class.size = 0;
00262 m_class.Constructor = NULL;
00263 m_class.Destructor = NULL;
00264 m_class.CopyConstructor = NULL;
00265 m_class.GenerateBuilderTextFunc = NULL;
00266 RegisterSelf();
00267 }
00268
00270 virtual ~AUTOCLASS();
00271
00275 void AddMethodOld (
00276 const char* name,
00277 const char* RetClass,
00278 CLASSHASH* (*func)(int, ARG*, UINT8*, CONTEXT*),
00279 PARM* parms,
00280 int CreateDate = 0,
00281 int ModDate = 0,
00282 bool bInWin32Native = true,
00283 bool bInX = true,
00284 bool bReturnIsAllocated = true,
00285 bool bRequired = false
00286 );
00287
00289 void AddMethodOld (
00290 const char* name,
00291 const char* RetClass,
00292 bool bReturnIsAllocated,
00293 void* (*func)(int, ARG*, UINT8*, CONTEXT*),
00294 PARM* parms,
00295 int CreateDate = 0,
00296 int ModDate = 0,
00297 bool bInWin32Native = true,
00298 bool bInX = true,
00299 bool bRequired = false
00300 );
00301
00303 void AddMethodOldCB (
00304 const char* name,
00305 const char* RetClass,
00306 bool bReturnIsAllocated,
00307 void* (*func)(int, ARG*, UINT8*, CONTEXT*),
00308 PARM* parms,
00309 int CreateDate = 0,
00310 int ModDate = 0,
00311 bool bInWin32Native = true,
00312 bool bInX = true,
00313 bool bRequired = false
00314 );
00315
00317 void AddMethodOld (
00318 const char* name,
00319 void (*func)(int, ARG*, UINT8*, CONTEXT*),
00320 PARM* parms,
00321 int CreateDate = 0,
00322 int ModDate = 0,
00323 bool bInWin32Native = true,
00324 bool bInX = true,
00325 bool bRequired = false
00326 );
00327
00333 void AddMethodOldCB (
00334 const char* name,
00335 void (*func)(int, ARG*, UINT8*, CONTEXT*),
00336 PARM* parms,
00337 int CreateDate = 0,
00338 int ModDate = 0,
00339 bool bInWin32Native = true,
00340 bool bInX = true,
00341 bool bRequired = false
00342 );
00343
00344
00346 void AddMethodOld (
00347 const char* name,
00348 STRING* (*func)(int, ARG*, UINT8*, CONTEXT*),
00349 PARM* parms,
00350 int CreateDate = 0,
00351 int ModDate = 0,
00352 bool bInWin32Native = true,
00353 bool bInX = true,
00354 bool bRequired = false
00355 );
00356
00358 void AddMethodOld (
00359 const char* name,
00360 double (*func)(int, ARG*, UINT8*, CONTEXT*),
00361 PARM* parms,
00362 int CreateDate = 0,
00363 int ModDate = 0,
00364 bool bInWin32Native = true,
00365 bool bInX = true,
00366 bool bRequired = false
00367 );
00368
00371 void AddMember (
00372 const CLASSMEMBER& member
00373 );
00374
00378 void AddMembers (
00379 const CLASSMEMBER* members
00380 );
00381
00383 void Init (
00384 const char* ClassName,
00385 const char* BaseClassName = 0,
00386 int CreateDate = 0
00387 );
00388
00390 void GenerateBuilderText (
00391 MISTRING& code,
00392 const MISTRING& name,
00393 const MISTRINGLIST& ParamList
00394 ) { m_class.GenerateBuilderTextFunc(code, name, ParamList); }
00395
00397 void SetGenerateBuilderTextFunc (
00398 void (*GenerateBuilderTextFunc)(MISTRING& code, const MISTRING& name, const MISTRINGLIST& ParamList)
00399 );
00400
00427 void SetConstructor (
00428 void* (*constructor)(void* data, CONTEXT* context, CLASS* smlclass),
00429 int size = 0
00430 );
00431
00434 void SetCopyConstructor (
00435 void* (*copyconstructor)(void* data, CONTEXT* context, CLASS* smlclass, void*)
00436 );
00437
00439 void SetDeprecated (
00440 ) { m_class.Deprecated = 1; }
00441
00442 void SetDestructor (
00443 void* (*destructor)(void* data, CONTEXT* context, CLASS* smlclass)
00444 );
00445
00450 void SetNoWin32Native() {
00451 m_class.NotInWin32Native = true;
00452 }
00453
00458 void SetSize (
00459 int size
00460 ) { m_class.size = size; }
00461
00462 #ifndef GENERATING_DOXYGEN_OUTPUT
00464 static int InstallAutoClasses (
00465 CONTEXT* context,
00466 CONTEXTTYPE contexttype
00467 );
00468 #endif
00469
00470
00471
00472
00473
00474 static const CLASSMEMBER* FindMember (
00475 const char* ClassName,
00476 const char* MemberName
00477 );
00478
00481 RESTRICTION& GetRestrictions (
00482 ) { return (m_Restriction); }
00483
00484 protected:
00485 #ifndef GENERATING_DOXYGEN_OUTPUT
00488
00489 virtual void SetNewAndDelete() = 0;
00490
00491 void AddMethodLow (
00492 const char* name,
00493 SMLFUNCSIG sig,
00494 METHODPTR func,
00495 PARM* parms,
00496 int CreateDate = 0,
00497 int ModDate = 0,
00498 const char* ClassName = 0,
00499 bool bInWin32Native = true,
00500 bool bInX = true,
00501 bool bRequired = false
00502 );
00503
00505 void SetMinimumProduct (
00506 MIPRODUCTCODE ProductCode
00507 ) { m_Restriction.AddProduct(ProductCode); }
00508
00509 private:
00510 void RegisterSelf();
00511 void FinishSetup();
00512
00513 void (*m_SetupFunc)();
00514 SIMPLE_ARRAY<CLASSMEMBER> m_members;
00515 SIMPLE_ARRAY<FUNC> m_methods;
00516 CONTEXTTYPE m_ContextType;
00517 bool m_bIsSetup;
00518 bool m_bIsRegistered;
00519 CLASS m_class;
00520 RESTRICTION m_Restriction;
00521 #endif // GENERATING_DOXYGEN_OUTPUT
00522 };
00523
00524
00525
00526
00533 template <class _TYPE> class AUTOCLASS_NOALLOC_T : public AUTOCLASS {
00534 public:
00535
00540 AUTOCLASS_NOALLOC_T (
00541 void (*SetupFunc)()
00542 ) :
00543 AUTOCLASS (SetupFunc)
00544 {
00545 }
00546
00551 AUTOCLASS_NOALLOC_T (
00552 void (*SetupFunc)(),
00553 CONTEXTTYPE ContextTypesToAllow,
00554 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00555 ) :
00556 AUTOCLASS (SetupFunc, ContextTypesToAllow, ContextTypesToDisallow)
00557 {
00558 }
00559
00560 typedef void (_TYPE::*VOIDMETHOD)();
00561
00592 void AddMethod (
00593 const char* name,
00594 SMLFUNCSIG sig,
00595 void (_TYPE::*func)(),
00596 PARM* parms,
00597 int CreateDate = 0,
00598 int ModDate = 0,
00599 const char* ClassName = 0,
00600 bool bInWin32Native = true,
00601 bool bInX = true,
00602 bool bRequired = false
00603 ) {
00604 union {
00605 void (_TYPE::*cfunc)();
00606 METHODPTR vfunc;
00607 } x;
00608 ::memset(&x, 0, sizeof(x));
00609 x.cfunc = func;
00610 AddMethodLow(name, sig, x.vfunc, parms, CreateDate, ModDate, ClassName, bInWin32Native, bInX, bRequired);
00611 }
00612
00613 #ifndef GENERATING_DOXYGEN_OUTPUT
00614 protected:
00615
00618 virtual void SetNewAndDelete () {
00619 }
00620 #endif
00621
00622 };
00623
00624
00628 template <class _TYPE> class AUTOCLASS_NEW_T : public AUTOCLASS_NOALLOC_T<_TYPE> {
00629 public:
00634 AUTOCLASS_NEW_T (
00635 void (*SetupFunc)()
00636 ) :
00637 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc)
00638 {
00639 }
00640
00645 AUTOCLASS_NEW_T (
00646 void (*SetupFunc)(),
00647 CONTEXTTYPE ContextTypesToAllow,
00648 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00649 ) :
00650 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc, ContextTypesToAllow, ContextTypesToDisallow)
00651 {
00652 }
00653
00654 #ifndef GENERATING_DOXYGEN_OUTPUT
00655 protected:
00656
00658 virtual void SetNewAndDelete (
00659 ) {
00660 SetConstructor(Constructor);
00661 SetDestructor(Destructor);
00662 SetCopyConstructor(CopyConstructor);
00663 }
00664
00665 static void* Constructor(void*, CONTEXT*, CLASS*) {
00666 return new _TYPE;
00667 }
00668
00669 static void* Destructor(void* vptr, CONTEXT*, CLASS*) {
00670 _TYPE* ptr = static_cast<_TYPE*>(vptr);
00671 delete ptr;
00672 return 0;
00673 }
00674
00675 static void* CopyConstructor(void* vrhs, CONTEXT*, CLASS*, void*vdest) {
00676 _TYPE* rhs = static_cast<_TYPE*>(vrhs);
00677 if (vdest != 0) {
00678 _TYPE* dest = static_cast<_TYPE*>(vdest);
00679 if (rhs == 0) *dest = _TYPE();
00680 else *dest = *rhs;
00681 return dest;
00682 }
00683 if (rhs == 0) return new _TYPE;
00684 return new _TYPE(*rhs);
00685 }
00686 #endif
00687 };
00688
00692 template <class _TYPE> class AUTOCLASS_NEW_NOCOPY_T : public AUTOCLASS_NOALLOC_T<_TYPE> {
00693 public:
00698 AUTOCLASS_NEW_NOCOPY_T (
00699 void (*SetupFunc)()
00700 ) :
00701 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc)
00702 {
00703 }
00704
00709 AUTOCLASS_NEW_NOCOPY_T (
00710 void (*SetupFunc)(),
00711 CONTEXTTYPE ContextTypesToAllow,
00712 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00713 ) :
00714 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc, ContextTypesToAllow, ContextTypesToDisallow)
00715 {
00716 }
00717
00718 #ifndef GENERATING_DOXYGEN_OUTPUT
00719 protected:
00720
00721 virtual void SetNewAndDelete (
00722 ) {
00723 SetConstructor(Constructor);
00724 SetDestructor(Destructor);
00725 }
00726
00727 static void* Constructor(void*, CONTEXT*, CLASS*) {
00728 return new _TYPE;
00729 }
00730
00731 static void* Destructor(void* vptr, CONTEXT*, CLASS*) {
00732 _TYPE* ptr = static_cast<_TYPE*>(vptr);
00733 delete ptr;
00734 return 0;
00735 }
00736 #endif
00737
00738 };
00739
00743 template <class _TYPE> class AUTOCLASS_DELETABLE_NOCOPY_T : public AUTOCLASS_NOALLOC_T<_TYPE> {
00744 public:
00749 AUTOCLASS_DELETABLE_NOCOPY_T (
00750 void (*SetupFunc)()
00751 ) :
00752 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc)
00753 {
00754 }
00755
00760 AUTOCLASS_DELETABLE_NOCOPY_T (
00761 void (*SetupFunc)(),
00762 CONTEXTTYPE ContextTypesToAllow,
00763 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00764 ) :
00765 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc, ContextTypesToAllow, ContextTypesToDisallow)
00766 {
00767 }
00768 #ifndef GENERATING_DOXYGEN_OUTPUT
00769 protected:
00770
00771 virtual void SetNewAndDelete (
00772 ) {
00773 SetDestructor(Destructor);
00774 }
00775
00776 static void* Destructor(void* vptr, CONTEXT*, CLASS*) {
00777 _TYPE* ptr = static_cast<_TYPE*>(vptr);
00778 delete ptr;
00779 return 0;
00780 }
00781
00782 #endif
00783
00784 };
00785
00790 template <class _TYPE> class AUTOCLASS_DELETABLE_T : public AUTOCLASS_NOALLOC_T<_TYPE> {
00791 public:
00796 AUTOCLASS_DELETABLE_T (
00797 void (*SetupFunc)()
00798 ) :
00799 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc)
00800 {
00801 }
00802
00807 AUTOCLASS_DELETABLE_T (
00808 void (*SetupFunc)(),
00809 CONTEXTTYPE ContextTypesToAllow,
00810 CONTEXTTYPE ContextTypesToDisallow = CONTEXTTYPE_NONE
00811 ) :
00812 AUTOCLASS_NOALLOC_T<_TYPE>(SetupFunc, ContextTypesToAllow, ContextTypesToDisallow)
00813 {
00814 }
00815
00816 #ifndef GENERATING_DOXYGEN_OUTPUT
00817 protected:
00818
00819 virtual void SetNewAndDelete (
00820 ) {
00821 SetDestructor(Destructor);
00822 SetCopyConstructor(CopyConstructor);
00823 }
00824
00825 static void* Destructor(void* vptr, CONTEXT*, CLASS*) {
00826 _TYPE* ptr = static_cast<_TYPE*>(vptr);
00827 delete ptr;
00828 return 0;
00829 }
00830
00831 static void* CopyConstructor(void* vrhs, CONTEXT*, CLASS*, void*vdest) {
00832 _TYPE* rhs = static_cast<_TYPE*>(vrhs);
00833 if (vdest != 0) {
00834 _TYPE* dest = static_cast<_TYPE*>(vdest);
00835 if (rhs == 0) return (NULL);
00836 else *dest = *rhs;
00837 return dest;
00838 }
00839 if (rhs == 0) return (NULL);
00840 return new _TYPE(*rhs);
00841 }
00842 #endif
00843
00844 };
00845
00846 }
00847
00848
00849 typedef SML::CLASS SMLCLASS;
00850 typedef SML::AUTOCLASS SMLAUTOCLASS;
00851
00852 #define SMLAUTOCLASS_NOALLOC_T SML::AUTOCLASS_NOALLOC_T
00853 #define SMLAUTOCLASS_NEW_T SML::AUTOCLASS_NEW_T
00854 #define SMLAUTOCLASS_NEW_NOCOPY_T SML::AUTOCLASS_NEW_NOCOPY_T
00855 #define SMLAUTOCLASS_DELETABLE_NOCOPY_T SML::AUTOCLASS_DELETABLE_NOCOPY_T
00856 #define SMLAUTOCLASS_DELETABLE_T SML::AUTOCLASS_DELETABLE_T
00857
00858 #undef RVCSYSLIBEXPORT
00859 #undef RVCSYSLIBCLASSEXPORT
00860
00861 #endif // INC_SML_CLASS_H
00862
00863