namespace Binders
{
// Binding helpers
template<typename _TC, typename _TR>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)() const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4, _T5), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4, _T5) const, hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4, _T5, _T6), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (_TC::*fn)(_T0, _T1, _T2, _T3, _T4, _T5, _T6) const, hh_u32 fnFlags = 0);
// thunk binders. the first arg (_TC*) must be the 'this' pointer.
template<typename _TC, typename _TR>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1, _T2), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1, _T2, _T3), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1, _T2, _T3, _T4), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1, _T2, _T3, _T4, _T5), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__cdecl *fn)(_TC*, _T0, _T1, _T2, _T3, _T4, _T5, _T6), hh_u32 fnFlags = 0);
#ifdef HH_HAS_STDCALL
template<typename _TC, typename _TR>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1, _T2), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1, _T2, _T3), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1, _T2, _T3, _T4), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1, _T2, _T3, _T4, _T5), hh_u32 fnFlags = 0);
template<typename _TC, typename _TR, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6>
bool BindMemberFunction(CCompilerTypeLibrary *typeLib, CCompilerTypeClass:

RawMemberFunction &mFunc, _TR (__stdcall *fn)(_TC*, _T0, _T1, _T2, _T3, _T4, _T5, _T6), hh_u32 fnFlags = 0);
#endif
//----------------------------------------------------------------------------
class CTypeBinder
{
private:
PCompilerTypeLibrary m_TypeLib;
PCompilerTypeClass m_TypeClass;
public:
CTypeBinder(const PCompilerTypeLibrary &typeLib, const PCompilerTypeClass &typeClass) : m_TypeLib(typeLib), m_TypeClass(typeClass) {}
template<typename _TC>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1, typename _T2>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1, typename _T2, typename _T3>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC, typename _T0, typename _T1, typename _T2, typename _T3, typename _T4, typename _T5, typename _T6>
bool BindConstructor(hh_u32 fnFlags = 0);
template<typename _TC>
bool BindDestructor(hh_u32 fnFlags = 0);
template<typename _FnPtr>
bool BindConstructorThunk(_FnPtr fn, hh_u32 fnFlags = 0);
template<typename _TC>
bool BindConstructorThunk(void (__cdecl *fn)(_TC*), hh_u32 fnFlags = 0); // default ctor
template<typename _TC>
bool BindDestructorThunk(void (__cdecl *fn)(_TC*), hh_u32 fnFlags = 0);
#ifdef HH_HAS_STDCALL
template<typename _TC>
bool BindConstructorThunk(void (__stdcall *fn)(_TC*), hh_u32 fnFlags = 0); // default ctor
template<typename _TC>
bool BindDestructorThunk(void (__stdcall *fn)(_TC*), hh_u32 fnFlags = 0);
#endif
// operators
template<typename _FnPtr>
bool BindMemberFunction(CCompilerTypeClass::EOp op, _FnPtr fn, hh_u32 fnFlags = 0);
// standard members
template<typename _FnPtr>
bool BindMemberFunction(const CStringView &symbol, _FnPtr fn, hh_u32 fnFlags = 0);
};
}