9 #define DECL_THUNK0(ret, C, Name, cv) \
10 ret C::Name() cv { return pImpl->Name(); }
11 #define DECL_THUNK1(ret, C, Name, cv, T1) \
12 ret C::Name(T1 a) cv \
15 return pImpl->Name(std::forward<_t1&&>(a)); \
17 #define DECL_THUNK2(ret, C, Name, cv, T1, T2) \
18 ret C::Name(T1 a, T2 b) cv \
20 using _t1 = T1; using _t2 = T2; \
21 return pImpl->Name(std::forward<_t1&&>(a), std::forward<_t2&&>(b)); \
23 #define DECL_THUNK3(ret, C, Name, cv, T1, T2, T3) \
24 ret C::Name(T1 a, T2 b, T3 c) cv \
26 using _t1 = T1; using _t2 = T2; using _t3 = T3; \
27 return pImpl->Name(std::forward<_t1&&>(a), std::forward<_t2&&>(b), \
28 std::forward<_t3&&>(c)); \
30 #define DECL_THUNK6(ret, C, Name, cv, T1, T2, T3, T4, T5, T6) \
31 ret C::Name(T1 a, T2 b, T3 c, T4 d, T5 e, T6 f) cv \
33 using _t1 = T1; using _t2 = T2; using _t3 = T3; \
34 using _t4 = T4; using _t5 = T5; using _t6 = T6; \
35 return pImpl->Name(std::forward<_t1&&>(a), std::forward<_t2&&>(b), \
36 std::forward<_t3&&>(c), std::forward<_t4&&>(d), \
37 std::forward<_t5&&>(e), std::forward<_t6&&>(f)); \
40 template<bool V
, typename T
, typename
=EnableIfT
<std::is_same
<bool,RemoveRefT
<T
>>::value
>>
41 inline T
Expect(T
&& arg
)
44 return __builtin_expect(std::forward
<T
&&>(arg
), V
);
46 return std::forward
<T
&&>(arg
);
52 #endif /* ALURE_MAIN_H */