////// patcher_defines.h //////////////
#ifndef ____C_CPP_PATCHER_DEFINISIONS_INCL____
#error Don't #include the file patcher_defines.h
#endif
#undef ____C_CPP_PATCHER_DEFINISIONS_INCL____
#define DEFINE_T_CLASSES_LIST_0
#define DEFINE_T_CLASSES_LIST_1 DEFINE_T_CLASSES_LIST_0, class TArg1
#define DEFINE_T_CLASSES_LIST_2 DEFINE_T_CLASSES_LIST_1, class TArg2
#define DEFINE_T_CLASSES_LIST_3 DEFINE_T_CLASSES_LIST_2, class TArg3
#define DEFINE_T_CLASSES_LIST_4 DEFINE_T_CLASSES_LIST_3, class TArg4
#define DEFINE_T_CLASSES_LIST_5 DEFINE_T_CLASSES_LIST_4, class TArg5
#define DEFINE_T_CLASSES_LIST_6 DEFINE_T_CLASSES_LIST_5, class TArg6
#define DEFINE_T_CLASSES_LIST_7 DEFINE_T_CLASSES_LIST_6, class TArg7
#define DEFINE_T_CLASSES_LIST_8 DEFINE_T_CLASSES_LIST_7, class TArg8
#define DEFINE_T_CLASSES_LIST_9 DEFINE_T_CLASSES_LIST_8, class TArg9
#define DEFINE_T_CLASSES_LIST_10 DEFINE_T_CLASSES_LIST_9, class TArg10
#define DEFINE_T_CLASSES_LIST_11 DEFINE_T_CLASSES_LIST_10, class TArg11
#define DEFINE_T_CLASSES_LIST_12 DEFINE_T_CLASSES_LIST_11, class TArg12
#define DEFINE_T_CLASSES_LIST_13 DEFINE_T_CLASSES_LIST_12, class TArg13
#define DEFINE_T_CLASSES_LIST_14 DEFINE_T_CLASSES_LIST_13, class TArg14
#define DEFINE_T_CLASSES_LIST_15 DEFINE_T_CLASSES_LIST_14, class TArg15
#define DEFINE_T_CLASSES_LIST_16 DEFINE_T_CLASSES_LIST_15, class TArg16
#define DEFINE_T_CLASSES_LIST_17 DEFINE_T_CLASSES_LIST_16, class TArg17
#define DEFINE_T_CLASSES_LIST_18 DEFINE_T_CLASSES_LIST_17, class TArg18
#define DEFINE_T_CLASSES_LIST_19 DEFINE_T_CLASSES_LIST_18, class TArg19
#define DEFINE_T_CLASSES_LIST_20 DEFINE_T_CLASSES_LIST_19, class TArg20
#define DEFINE_T_CLASSES_LIST_21 DEFINE_T_CLASSES_LIST_20, class TArg21
#define DEFINE_T_CLASSES_LIST_22 DEFINE_T_CLASSES_LIST_21, class TArg22
#define DEFINE_T_CLASSES_LIST_23 DEFINE_T_CLASSES_LIST_22, class TArg23
#define DEFINE_T_CLASSES_LIST_24 DEFINE_T_CLASSES_LIST_23, class TArg24
#define DEFINE_T_CLASSES_LIST_25 DEFINE_T_CLASSES_LIST_24, class TArg25
#define DEFINE_T_CLASSES_LIST_26 DEFINE_T_CLASSES_LIST_25, class TArg26
#define DEFINE_T_CLASSES_LIST_27 DEFINE_T_CLASSES_LIST_26, class TArg27
#define DEFINE_T_CLASSES_LIST_28 DEFINE_T_CLASSES_LIST_27, class TArg28
#define DEFINE_T_CLASSES_LIST_29 DEFINE_T_CLASSES_LIST_28, class TArg29
#define DEFINE_T_CLASSES_LIST_30 DEFINE_T_CLASSES_LIST_29, class TArg30
#define DEFINE_T_CLASSES_LIST_31 DEFINE_T_CLASSES_LIST_30, class TArg31
#define DEFINE_T_CLASSES_LIST_32 DEFINE_T_CLASSES_LIST_31, class TArg32
#define DEFINE_T_CLASSES_LIST_33 DEFINE_T_CLASSES_LIST_32, class TArg33
#define DEFINE_T_CLASSES_LIST_34 DEFINE_T_CLASSES_LIST_33, class TArg34
#define DEFINE_T_CLASSES_LIST_35 DEFINE_T_CLASSES_LIST_34, class TArg35
#define DEFINE_T_CLASSES_LIST_36 DEFINE_T_CLASSES_LIST_35, class TArg36
#define DEFINE_T_CLASSES_LIST_37 DEFINE_T_CLASSES_LIST_36, class TArg37
#define DEFINE_T_CLASSES_LIST_38 DEFINE_T_CLASSES_LIST_37, class TArg38
#define DEFINE_T_CLASSES_LIST_39 DEFINE_T_CLASSES_LIST_38, class TArg39
#define DEFINE_T_CLASSES_LIST_40 DEFINE_T_CLASSES_LIST_39, class TArg40
#define DEFINE_T_CLASSES_LIST_41 DEFINE_T_CLASSES_LIST_40, class TArg41
#define DEFINE_T_CLASSES_LIST_42 DEFINE_T_CLASSES_LIST_41, class TArg42
#define DEFINE_T_CLASSES_LIST_43 DEFINE_T_CLASSES_LIST_42, class TArg43
#define DEFINE_T_CLASSES_LIST_44 DEFINE_T_CLASSES_LIST_43, class TArg44
#define DEFINE_T_CLASSES_LIST_45 DEFINE_T_CLASSES_LIST_44, class TArg45
#define DEFINE_T_CLASSES_LIST_46 DEFINE_T_CLASSES_LIST_45, class TArg46
#define DEFINE_T_CLASSES_LIST_47 DEFINE_T_CLASSES_LIST_46, class TArg47
#define DEFINE_T_CLASSES_LIST_48 DEFINE_T_CLASSES_LIST_47, class TArg48
#define DEFINE_T_CLASSES_LIST_49 DEFINE_T_CLASSES_LIST_48, class TArg49
#define DEFINE_T_CLASSES_LIST_50 DEFINE_T_CLASSES_LIST_49, class TArg50
#define DEFINE_T_ARGS_N_0
#define DEFINE_T_ARGS_N_1 TArg1
#define DEFINE_T_ARGS_N_2 DEFINE_T_ARGS_N_1, TArg2
#define DEFINE_T_ARGS_N_3 DEFINE_T_ARGS_N_2, TArg3
#define DEFINE_T_ARGS_N_4 DEFINE_T_ARGS_N_3, TArg4
#define DEFINE_T_ARGS_N_5 DEFINE_T_ARGS_N_4, TArg5
#define DEFINE_T_ARGS_N_6 DEFINE_T_ARGS_N_5, TArg6
#define DEFINE_T_ARGS_N_7 DEFINE_T_ARGS_N_6, TArg7
#define DEFINE_T_ARGS_N_8 DEFINE_T_ARGS_N_7, TArg8
#define DEFINE_T_ARGS_N_9 DEFINE_T_ARGS_N_8, TArg9
#define DEFINE_T_ARGS_N_10 DEFINE_T_ARGS_N_9, TArg10
#define DEFINE_T_ARGS_N_11 DEFINE_T_ARGS_N_10, TArg11
#define DEFINE_T_ARGS_N_12 DEFINE_T_ARGS_N_11, TArg12
#define DEFINE_T_ARGS_N_13 DEFINE_T_ARGS_N_12, TArg13
#define DEFINE_T_ARGS_N_14 DEFINE_T_ARGS_N_13, TArg14
#define DEFINE_T_ARGS_N_15 DEFINE_T_ARGS_N_14, TArg15
#define DEFINE_T_ARGS_N_16 DEFINE_T_ARGS_N_15, TArg16
#define DEFINE_T_ARGS_N_17 DEFINE_T_ARGS_N_16, TArg17
#define DEFINE_T_ARGS_N_18 DEFINE_T_ARGS_N_17, TArg18
#define DEFINE_T_ARGS_N_19 DEFINE_T_ARGS_N_18, TArg19
#define DEFINE_T_ARGS_N_20 DEFINE_T_ARGS_N_19, TArg20
#define DEFINE_T_ARGS_N_21 DEFINE_T_ARGS_N_20, TArg21
#define DEFINE_T_ARGS_N_22 DEFINE_T_ARGS_N_21, TArg22
#define DEFINE_T_ARGS_N_23 DEFINE_T_ARGS_N_22, TArg23
#define DEFINE_T_ARGS_N_24 DEFINE_T_ARGS_N_23, TArg24
#define DEFINE_T_ARGS_N_25 DEFINE_T_ARGS_N_24, TArg25
#define DEFINE_T_ARGS_N_26 DEFINE_T_ARGS_N_25, TArg26
#define DEFINE_T_ARGS_N_27 DEFINE_T_ARGS_N_26, TArg27
#define DEFINE_T_ARGS_N_28 DEFINE_T_ARGS_N_27, TArg28
#define DEFINE_T_ARGS_N_29 DEFINE_T_ARGS_N_28, TArg29
#define DEFINE_T_ARGS_N_30 DEFINE_T_ARGS_N_29, TArg30
#define DEFINE_T_ARGS_N_31 DEFINE_T_ARGS_N_30, TArg31
#define DEFINE_T_ARGS_N_32 DEFINE_T_ARGS_N_31, TArg32
#define DEFINE_T_ARGS_N_33 DEFINE_T_ARGS_N_32, TArg33
#define DEFINE_T_ARGS_N_34 DEFINE_T_ARGS_N_33, TArg34
#define DEFINE_T_ARGS_N_35 DEFINE_T_ARGS_N_34, TArg35
#define DEFINE_T_ARGS_N_36 DEFINE_T_ARGS_N_35, TArg36
#define DEFINE_T_ARGS_N_37 DEFINE_T_ARGS_N_36, TArg37
#define DEFINE_T_ARGS_N_38 DEFINE_T_ARGS_N_37, TArg38
#define DEFINE_T_ARGS_N_39 DEFINE_T_ARGS_N_38, TArg39
#define DEFINE_T_ARGS_N_40 DEFINE_T_ARGS_N_39, TArg40
#define DEFINE_T_ARGS_N_41 DEFINE_T_ARGS_N_40, TArg41
#define DEFINE_T_ARGS_N_42 DEFINE_T_ARGS_N_41, TArg42
#define DEFINE_T_ARGS_N_43 DEFINE_T_ARGS_N_42, TArg43
#define DEFINE_T_ARGS_N_44 DEFINE_T_ARGS_N_43, TArg44
#define DEFINE_T_ARGS_N_45 DEFINE_T_ARGS_N_44, TArg45
#define DEFINE_T_ARGS_N_46 DEFINE_T_ARGS_N_45, TArg46
#define DEFINE_T_ARGS_N_47 DEFINE_T_ARGS_N_46, TArg47
#define DEFINE_T_ARGS_N_48 DEFINE_T_ARGS_N_47, TArg48
#define DEFINE_T_ARGS_N_49 DEFINE_T_ARGS_N_48, TArg49
#define DEFINE_T_ARGS_N_50 DEFINE_T_ARGS_N_49, TArg50
#define DEFINE_2_N_ARGS_FUNCTIONS(N) TReturnVal (TClassSource::*&pfn_source)(DEFINE_T_ARGS_N_##N), TReturnVal (TClassTarget::*pfn_target) (DEFINE_T_ARGS_N_##N)
#define DEFINE_TEMPLATE(N) template<class TClassSource, class TClassTarget, class TReturnVal DEFINE_T_CLASSES_LIST_##N>
#define DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(N) DEFINE_TEMPLATE(N) \
explicit CPatch(DEFINE_2_N_ARGS_FUNCTIONS(N), \
bool patch_now = true, bool set_forever = false) \
: m_valid(false) \
, m_patched(false) \
, m_set_forever(set_forever) \
, m_PatchInstructionSet(0) \
, m_RestorePatchSet(0) \
{ \
HookClassFunctions(pfn_source, pfn_target, patch_now, set_forever); \
}
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(0)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(1)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(2)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(3)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(4)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(5)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(6)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(7)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(8)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(9)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(10)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(11)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(12)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(13)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(14)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(15)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(16)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(17)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(18)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(19)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(20)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(21)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(22)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(23)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(24)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(25)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(26)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(27)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(28)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(29)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(30)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(31)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(32)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(33)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(34)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(35)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(36)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(37)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(38)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(39)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(40)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(41)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(42)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(43)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(44)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(45)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(46)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(47)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(48)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(49)
DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(50)
////////////////// experimental, don't use //////////////////////////////////////
#define DEFINE_T_CLASSES_LIST_MN(M, N) DEFINE_T_CLASSES_LIST_##(M), TArg##N
#define DEFINE_TEMPLATE_MN(M,N) template<class TClassSource, class TClassTarget, class TReturnVal DEFINE_T_CLASSES_LIST_MN(M, N) > //DEFINE_T_CLASSES_LIST_##N>