CellModules
hooktools.hpp File Reference
#include <array>
#include <vector>
#include "introspect.hpp"

Go to the source code of this file.

Macros

#define HOOKS_ENUM(...)   enum Hooks { __VA_ARGS__, LAST };
 
#define CREATE_MC1(m1)   CREATE_METHOD_CHECKS(m1);
 
#define CREATE_MC2(m1, m2)
 
#define CREATE_MC3(m1, m2, m3)
 
#define CREATE_MC4(m1, m2, m3, m4)
 
#define CREATE_MC5(m1, m2, m3, m4, m5)
 
#define CREATE_MC6(m1, m2, m3, m4, m5, m6)
 
#define CREATE_MC7(m1, m2, m3, m4, m5, m6, m7)
 
#define CREATE_MC8(m1, m2, m3, m4, m5, m6, m7, m8)
 
#define CREATE_MC9(m1, m2, m3, m4, m5, m6, m7, m8, m9)
 
#define OVERLOADED_MACRO(M, ...)   _OVR(M, _COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__)
 
#define _OVR(macroName, number_of_args)   _OVR_EXPAND(macroName, number_of_args)
 
#define _OVR_EXPAND(macroName, number_of_args)   macroName##number_of_args
 
#define _COUNT_ARGS(...)   _ARG_PATTERN_MATCH(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
 
#define _ARG_PATTERN_MATCH(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...)   N
 
#define HCHK_M(hName)
 
#define HCHK_M1(h1)   HCHK_M(h1)
 
#define HCHK_M2(h1, h2)
 
#define HCHK_M3(h1, h2, h3)
 
#define HCHK_M4(h1, h2, h3, h4)
 
#define HCHK_M5(h1, h2, h3, h4, h5)
 
#define HCHK_M6(h1, h2, h3, h4, h5, h6)
 
#define HCHK_M7(h1, h2, h3, h4, h5, h6, h7)
 
#define HCHK_M8(h1, h2, h3, h4, h5, h6, h7, h8)
 
#define HCHK_M9(h1, h2, h3, h4, h5, h6, h7, h8, h9)
 
#define H_REG(hName)   hookChecker<decltype(this), hook_s>::register_##hName(this, p)
 
#define H_REG1(h1)   H_REG(h1);
 
#define H_REG2(h1, h2)
 
#define H_REG3(h1, h2, h3)
 
#define H_REG4(h1, h2, h3, h4)
 
#define H_REG5(h1, h2, h3, h4, h5)
 
#define H_REG6(h1, h2, h3, h4, h5, h6)
 
#define H_REG7(h1, h2, h3, h4, h5, h6, h7)
 
#define H_REG8(h1, h2, h3, h4, h5, h6, h7, h8)
 
#define H_REG9(h1, h2, h3, h4, h5, h6, h7, h8, h9)
 
#define DECLARE_HOOK(...)
 

Macro Definition Documentation

◆ _ARG_PATTERN_MATCH

#define _ARG_PATTERN_MATCH (   _1,
  _2,
  _3,
  _4,
  _5,
  _6,
  _7,
  _8,
  _9,
  N,
  ... 
)    N

Definition at line 70 of file hooktools.hpp.

◆ _COUNT_ARGS

#define _COUNT_ARGS (   ...)    _ARG_PATTERN_MATCH(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)

Definition at line 69 of file hooktools.hpp.

◆ _OVR

#define _OVR (   macroName,
  number_of_args 
)    _OVR_EXPAND(macroName, number_of_args)

Definition at line 66 of file hooktools.hpp.

◆ _OVR_EXPAND

#define _OVR_EXPAND (   macroName,
  number_of_args 
)    macroName##number_of_args

Definition at line 67 of file hooktools.hpp.

◆ CREATE_MC1

#define CREATE_MC1 (   m1)    CREATE_METHOD_CHECKS(m1);

Definition at line 11 of file hooktools.hpp.

◆ CREATE_MC2

#define CREATE_MC2 (   m1,
  m2 
)
Value:
CREATE_METHOD_CHECKS(m2);
#define CREATE_METHOD_CHECKS(method)
Definition: introspect.hpp:38

Definition at line 12 of file hooktools.hpp.

◆ CREATE_MC3

#define CREATE_MC3 (   m1,
  m2,
  m3 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3);

Definition at line 15 of file hooktools.hpp.

◆ CREATE_MC4

#define CREATE_MC4 (   m1,
  m2,
  m3,
  m4 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4);

Definition at line 19 of file hooktools.hpp.

◆ CREATE_MC5

#define CREATE_MC5 (   m1,
  m2,
  m3,
  m4,
  m5 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4); \
CREATE_METHOD_CHECKS(m5);

Definition at line 24 of file hooktools.hpp.

◆ CREATE_MC6

#define CREATE_MC6 (   m1,
  m2,
  m3,
  m4,
  m5,
  m6 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4); \
CREATE_METHOD_CHECKS(m5); \
CREATE_METHOD_CHECKS(m6);

Definition at line 30 of file hooktools.hpp.

◆ CREATE_MC7

#define CREATE_MC7 (   m1,
  m2,
  m3,
  m4,
  m5,
  m6,
  m7 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4); \
CREATE_METHOD_CHECKS(m5); \
CREATE_METHOD_CHECKS(m6); \
CREATE_METHOD_CHECKS(m7);

Definition at line 37 of file hooktools.hpp.

◆ CREATE_MC8

#define CREATE_MC8 (   m1,
  m2,
  m3,
  m4,
  m5,
  m6,
  m7,
  m8 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4); \
CREATE_METHOD_CHECKS(m5); \
CREATE_METHOD_CHECKS(m6); \
CREATE_METHOD_CHECKS(m7); \
CREATE_METHOD_CHECKS(m8);

Definition at line 45 of file hooktools.hpp.

◆ CREATE_MC9

#define CREATE_MC9 (   m1,
  m2,
  m3,
  m4,
  m5,
  m6,
  m7,
  m8,
  m9 
)
Value:
CREATE_METHOD_CHECKS(m2); \
CREATE_METHOD_CHECKS(m3); \
CREATE_METHOD_CHECKS(m4); \
CREATE_METHOD_CHECKS(m5); \
CREATE_METHOD_CHECKS(m6); \
CREATE_METHOD_CHECKS(m7); \
CREATE_METHOD_CHECKS(m8); \
CREATE_METHOD_CHECKS(m9);

Definition at line 54 of file hooktools.hpp.

◆ DECLARE_HOOK

#define DECLARE_HOOK (   ...)
Value:
HOOKS_ENUM(__VA_ARGS__) \
OVERLOADED_MACRO(CREATE_MC, __VA_ARGS__) \
CREATE_METHOD_CHECKS(onRegister); \
template <class HookableClass, class hook_s> struct hookChecker { \
using H = std::remove_pointer_t<std::remove_reference_t<HookableClass>>; \
using hook_t = std::function<hook_s>; \
template <class P> \
static std::enable_if_t<is_onRegister_callable<P, hook_s>::value, hook_t> \
getOnRegister(P &p) { \
return [&](H *hc) { p.onRegister(hc); }; \
} \
\
template <class P> \
static std::enable_if_t<!is_onRegister_callable<P, hook_s>::value, hook_t> \
getOnRegister(P &) { \
return [&](H *) {}; \
} \
OVERLOADED_MACRO(HCHK_M, __VA_ARGS__) \
}; \
using hook_t = std::function<hook_s>; \
std::array<std::vector<hook_t>, Hooks::LAST> hooks; \
template <class P> hook_t registerPlugin(P &p) { \
OVERLOADED_MACRO(H_REG, __VA_ARGS__) \
return hookChecker<decltype(this), hook_s>::getOnRegister(p); \
}
#define H_REG(hName)
Definition: hooktools.hpp:136
#define HCHK_M(hName)
Definition: hooktools.hpp:72
#define HOOKS_ENUM(...)
Definition: hooktools.hpp:9

Definition at line 192 of file hooktools.hpp.

◆ H_REG

#define H_REG (   hName)    hookChecker<decltype(this), hook_s>::register_##hName(this, p)

Definition at line 136 of file hooktools.hpp.

◆ H_REG1

#define H_REG1 (   h1)    H_REG(h1);

Definition at line 138 of file hooktools.hpp.

◆ H_REG2

#define H_REG2 (   h1,
  h2 
)
Value:
H_REG(h1); \
H_REG(h2);

Definition at line 139 of file hooktools.hpp.

◆ H_REG3

#define H_REG3 (   h1,
  h2,
  h3 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3);

Definition at line 142 of file hooktools.hpp.

◆ H_REG4

#define H_REG4 (   h1,
  h2,
  h3,
  h4 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4);

Definition at line 146 of file hooktools.hpp.

◆ H_REG5

#define H_REG5 (   h1,
  h2,
  h3,
  h4,
  h5 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4); \
H_REG(h5);

Definition at line 151 of file hooktools.hpp.

◆ H_REG6

#define H_REG6 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4); \
H_REG(h5); \
H_REG(h6);

Definition at line 157 of file hooktools.hpp.

◆ H_REG7

#define H_REG7 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4); \
H_REG(h5); \
H_REG(h6); \
H_REG(h7);

Definition at line 164 of file hooktools.hpp.

◆ H_REG8

#define H_REG8 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7,
  h8 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4); \
H_REG(h5); \
H_REG(h6); \
H_REG(h7); \
H_REG(h8);

Definition at line 172 of file hooktools.hpp.

◆ H_REG9

#define H_REG9 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7,
  h8,
  h9 
)
Value:
H_REG(h1); \
H_REG(h2); \
H_REG(h3); \
H_REG(h4); \
H_REG(h5); \
H_REG(h6); \
H_REG(h7); \
H_REG(h8); \
H_REG(h9);

Definition at line 181 of file hooktools.hpp.

◆ HCHK_M

#define HCHK_M (   hName)
Value:
template <class P> \
static std::enable_if_t<is_##hName##_callable<P, hook_s>::value> register_##hName( \
H *c, P &p) { \
c->registerHook(Hooks::hName, [&](H *hc) { p.hName(hc); }); \
} \
template <class P> \
static std::enable_if_t<!is_##hName##_callable<P, hook_s>::value> register_##hName( \
H *, P &) {}

Definition at line 72 of file hooktools.hpp.

◆ HCHK_M1

#define HCHK_M1 (   h1)    HCHK_M(h1)

Definition at line 82 of file hooktools.hpp.

◆ HCHK_M2

#define HCHK_M2 (   h1,
  h2 
)
Value:
HCHK_M(h1) \
HCHK_M(h2)

Definition at line 83 of file hooktools.hpp.

◆ HCHK_M3

#define HCHK_M3 (   h1,
  h2,
  h3 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3)

Definition at line 86 of file hooktools.hpp.

◆ HCHK_M4

#define HCHK_M4 (   h1,
  h2,
  h3,
  h4 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4)

Definition at line 90 of file hooktools.hpp.

◆ HCHK_M5

#define HCHK_M5 (   h1,
  h2,
  h3,
  h4,
  h5 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4) \
HCHK_M(h5)

Definition at line 95 of file hooktools.hpp.

◆ HCHK_M6

#define HCHK_M6 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4) \
HCHK_M(h5) \
HCHK_M(h6)

Definition at line 101 of file hooktools.hpp.

◆ HCHK_M7

#define HCHK_M7 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4) \
HCHK_M(h5) \
HCHK_M(h6) \
HCHK_M(h7)

Definition at line 108 of file hooktools.hpp.

◆ HCHK_M8

#define HCHK_M8 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7,
  h8 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4) \
HCHK_M(h5) \
HCHK_M(h6) \
HCHK_M(h7) \
HCHK_M(h8)

Definition at line 116 of file hooktools.hpp.

◆ HCHK_M9

#define HCHK_M9 (   h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  h7,
  h8,
  h9 
)
Value:
HCHK_M(h1) \
HCHK_M(h2) \
HCHK_M(h3) \
HCHK_M(h4) \
HCHK_M(h5) \
HCHK_M(h6) \
HCHK_M(h7) \
HCHK_M(h8) \
HCHK_M(h9)

Definition at line 125 of file hooktools.hpp.

◆ HOOKS_ENUM

#define HOOKS_ENUM (   ...)    enum Hooks { __VA_ARGS__, LAST };

Definition at line 9 of file hooktools.hpp.

◆ OVERLOADED_MACRO

#define OVERLOADED_MACRO (   M,
  ... 
)    _OVR(M, _COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__)

Definition at line 65 of file hooktools.hpp.