home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / ocfinc.pak / AUTOMACR.H < prev    next >
C/C++ Source or Header  |  1997-07-23  |  37KB  |  753 lines

  1. //
  2. //----------------------------------------------------------------------------
  3. // ObjectComponents
  4. // (C) Copyright 1994 by Borland International, All Rights Reserved
  5. //
  6. //   Automation Symbol Table, Command, and Proxy Macro Definitions
  7. //----------------------------------------------------------------------------
  8. #if !defined(OCF_AUTOMACR_H)
  9. #define OCF_AUTOMACR_H
  10.  
  11. #if !defined(OCF_AUTODEFS_H)
  12. # include <ocf/autodefs.h>
  13. #endif
  14.  
  15. // suppress "Functions taking class-by-value arg(s) are not expanded inline"
  16. #pragma warn -inl
  17.  
  18. //____________________________________________________________________________
  19. //
  20. // Macros for defining symbol tables
  21. //____________________________________________________________________________
  22. //
  23. //  DEFINE_AUTOCLASS(C++ClassName)
  24. //
  25. //    EXPOSE_METHOD(IntName, ReturnTypeName, ExtName, DocString, HelpContext)
  26. //    EXPOSE_PROPRW(IntName, PropTypeName,   ExtName, DocString, HelpContext)
  27. //    EXPOSE_PROPRO(IntName, PropTypeName,   ExtName, DocString, HelpContext)
  28. //    EXPOSE_PROPWO(IntName, PropTypeName,   ExtName, DocString, HelpContext)
  29. //    EXPOSE_APPLICATION(    AppTypeName,    ExtName, DocString, HelpContext)
  30. //    EXPOSE_QUIT(                           ExtName, DocString, HelpContext)
  31. //
  32. //    REQUIRED_ARG(TypeName, ExtArgName)
  33. //    OPTIONAL_ARG(TypeName, ExtArgName, DefaultValueString)
  34. //
  35. //    EXPOSE_INHERIT(C++ClassName, ExtClassName)
  36. //    EXPOSE_DELEGATE(C++ClassName, ExtClassName, AddressAdjusterFunction)
  37. //
  38. //    EXPOSE_FACTORY(C++ClassName, ExtClassName, C++BaseClass)
  39. //
  40. //  END_AUTOCLASS(C++ClassName , Typeflags,  ExtName, DocString, HelpContext)
  41. //
  42. //  For automated classes which are, inherit from, or delegate to COM objects:
  43. //  Specify the aggregator function for a pre-existing object of the aggreate.
  44. //
  45. //  DEFINE_AUTOAGGREGATE(C++ClassName, AggregatorFunction)
  46. //  END_AUTOAGGREGATE(C++ClassName, ExtClassName, DocString, HelpContext)
  47. //____________________________________________________________________________
  48.  
  49. #define DEFINE_AUTOCLASS(cls) \
  50.   TAutoSymbol cls::SymbolTable[] = {
  51.  
  52. #define END_AUTOCLASS(cls, flags, name, doc, help) {{name},{doc}, 0, \
  53.   flags,0,TAutoSymbol::InitAutoDestructor(cls::TCommand_dtr::Build),help} }; \
  54.   TAutoClass cls::ClassInfo(cls::SymbolTable, cls::SymbolTable + \
  55.      (sizeof(cls::SymbolTable)/sizeof(TAutoSymbol) - 1), typeid(cls), 0);
  56.  
  57. #define DEFINE_AUTOAGGREGATE(cls, aggregator) \
  58.   IUnknown& cls::Aggregator(ObjectPtr inst, TUnknown& inner) \
  59.         { return ((cls*)inst)->aggregator(inner); } \
  60.   DEFINE_AUTOCLASS(cls)
  61.  
  62. #define END_AUTOAGGREGATE(cls, flags, name, doc, help) {{name},{doc}, 0, \
  63.   flags,0,TAutoSymbol::InitAutoDestructor(cls::TCommand_dtr::Build),help} }; \
  64.   TAutoClass cls::ClassInfo(cls::SymbolTable, cls::SymbolTable + \
  65.   (sizeof(cls::SymbolTable)/sizeof(TAutoSymbol)-1),typeid(cls),cls::Aggregator);
  66.  
  67. struct TAutoEventDummy {
  68.   struct TCommand_ {
  69.     static TAutoCommand* Build(ObjectPtr,int,TAutoStack&) {return 0;}
  70.   };
  71. };
  72.  
  73. #define DEFINE_AUTOEVENTCLASS(cls) \
  74.   class cls {static TAutoClass ClassInfo; static TAutoSymbol SymbolTable[]; \
  75.   typedef TAutoEventDummy ThisClass; };\
  76.   TAutoSymbol cls::SymbolTable[] = {
  77.  
  78. #define END_AUTOEVENTCLASS(cls, flags, name, doc, help) {{name},{doc}, 0, \
  79.   flags|tfEventSource, 0, 0,help} }; \
  80.   TAutoClass cls::ClassInfo(cls::SymbolTable, cls::SymbolTable + \
  81.      (sizeof(cls::SymbolTable)/sizeof(TAutoSymbol) - 1), typeid(cls), 0);
  82.  
  83. #define DEFINE_AUTODISPATCH(cls) DEFINE_AUTOCLASS(cls)
  84. #define END_AUTODISPATCH(cls)    END_AUTOCLASS(cls, 0, 0, 0)
  85.  
  86. #define EXPOSE_METHOD(cmd, cls, name, doc, help)     {{name},{doc},\
  87.   asMethod, -1, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  88.  
  89. #define EXPOSE_METHOD_ID(id, cmd, cls, name, doc, help) {{name}, {doc},\
  90.   asMethod, id, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  91.  
  92. #define EXPOSE_PROPRW(cmd, cls, name, doc, help)     {{name},{doc},\
  93.   asGetSet, -1, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  94.  
  95. #define EXPOSE_PROPRW_ID(id, cmd, cls, name, doc, help)     {{name},{doc},\
  96.   asGetSet, id, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  97.  
  98. #define EXPOSE_PROPRO(cmd, cls, name, doc, help)     {{name},{doc},\
  99.   asGet, -1, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  100.  
  101. #define EXPOSE_PROPRO_ID(id, cmd, cls, name, doc, help)     {{name},{doc},\
  102.   asGet, id, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  103.  
  104. #define EXPOSE_PROPWO(cmd, cls, name, doc, help)     {{name},{doc},\
  105.   asSet, -1, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  106.  
  107. #define EXPOSE_PROPWO_ID(id, cmd, cls, name, doc, help)     {{name},{doc},\
  108.   asSet, id, &cls::ClassInfo, ThisClass::TCommand_##cmd::Build, help},
  109.  
  110. #define EXPOSE_APPLICATION(cls, name, doc, help)     {{name},{doc},\
  111.   asGet, -1, &cls::ClassInfo, ThisClass::TCommand_app::Build, help},
  112.  
  113. #define EXPOSE_QUIT(name, doc, help)                 {{name},{doc},\
  114.   asMethod, -1, &TAutoVoid::ClassInfo, AutoQuitBuild, help},
  115.  
  116. #define REQUIRED_ARG(cls, name) {{name}, {0}, \
  117.   asArgument, 0, &cls::ClassInfo, 0, 0},
  118.  
  119. #define OPTIONAL_ARG(cls, name, dflt) {{name}, {dflt}, \
  120.   asArgument, 0, &cls::ClassInfo, 0, 0},
  121.  
  122. #define EXPOSE_DELEGATE(cls, name, locator) {{name}, {0}, \
  123.   asClass, 0, &cls::ClassInfo, TAutoSymbol::InitTypeConvert(locator), 0},
  124.  
  125. #define EXPOSE_INHERIT(cls, name) {{name}, {0}, asClass, 0, &cls::ClassInfo, \
  126.   TAutoSymbol::InitTypeConvert(TTypeConvert<cls,ThisClass>::Cast), 0},
  127.  
  128. #define EXPOSE_FACTORY(cls, name, base) {{name}, {0}, asFactory, 0, \
  129.   &cls::ClassInfo, TAutoSymbol::InitTypeConvert(TTypeConvert<cls,base>::Cast), 0},
  130.  
  131. #define EXPOSE_ITERATOR(cls, doc, help)     {{"_NewEnum"},{doc}, asIterator, \
  132.   -4, &cls::ClassInfo, TAutoSymbol::InitAutoIterator(ThisClass::TIterator::Build), help},
  133.  
  134. // Macros to define enumeration lists
  135. //
  136. //   DEFINE_AUTOENUM(EnumName, TAuto????)
  137. //     AUTOENUM(EnumString1,  constval1)
  138. //     AUTOENUM(EnumString2,  constval2)
  139. //     AUTOENUM(EnumString3,  constval3)
  140. //   END_AUTOENUM(EnumName, TAuto????)
  141.  
  142. #define DEFINE_AUTOENUM(cls, type) \
  143.   TAutoEnumVal<type##Enum> cls##_Table[] = {
  144.  
  145. #define AUTOENUM(name, val) {{name}, val},
  146.  
  147. #define END_AUTOENUM(cls, type) }; \
  148.   struct cls { static TAutoEnumT<type##Enum> ClassInfo; }; \
  149.   TAutoEnumT<type##Enum> cls::ClassInfo(cls##_Table, \
  150.   sizeof(cls##_Table)/sizeof(TAutoEnumVal<type##Enum>),type::ClassInfo.GetType());
  151.  
  152. typedef short         TAutoShortEnum;
  153. typedef long          TAutoLongEnum;
  154. typedef const char*   TAutoStringEnum;
  155. typedef float         TAutoFloatEnum;
  156. typedef double        TAutoDoubleEnum;
  157. typedef bool          TAutoBoolEnum;
  158. typedef TAutoCurrency TAutoCurrencyEnum;
  159. typedef TAutoDate     TAutoDateEnum;
  160. typedef unsigned char TAutoByteEnum;
  161.  
  162. //____________________________________________________________________________
  163. //
  164. // Macros for defining command objects
  165. //____________________________________________________________________________
  166. //
  167. //  DECLARE_AUTOCLASS(C++ClassName)
  168. //    AUTOFUNC0 (InternalName, FuncName, Options)
  169. //    AUTOFUNC1 (InternalName, FuncName, RetType, Arg1Type, Options)
  170. //    AUTOFUNC2 (InternalName, FuncName, RetType, Arg1Type, Arg2Type, Options)
  171. //    AUTOFUNC0V(InternalName, FuncName, Options)           // void return
  172. //    AUTOFUNC1V(InternalName, FuncName, Arg1Type, Options) // void return
  173. //    AUTOFUNC2V(InternalName, FuncName, Arg1Type, Arg2Type, Options)
  174. //    AUTODATA  (InternalName, DataMember, DataType, Options)
  175. //    AUTODATARO(InternalName, DataMember, DataType, Options)
  176. //    AUTOPROP  (InternalName, GetFuncName, SetFuncName, DataType, Options)
  177. //    AUTOFLAG  (InternalName, DataMember, BitMask, Options)
  178. //    AUTOBUILD0(InternalName, Options)
  179. //    AUTOBUILD1(InternalName, Arg1Type, Options)
  180. //    AUTOBUILD2(InternalName, Arg1Type, Arg2Type, Options)
  181. //    AUTOPROXY (InternalName, ProxyMember, Options)
  182. //    AUTOITERATOR(AccessExpr, StateDefs, InitCode, TestExpr, StepCode)
  183. //    AUTODETACH    // invalidates external references upon object destruction
  184. //
  185. //  For automated classes which are, inherit from, or delegate to COM objects,
  186. //  use the following macro in place of DECLARE_AUTOCLASS:
  187. //
  188. //  DECLARE_AUTOAGGREGATE(C++ClassName)
  189. //____________________________________________________________________________
  190.  
  191. //
  192. // Macros to place in final argument to add capabilites, else leave empty
  193. //
  194. #define AUTOUNDO(code)   TAutoCommand* Undo(){code}  // declare an undo method
  195. #define AUTORECORD(code) int Record(TAutoStack& args){code};  // record method
  196. #define AUTOINVOKE(code) TAutoCommand& Invoke(){code return *this;}// override
  197. #define AUTOVALIDATE(condition) bool Validate() { return condition; }
  198. #define AUTONOHOOK TAutoCommand& Invoke() {Execute();}
  199. #define AUTOREPORT(errcode) long Report() {return errcode;}
  200.  
  201. //____________________________________________________________________________
  202.  
  203. //
  204. // Autoclass declaration, adding derived TAutoCommand class with this pointer
  205. //
  206. #define DECLARE_AUTOCLASS(cls) \
  207.   public: \
  208.     static TAutoClass ClassInfo; \
  209.   protected: \
  210.     static TAutoSymbol SymbolTable[]; \
  211.     class TThisCommand : public TAutoCommand { \
  212.       protected: \
  213.         TThisCommand(cls* obj, int attr):TAutoCommand(attr),This(obj){} \
  214.         cls* This; \
  215.     }; \
  216.     typedef cls ThisClass; \
  217.     class TCommand_app : public TAutoCommand { \
  218.      public: \
  219.       TCommand_app(int attr, TServedObject* app) \
  220.                      : TAutoCommand(attr), Val(app) {} \
  221.       void Return(TAutoVal& v) {v=(IDispatch*)Val;} \
  222.       TServedObject* Val; \
  223.       static TAutoCommand* Build(ObjectPtr obj,int attr,TAutoStack& args) \
  224.       { return new TCommand_app(attr, args.Owner->GetAppObject()); } \
  225.     }; \
  226.     class TCommand_dtr : public TThisCommand { \
  227.      public: \
  228.       TCommand_dtr(ThisClass* obj, int attr) \
  229.                      : TThisCommand(obj, attr) {} \
  230.       void Execute(){if (Attr == TObjectDescriptor::PostQuit) \
  231.                        ::PostQuitMessage(0);\
  232.                      else delete This;} \
  233.       static TAutoCommand* Build(ObjectPtr obj,int attr) \
  234.       { return new TCommand_dtr((ThisClass*)obj, attr); }\
  235.     }; friend class TCommand_dtr;
  236.  
  237. #define DECLARE_AUTODISPATCH(cls) \
  238.   public: \
  239.     static TAutoClass ClassInfo; \
  240.   protected: \
  241.     static TAutoSymbol SymbolTable[]; \
  242.     class TThisCommand : public TAutoCommand { \
  243.       protected: \
  244.         TThisCommand(cls* obj, int attr):TAutoCommand(attr),This(obj){} \
  245.         cls* This; \
  246.     }; typedef cls ThisClass;
  247.  
  248. // Autoclass declaration for COM-aggregatable classes
  249.  
  250. #define DECLARE_AUTOAGGREGATE(cls) \
  251.   public: \
  252.     static IUnknown& Aggregator(ObjectPtr inst, TUnknown& inner); \
  253.   DECLARE_AUTOCLASS(cls)
  254.  
  255. // Command object class definition for methods or get-only properties
  256. //
  257. #define RETARG(t) void Return(TAutoVal& v){v=Val;} t Val;
  258.  
  259. #define AUTOFUNC_(name, invoke, defs, defargs, bldargs, ctrargs, setargs) \
  260.     class TCommand_##name : public TThisCommand { \
  261.      public:  typedef TCommand_##name ThisCmd; \
  262.       defs defargs \
  263.       TCommand_##name(ThisClass* obj, int attr ctrargs) \
  264.                      : TThisCommand(obj, attr) setargs {} \
  265.       void Execute() {invoke} \
  266.       static TAutoCommand* Build(ObjectPtr obj,int attr,TAutoStack& args) \
  267.       { return new TCommand_##name((ThisClass*)obj, attr bldargs); }\
  268.     }; friend class TCommand_##name;
  269.  
  270. // Command object class definition for properties with both get and set
  271. //
  272. #define AUTOPROP_(name, getcode, setcode, defs, type) \
  273.     class TCommand_##name : public TThisCommand { \
  274.      public:  typedef TCommand_##name ThisCmd; \
  275.       defs RETARG(type) \
  276.       TCommand_##name(ThisClass* obj, int attr) : TThisCommand(obj, attr) {} \
  277.       TCommand_##name(ThisClass* obj, int attr, type arg) \
  278.                                       : TThisCommand(obj, attr), Val(arg) {} \
  279.       void Execute() {if (IsPropSet()) {setcode} else {getcode}} \
  280.       static TAutoCommand* Build(ObjectPtr obj,int attr,TAutoStack& args) \
  281.       { return (attr & asGet) ?  \
  282.         new TCommand_##name((ThisClass*)obj, attr) : \
  283.         new TCommand_##name((ThisClass*)obj, attr,(type)args[TAutoStack::SetValue]);}\
  284.     }; friend class TCommand_##name;
  285.  
  286. // Command object class definition for constructor commands
  287. //
  288. #define AUTOBUILD_(name, invoke, defs, defargs, bldargs, ctrargs, setargs) \
  289.     class TCommand_##name : public TAutoCommand {\
  290.      public: \
  291.       defs defargs RETARG(TAutoMono<ThisClass>) \
  292.       TCommand_##name(int attr ctrargs) : TAutoCommand(attr) setargs {} \
  293.       void Execute() {invoke} \
  294.       static TAutoCommand* Build(ObjectPtr, int attr, TAutoStack& args) \
  295.       { return new TCommand_##name(attr bldargs); } \
  296.     };
  297.  
  298. // Command object class definition for external object property
  299. //
  300. #define AUTOPROXY(name, proxy, defs) \
  301.         AUTOPROP_(name, Val=This->proxy;, This->proxy.Bind(Val);, defs, IDispatch*)
  302.  
  303. // Iterator class definition
  304. //
  305. #define AUTOITERATOR(state, init, test, step, extract) \
  306.     class TIterator : public TAutoIterator { \
  307.      public: \
  308.       ThisClass* This; \
  309.       state; \
  310.       void Init() {init;} \
  311.       bool Test() {return test;} \
  312.       void Step() {step;} \
  313.       void Return(TAutoVal& v) {v=extract;} \
  314.       TIterator* Copy() {return new TIterator(*this);} \
  315.       TIterator(ThisClass* obj, TAutoCreator& creator, IUnknown* owner, TLangId lang) \
  316.                     : This(obj), TAutoIterator(creator, owner, lang) {} \
  317.       static TAutoIterator* Build(ObjectPtr obj, TAutoCreator& creator, \
  318.                                   IUnknown* owner, TLangId lang) \
  319.       { return new TIterator((ThisClass*)obj, creator, owner, lang); }\
  320.     }; friend class TIterator;
  321.  
  322. #define AUTOITERATOR_DECLARE(state) \
  323.     class TIterator : public TAutoIterator { \
  324.      public: \
  325.       ThisClass* This; \
  326.       state; \
  327.       void Init(); \
  328.       bool Test(); \
  329.       void Step(); \
  330.       void Return(TAutoVal& v); \
  331.       TIterator* Copy() {return new TIterator(*this);} \
  332.       TIterator(ThisClass* obj, TAutoCreator& creator, IUnknown* owner, TLangId lang) \
  333.                     : This(obj), TAutoIterator(creator, owner, lang) {} \
  334.       static TAutoIterator* Build(ObjectPtr obj, TAutoCreator& creator, \
  335.                                   IUnknown* owner, TLangId lang) \
  336.       { return new TIterator((ThisClass*)obj, creator, owner, lang); }\
  337.     }; friend class TIterator;
  338.  
  339. //
  340. // Macros for defining lists of arguments
  341. //
  342.                     
  343. #define DEFARGS0(t0)                t0 Val;
  344. #define DEFARGS1(t1)                t1 Arg1;
  345. #define DEFARGS2(t1,t2)             t1 Arg1;t2 Arg2;
  346. #define DEFARGS3(t1,t2,t3)          t1 Arg1;t2 Arg2;t3 Arg3;
  347. #define DEFARGS4(t1,t2,t3,t4)       t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;
  348. #define DEFARGS5(t1,t2,t3,t4,t5)    t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;
  349. #define DEFARGS6(t1,t2,t3,t4,t5,t6) t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;t6 Arg6;
  350. #define DEFARGS7(t1,t2,t3,t4,t5,t6,t7) \
  351.   t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;t6 Arg6;t7 Arg7;
  352. #define DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8) \
  353.   t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;t6 Arg6;t7 Arg7;t8 Arg8;
  354. #define DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9) \
  355.   t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;t6 Arg6;t7 Arg7;t8 Arg8;t9 Arg9;
  356. #define DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) \
  357.   t1 Arg1;t2 Arg2;t3 Arg3;t4 Arg4;t5 Arg5;t6 Arg6;t7 Arg7;t8 Arg8;t9 Arg9;t10 Arg10;
  358.  
  359. #define BLDARGS0(t0)                ,(t0)args[TAutoStack::SetValue]
  360. #define BLDARGS1(t1)                ,(t1)args[0]
  361. #define BLDARGS2(t1,t2)             ,(t1)args[0],(t2)args[1]
  362. #define BLDARGS3(t1,t2,t3)          ,(t1)args[0],(t2)args[1],(t3)args[2]
  363. #define BLDARGS4(t1,t2,t3,t4)                                  \
  364.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3]
  365. #define BLDARGS5(t1,t2,t3,t4,t5)                               \
  366.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4]
  367. #define BLDARGS6(t1,t2,t3,t4,t5,t6)                            \
  368.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4],(t6)args[5]
  369. #define BLDARGS7(t1,t2,t3,t4,t5,t6,t7)                         \
  370.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4] \
  371.   ,(t6)args[5],(t7)args[6]
  372. #define BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8)                      \
  373.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4] \
  374.   ,(t6)args[5],(t7)args[6],(t8)args[7]
  375. #define BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9)                   \
  376.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4] \
  377.   ,(t6)args[5],(t7)args[6],(t8)args[7],(t9)args[8]
  378. #define BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)              \
  379.   ,(t1)args[0],(t2)args[1],(t3)args[2],(t4)args[3],(t5)args[4] \
  380.   ,(t6)args[5],(t7)args[6],(t8)args[7],(t9)args[8],(t10)args[9]
  381.  
  382. #define CTRARGS0(t0)                    ,t0 val
  383. #define CTRARGS1(t1)                    ,t1 arg1
  384. #define CTRARGS2(t1,t2)                 ,t1 arg1,t2 arg2
  385. #define CTRARGS3(t1,t2,t3)              ,t1 arg1,t2 arg2,t3 arg3
  386. #define CTRARGS4(t1,t2,t3,t4)           ,t1 arg1,t2 arg2,t3 arg3,t4 arg4
  387. #define CTRARGS5(t1,t2,t3,t4,t5)        ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5
  388. #define CTRARGS6(t1,t2,t3,t4,t5,t6)     ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6
  389. #define CTRARGS7(t1,t2,t3,t4,t5,t6,t7)  ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6,t7 arg7
  390. #define CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8) \
  391.   ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6,t7 arg7,t8 arg8
  392. #define CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9) \
  393.   ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6,t7 arg7,t8 arg8,t9 arg9
  394. #define CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) \
  395.   ,t1 arg1,t2 arg2,t3 arg3,t4 arg4,t5 arg5,t6 arg6,t7 arg7,t8 arg8,t9 arg9,t10 arg10
  396.  
  397. #define SETARGS0  ,Val(val)
  398. #define SETARGS1  ,Arg1(arg1)
  399. #define SETARGS2  ,Arg1(arg1),Arg2(arg2)
  400. #define SETARGS3  ,Arg1(arg1),Arg2(arg2),Arg3(arg3)
  401. #define SETARGS4  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4)
  402. #define SETARGS5  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5)
  403. #define SETARGS6  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5),Arg6(arg6)
  404. #define SETARGS7  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5),Arg6(arg6), \
  405.   Arg7(arg7)
  406. #define SETARGS8  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5),Arg6(arg6), \
  407.   Arg7(arg7),Arg8(arg8)
  408. #define SETARGS9  ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5),Arg6(arg6), \
  409.   Arg7(arg7),Arg8(arg8),Arg9(arg9)
  410. #define SETARGS10 ,Arg1(arg1),Arg2(arg2),Arg3(arg3),Arg4(arg4),Arg5(arg5),Arg6(arg6), \
  411.   Arg7(arg7),Arg8(arg8),Arg9(arg9),Arg10(arg10)
  412.  
  413. #define AUTOFUNC0(name, func, ret, defs) \
  414.   AUTOFUNC_(name, Val=This->func();, defs, RETARG(ret), , , )
  415.  
  416. #define AUTOFUNC0V(name, func, defs) \
  417.   AUTOFUNC_(name, This->func();, defs, , , , )
  418.  
  419. #define AUTOFUNC1(name, func, ret,type1, defs) \
  420.   AUTOFUNC_(name, Val=This->func(Arg1);, defs, RETARG(ret) \
  421.   DEFARGS1(type1), BLDARGS1(type1), CTRARGS1(type1), SETARGS1)
  422.  
  423. #define AUTOFUNC1V(name, func, type1, defs) \
  424.   AUTOFUNC_(name, This->func(Arg1);, defs, \
  425.   DEFARGS1(type1), BLDARGS1(type1), CTRARGS1(type1), SETARGS1)
  426.  
  427. #define AUTOFUNC2(name, func, ret,t1,t2, defs) \
  428.   AUTOFUNC_(name, Val=This->func(Arg1,Arg2);, defs, RETARG(ret) \
  429.   DEFARGS2(t1,t2), BLDARGS2(t1,t2), CTRARGS2(t1,t2), SETARGS2)
  430.  
  431. #define AUTOFUNC2V(name, func, t1,t2, defs) \
  432.   AUTOFUNC_(name, This->func(Arg1,Arg2);, defs, \
  433.   DEFARGS2(t1,t2), BLDARGS2(t1,t2), CTRARGS2(t1,t2), SETARGS2)
  434.  
  435. #define AUTOFUNC3(name, func, ret,t1,t2,t3, defs) \
  436.   AUTOFUNC_(name, Val=This->func(Arg1,Arg2,Arg3);, defs, RETARG(ret) \
  437.   DEFARGS3(t1,t2,t3), BLDARGS3(t1,t2,t3), CTRARGS3(t1,t2,t3), SETARGS3)
  438.  
  439. #define AUTOFUNC3V(name, func, t1,t2,t3, defs) \
  440.   AUTOFUNC_(name, This->func(Arg1,Arg2,Arg3);, defs, \
  441.   DEFARGS3(t1,t2,t3), BLDARGS3(t1,t2,t3), CTRARGS3(t1,t2,t3), SETARGS3)
  442.  
  443. #define AUTOFUNC4(name, func, ret,t1,t2,t3,t4, defs) \
  444.   AUTOFUNC_(name, Val=This->func(Arg1,Arg2,Arg3,Arg4);, defs, RETARG(ret) \
  445.   DEFARGS4(t1,t2,t3,t4), BLDARGS4(t1,t2,t3,t4), CTRARGS4(t1,t2,t3,t4), SETARGS4)
  446.  
  447. #define AUTOFUNC4V(name, func, t1,t2,t3,t4, defs) \
  448.   AUTOFUNC_(name, This->func(Arg1,Arg2,Arg3,Arg4);, defs,\
  449.   DEFARGS4(t1,t2,t3,t4), BLDARGS4(t1,t2,t3,t4), CTRARGS4(t1,t2,t3,t4), SETARGS4)
  450.  
  451. #define AUTOFUNC5(name,func,ret,t1,t2,t3,t4,t5,defs)                        \
  452.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5);,defs,RETARG(ret) \
  453.   DEFARGS5(t1,t2,t3,t4,t5),BLDARGS5(t1,t2,t3,t4,t5),CTRARGS5(t1,t2,t3,t4,t5),SETARGS5)
  454.  
  455. #define AUTOFUNC5V(name,func,t1,t2,t3,t4,t5,defs)            \
  456.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5);,defs, \
  457.   DEFARGS5(t1,t2,t3,t4,t5),BLDARGS5(t1,t2,t3,t4,t5),CTRARGS5(t1,t2,t3,t4,t5),SETARGS5)
  458.  
  459. #define AUTOFUNC6(name,func,ret,t1,t2,t3,t4,t5,t6,defs)                          \
  460.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6);,defs,RETARG(ret) \
  461.   DEFARGS6(t1,t2,t3,t4,t5,t6),BLDARGS6(t1,t2,t3,t4,t5,t6), CTRARGS6(t1,t2,t3,t4,t5,t6),SETARGS6)
  462.  
  463. #define AUTOFUNC6V(name,func,t1,t2,t3,t4,t5,t6,defs)              \
  464.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6);,defs, \
  465.   DEFARGS6(t1,t2,t3,t4,t5,t6),BLDARGS6(t1,t2,t3,t4,t5,t6),        \
  466.   CTRARGS6(t1,t2,t3,t4,t5,t6),SETARGS6)
  467.  
  468. #define AUTOFUNC7(name,func,ret,t1,t2,t3,t4,t5,t6,t7,defs)                            \
  469.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7);,defs,RETARG(ret) \
  470.   DEFARGS7(t1,t2,t3,t4,t5,t6,t7),BLDARGS7(t1,t2,t3,t4,t5,t6,t7),                      \
  471.   CTRARGS7(t1,t2,t3,t4,t5,t6,t7),SETARGS7)
  472.  
  473. #define AUTOFUNC7V(name,func,t1,t2,t3,t4,t5,t6,t7,defs)                \
  474.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7);,defs, \
  475.   DEFARGS7(t1,t2,t3,t4,t5,t6,t7),BLDARGS7(t1,t2,t3,t4,t5,t6,t7),       \
  476.   CTRARGS7(t1,t2,t3,t4,t5,t6,t7),SETARGS7)
  477.  
  478. #define AUTOFUNC8(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,defs)                              \
  479.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8);,defs,RETARG(ret) \
  480.   DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8),BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8),                     \
  481.   CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8),SETARGS8)
  482.  
  483. #define AUTOFUNC8V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,defs)                  \
  484.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8);,defs, \
  485.   DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8),BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8),      \
  486.   CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8),SETARGS8)
  487.  
  488. #define AUTOFUNC9(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,t9,defs)                                \
  489.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9);,defs,RETARG(ret) \
  490.   DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),                    \
  491.   CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),SETARGS9)
  492.  
  493. #define AUTOFUNC9V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,defs)                    \
  494.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9);,defs, \
  495.   DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),     \
  496.   CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),SETARGS9)
  497.  
  498. #define AUTOFUNC10(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,defs)                                 \
  499.   AUTOFUNC_(name,Val=This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10);,defs,RETARG(ret) \
  500.   DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),                \
  501.   CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),SETARGS10)
  502.  
  503. #define AUTOFUNC10V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,defs)                     \
  504.   AUTOFUNC_(name,This->func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10);,defs, \
  505.   DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), \
  506.   CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),SETARGS10)
  507.  
  508. #define AUTOSTAT0(name, func, ret, defs) \
  509.   AUTOFUNC_(name, Val=func();, defs, RETARG(ret), , , )
  510.  
  511. #define AUTOSTAT0V(name, func, defs) \
  512.   AUTOFUNC_(name, func();, defs, , , , )
  513.  
  514. #define AUTOSTAT1(name, func, ret,type1, defs) \
  515.   AUTOFUNC_(name, Val=func(Arg1);, defs, RETARG(ret) \
  516.   DEFARGS1(type1), BLDARGS1(type1), CTRARGS1(type1), SETARGS1)
  517.  
  518. #define AUTOSTAT1V(name, func, type1, defs) \
  519.   AUTOFUNC_(name, func(Arg1);, defs, \
  520.   DEFARGS1(type1), BLDARGS1(type1), CTRARGS1(type1), SETARGS1)
  521.  
  522. #define AUTOSTAT2(name, func, ret,t1,t2, defs) \
  523.   AUTOFUNC_(name, Val=func(Arg1,Arg2);, defs, RETARG(ret) \
  524.   DEFARGS2(t1,t2), BLDARGS2(t1,t2), CTRARGS2(t1,t2), SETARGS2)
  525.  
  526. #define AUTOSTAT2V(name, func, t1,t2, defs) \
  527.   AUTOFUNC_(name, func(Arg1,Arg2);, defs, \
  528.   DEFARGS2(t1,t2), BLDARGS2(t1,t2), CTRARGS2(t1,t2), SETARGS2)
  529.  
  530. #define AUTOSTAT3(name, func, ret,t1,t2,t3, defs) \
  531.   AUTOFUNC_(name, Val=func(Arg1,Arg2,Arg3);, defs, RETARG(ret) \
  532.   DEFARGS3(t1,t2,t3), BLDARGS3(t1,t2,t3), CTRARGS3(t1,t2,t3), SETARGS3)
  533.  
  534. #define AUTOSTAT3V(name, func, t1,t2,t3, defs) \
  535.   AUTOFUNC_(name, func(Arg1,Arg2,Arg3);, defs, \
  536.   DEFARGS3(t1,t2,t3), BLDARGS3(t1,t2,t3), CTRARGS3(t1,t2,t3), SETARGS3)
  537.  
  538. #define AUTOSTAT4(name, func, ret,t1,t2,t3,t4, defs) \
  539.   AUTOFUNC_(name, Val=func(Arg1,Arg2,Arg3,Arg4);, defs, RETARG(ret) \
  540.   DEFARGS4(t1,t2,t3,t4), BLDARGS4(t1,t2,t3,t4), CTRARGS4(t1,t2,t3,t4), SETARGS4)
  541.  
  542. #define AUTOSTAT4V(name, func, t1,t2,t3,t4, defs) \
  543.   AUTOFUNC_(name, func(Arg1,Arg2,Arg3,Arg4);, defs,\
  544.   DEFARGS4(t1,t2,t3,t4), BLDARGS4(t1,t2,t3,t4), CTRARGS4(t1,t2,t3,t4), SETARGS4)
  545.  
  546. #define AUTOSTAT5(name,func,ret,t1,t2,t3,t4,t5,defs)                  \
  547.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5);,defs,RETARG(ret) \
  548.   DEFARGS5(t1,t2,t3,t4,t5),BLDARGS5(t1,t2,t3,t4,t5),CTRARGS5(t1,t2,t3,t4,t5),SETARGS5)
  549.  
  550. #define AUTOSTAT5V(name,func,t1,t2,t3,t4,t5,defs)      \
  551.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5);,defs, \
  552.   DEFARGS5(t1,t2,t3,t4,t5),BLDARGS5(t1,t2,t3,t4,t5),CTRARGS5(t1,t2,t3,t4,t5),SETARGS5)
  553.  
  554. #define AUTOSTAT6(name,func,ret,t1,t2,t3,t4,t5,t6,defs)                    \
  555.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6);,defs,RETARG(ret) \
  556.   DEFARGS6(t1,t2,t3,t4,t5,t6),BLDARGS6(t1,t2,t3,t4,t5,t6), CTRARGS6(t1,t2,t3,t4,t5,t6),SETARGS6)
  557.  
  558. #define AUTOSTAT6V(name,func,t1,t2,t3,t4,t5,t6,defs)        \
  559.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6);,defs, \
  560.   DEFARGS6(t1,t2,t3,t4,t5,t6),BLDARGS6(t1,t2,t3,t4,t5,t6), CTRARGS6(t1,t2,t3,t4,t5,t6),SETARGS6)
  561.  
  562. #define AUTOSTAT7(name,func,ret,t1,t2,t3,t4,t5,t6,t7,defs)                      \
  563.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7);,defs,RETARG(ret) \
  564.   DEFARGS7(t1,t2,t3,t4,t5,t6,t7),BLDARGS7(t1,t2,t3,t4,t5,t6,t7),                \
  565.   CTRARGS7(t1,t2,t3,t4,t5,t6,t7),SETARGS7)
  566.  
  567. #define AUTOSTAT7V(name,func,t1,t2,t3,t4,t5,t6,t7,defs)          \
  568.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7);,defs, \
  569.   DEFARGS7(t1,t2,t3,t4,t5,t6,t7),BLDARGS7(t1,t2,t3,t4,t5,t6,t7), \
  570.   CTRARGS7(t1,t2,t3,t4,t5,t6,t7),SETARGS7)
  571.  
  572. #define AUTOSTAT8(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,defs)                        \
  573.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8);,defs,RETARG(ret) \
  574.   DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8),BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8),               \
  575.   CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8),SETARGS8)
  576.  
  577. #define AUTOSTAT8V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,defs)             \
  578.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8);,defs,  \
  579.   DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8),BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8), \
  580.   CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8),SETARGS8)
  581.  
  582. #define AUTOSTAT9(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,t9,defs)                          \
  583.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9);,defs,RETARG(ret) \
  584.   DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),              \
  585.   CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),SETARGS9)
  586.  
  587. #define AUTOSTAT9V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,defs)                \
  588.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9);,defs,   \
  589.   DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9), \
  590.   CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),SETARGS9)
  591.  
  592. #define AUTOSTAT10(name,func,ret,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,defs)                           \
  593.   AUTOFUNC_(name,Val=func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10);,defs,RETARG(ret) \
  594.   DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),          \
  595.   CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),SETARGS10)
  596.  
  597. #define AUTOSTAT10V(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,defs)                     \
  598.   AUTOFUNC_(name,func(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10);,defs,       \
  599.   DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10), \
  600.   CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),SETARGS10)
  601.  
  602.  
  603. #define AUTOPROP( name, get, set, type, defs) \
  604.   AUTOPROP_(name, Val=This->get();, This->set(Val);, defs, type)
  605.  
  606. #define AUTOPROPRO(name, get, type, defs) \
  607.   AUTOFUNC0( name, get, type, defs)
  608.  
  609. #define AUTOPROPWO( name, set, type, defs) \
  610.   AUTOFUNC_(name, This->set(Val);, defs, \
  611.   DEFARGS0(type), BLDARGS0(type), CTRARGS0(type), SETARGS0)
  612.  
  613. #define AUTODATA( name, data, type, defs) \
  614.   AUTOPROP_(name, Val=This->data;, This->data=Val;, defs, type)
  615.  
  616. #define AUTODATARO(name, data, type, defs) \
  617.   AUTOFUNC_(name, Val=This->data;, defs, RETARG(type), , , )
  618.  
  619. #define AUTOTHIS(name, type, defs) \
  620.   AUTOFUNC_(name, Val=*This;, defs, RETARG(type), , , )
  621.  
  622. #define AUTOFLAG( name, data, mask, defs) \
  623.   AUTOPROP_(name, Val=(TBool)((This->data & (mask)) != 0);, \
  624.   if (Val) This->data|=(mask); else This->data&=~(mask);, defs, TBool)
  625.  
  626. #define AUTOBUILD0(name, defs) \
  627.   AUTOBUILD_(name, Val = new ThisClass();, defs, , , , )
  628.  
  629. #define AUTOBUILD1(name, type1, defs) \
  630.   AUTOBUILD_(name, Val = new ThisClass(Arg1);, defs, \
  631.   DEFARGS1(type1), BLDARGS1(type1), CTRARGS1(type1), SETARGS1)
  632.  
  633. #define AUTOBUILD2(name, t1,t2, defs) \
  634.   AUTOBUILD_(name, Val = new ThisClass(Arg1,Arg2);, defs, \
  635.   DEFARGS2(t1,t2), BLDARGS2(t1,t2), CTRARGS2(t1,t2), SETARGS2)
  636.  
  637. #define AUTOBUILD3(name, t1,t2,t3, defs) \
  638.   AUTOBUILD_(name, Val = new ThisClass(Arg1,Arg2,Arg3);, defs, \
  639.   DEFARGS3(t1,t2,t3), BLDARGS3(t1,t2,t3), CTRARGS3(t1,t2,t3), SETARGS3)
  640.  
  641. #define AUTOBUILD4(name, t1,t2,t3,t4, defs) \
  642.   AUTOBUILD_(name, Val = new ThisClass(Arg1,Arg2,Arg3,Arg4);, defs, \
  643.   DEFARGS4(t1,t2,t3,t4), BLDARGS4(t1,t2,t3,t4), CTRARGS4(t1,t2,t3,t4), SETARGS4)
  644.  
  645. #define AUTOBUILD5(name,func,t1,t2,t3,t4,t5,defs)                    \
  646.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5);,defs, \
  647.   DEFARGS5(t1,t2,t3,t4,t5),BLDARGS5(t1,t2,t3,t4,t5),CTRARGS5(t1,t2,t3,t4,t5),\
  648.   SETARGS5)
  649.  
  650. #define AUTOBUILD6(name,func,t1,t2,t3,t4,t5,t6,defs)                      \
  651.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6);,defs, \
  652.   DEFARGS6(t1,t2,t3,t4,t5,t6),BLDARGS6(t1,t2,t3,t4,t5,t6),                \
  653.   CTRARGS6(t1,t2,t3,t4,t5,t6),SETARGS6)
  654.  
  655. #define AUTOBUILD7(name,func,t1,t2,t3,t4,t5,t6,t7,defs)                       \
  656.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7);,defs,\
  657.   DEFARGS7(t1,t2,t3,t4,t5,t6,t7),BLDARGS7(t1,t2,t3,t4,t5,t6,t7),              \
  658.   CTRARGS7(t1,t2,t3,t4,t5,t6,t7),SETARGS7)
  659.  
  660. #define AUTOBUILD8(name,func,t1,t2,t3,t4,t5,t6,t7,t8,defs)                    \
  661.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8);,defs, \
  662.   DEFARGS8(t1,t2,t3,t4,t5,t6,t7,t8),BLDARGS8(t1,t2,t3,t4,t5,t6,t7,t8),              \
  663.   CTRARGS8(t1,t2,t3,t4,t5,t6,t7,t8),SETARGS8)
  664.  
  665. #define AUTOBUILD9(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,defs)                            \
  666.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9);,defs, \
  667.   DEFARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),BLDARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),             \
  668.   CTRARGS9(t1,t2,t3,t4,t5,t6,t7,t8,t9),SETARGS9)
  669.  
  670. #define AUTOBUILD10(name,func,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,defs)                             \
  671.   AUTOBUILD_(name,Val=new ThisClass(Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8,Arg9,Arg10);,defs, \
  672.   DEFARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),BLDARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),         \
  673.   CTRARGS10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10),SETARGS10)
  674.  
  675. #define AUTODETACH \
  676.     struct TDetach : public TAutoDetach { \
  677.       ~TDetach(){Notify((int)&((ThisClass*)0)->dtr_notify,typeid(ThisClass));} \
  678.     } dtr_notify; friend struct TDetach;
  679.  
  680. //____________________________________________________________________________
  681. //
  682. // Macros for defining automation proxy call wrappers
  683. //____________________________________________________________________________
  684. //
  685. //  RetType|void C++ClassName::C++MethodName(C++ArgumentList)
  686. //  {
  687. //    AUTONAMES?(FunctionName&NamedArgs)  // ? = named argument count
  688. //    AUTOARGS?(ArgumentList)            // ? = total argument count
  689. //    AUTOCALL_?                        // ? = call type and return value type
  690. //  }
  691. //____________________________________________________________________________
  692.  
  693. #define AUTOCALL_ASSIGN \
  694.    ExtObjRef operator =(ExtObjRef ifc) {return TAutoProxy::operator =(ifc);}
  695.  
  696. #define _A(a) "\0" a
  697.  
  698. #define AUTONAMES0(id)       static TAutoDispId     i_(this, id);
  699. #define AUTONAMES1(id,n1)    static TAutoDispIds<1> i_(this, id _A(n1));
  700. #define AUTONAMES2(id,n1,n2) static TAutoDispIds<2> i_(this, id _A(n2)_A(n1));
  701. #define AUTONAMES3(id,n1,n2,n3) \
  702.   static TAutoDispIds<3> i_(this, id _A(n3)_A(n2)_A(n1));
  703. #define AUTONAMES4(id,n1,n2,n3,n4) \
  704.   static TAutoDispIds<4> i_(this, id _A(n4)_A(n3)_A(n2)_A(n1));
  705. #define AUTONAMES5(id,n1,n2,n3,n4,n5) \
  706.   static TAutoDispIds<5> i_(this, id _A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  707. #define AUTONAMES6(id,n1,n2,n3,n4,n5,n6) \
  708.   static TAutoDispIds<6> i_(this, id _A(n6)_A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  709. #define AUTONAMES7(id,n1,n2,n3,n4,n5,n6,n7) \
  710.   static TAutoDispIds<7> i_(this,id,_A(n7)_A(n6)_A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  711. #define AUTONAMES8(id,n1,n2,n3,n4,n5,n6,n7,n8) \
  712.   static TAutoDispIds<8> i_(this,id,_A(n8)_A(n7)_A(n6)_A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  713. #define AUTONAMES9(id,n1,n2,n3,n4,n5,n6,n7,n8,n9) \
  714.   static TAutoDispIds<9> i_(this,id,_A(n9)_A(n8)_A(n7)_A(n6)_A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  715. #define AUTONAMES10(id,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10) \
  716.   static TAutoDispIds<10> i_(this,id,_A(n10)_A(n9)_A(n8)_A(n7)_A(n6)_A(n5)_A(n4)_A(n3)_A(n2)_A(n1));
  717.  
  718. #define AUTOARGS0()          TAutoArgs<0>a_;
  719. #define AUTOARGS1(a1)        TAutoArgs<1>a_; a_[1]=a1;
  720. #define AUTOARGS2(a1,a2)     TAutoArgs<2>a_; a_[1]=a1; a_[2]=a2;
  721. #define AUTOARGS3(a1,a2,a3)  TAutoArgs<3>a_; a_[1]=a1; a_[2]=a2; a_[3]=a3;
  722. #define AUTOARGS4(a1,a2,a3,a4)                                  \
  723.   TAutoArgs<4>a_; a_[1]=a1; a_[2]=a2; a_[3]=a3; a_[4]=a4;
  724. #define AUTOARGS5(a1,a2,a3,a4,a5)                               \
  725.   TAutoArgs<5>a_; a_[1]=a1; a_[2]=a2; a_[3]=a3; a_[4]=a4; a_[5]=a5;
  726. #define AUTOARGS6(a1,a2,a3,a4,a5,a6)                            \
  727.   TAutoArgs<6>a_; a_[1]=a1; a_[2]=a2; a_[3]=a3; a_[4]=a4; a_[5]=a5;a_[6]=a6;
  728. #define AUTOARGS7(a1,a2,a3,a4,a5,a6,a7)                         \
  729.   TAutoArgs<7>a_;a_[1]=a1;a_[2]=a2;a_[3]=a3;a_[4]=a4;a_[5]=a5;  \
  730.   a_[6]=a6;a_[7]=a7;
  731. #define AUTOARGS8(a1,a2,a3,a4,a5,a6,a7,a8)                      \
  732.   TAutoArgs<8>a_;a_[1]=a1;a_[2]=a2;a_[3]=a3;a_[4]=a4;a_[5]=a5;  \
  733.   a_[6]=a6;a_[7]=a7;a_[8]=a8;
  734. #define AUTOARGS9(a1,a2,a3,a4,a5,a6,a7,a8,a9)                   \
  735.   TAutoArgs<9>a_;a_[1]=a1;a_[2]=a2;a_[3]=a3;a_[4]=a4;a_[5]=a5;  \
  736.   a_[6]=a6;a_[7]=a7;a_[8]=a8;a_[9]=a9;
  737. #define AUTOARGS10(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)              \
  738.   TAutoArgs<10>a_;a_[1]=a1;a_[2]=a2;a_[3]=a3;a_[4]=a4;a_[5]=a5; \
  739.   a_[6]=a6;a_[7]=a7;a_[8]=a8;a_[9]=a9;a_[10]=a10;
  740.  
  741. #define AUTOCALL_METHOD_RET        return Invoke(acMethod,  a_, i_, i_);
  742. #define AUTOCALL_METHOD_VOID              Invoke(acMethod,  a_, i_, i_);
  743. #define AUTOCALL_METHOD_REF(prx) prx.Bind(Invoke(acMethod,  a_, i_, i_));
  744. #define AUTOCALL_METHOD_CONV(t)  return t(Invoke(acMethod,  a_, i_, i_));
  745.  
  746. #define AUTOCALL_PROP_GET          return Invoke(acPropGet, a_, i_, i_);
  747. #define AUTOCALL_PROP_SET(val) a_[0]=val; Invoke(acPropSet, a_, i_, i_);
  748. #define AUTOCALL_PROP_REF(prx)   prx.Bind(Invoke(acPropGet, a_, i_, i_));
  749. #define AUTOCALL_PROP_CONV(t)    return t(Invoke(acPropGet, a_, i_, i_));
  750.  
  751. #endif  // OCF_AUTOMACR_H
  752.  
  753.