-
Notifications
You must be signed in to change notification settings - Fork 1
/
TemplateUtil.h
106 lines (90 loc) · 4.45 KB
/
TemplateUtil.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// TemplateUtil.h
// LuaLink
//
// Created by Tom Tondeur on 09/04/2015.
// Copyright (c) 2015 Tom Tondeur. All rights reserved.
//
#pragma once
#include "LuaStack.hpp"
#include <tuple>
namespace LuaLink {
namespace detail {
typedef int(*ArgErrorCbType)(lua_State*, int);
//build_tuple_from_stack
template<typename... T> struct build_tuple_from_lua_stack;
template<typename T_Head>
struct build_tuple_from_lua_stack<T_Head>
{
static std::tuple<T_Head> execute(lua_State* pLuaState, int argNum, bool& isOk, ArgErrorCbType onArgError, int& errRet)
{
auto var = LuaStack::getVariable<T_Head>(pLuaState, argNum, isOk);
if(!isOk)
errRet = onArgError(pLuaState, argNum);
return std::tuple<T_Head>(var);
}
};
template<typename T_Head, typename... T_Tail>
struct build_tuple_from_lua_stack<T_Head, T_Tail...>
{
static std::tuple<T_Head, T_Tail...> execute(lua_State* pLuaState, int argNum, bool& isOk, ArgErrorCbType onArgError, int& errRet)
{
auto tpl_head = build_tuple_from_lua_stack<T_Head>::execute(pLuaState, argNum, isOk, onArgError, errRet);
auto tpl_tail = build_tuple_from_lua_stack<T_Tail...>::execute(pLuaState, argNum+1, isOk, onArgError, errRet);
return std::tuple_cat(tpl_head, std::move(tpl_tail));
}
};
//call
template <typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl
{
static auto call(F f, Tuple && t) -> decltype(call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t)))
{
return call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));
}
};
template <typename F, typename Tuple, int Total, int... N>
struct call_impl<F, Tuple, true, Total, N...>
{
static auto call(F f, Tuple && t) -> decltype(f(std::get<N>(std::forward<Tuple>(t))...))
{
return f(std::get<N>(std::forward<Tuple>(t))...);
}
};
template <typename F, typename Tuple>
auto call(F f, Tuple && t) -> decltype(call_impl<F, Tuple, 0 == std::tuple_size<typename std::decay<Tuple>::type>::value, std::tuple_size<typename std::decay<Tuple>::type>::value>::call(f, std::forward<Tuple>(t)))
{
return call_impl<F, Tuple, 0 == std::tuple_size<typename std::decay<Tuple>::type>::value, std::tuple_size<typename std::decay<Tuple>::type>::value>::call(f, std::forward<Tuple>(t));
}
template <typename F, typename P, typename Tuple, bool Done, int Total, int... N>
struct call_mem_impl
{
static auto call(F f, P p, Tuple && t) -> decltype(call_mem_impl<F, P, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, p, std::forward<Tuple>(t)))
{
return call_mem_impl<F, P, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, p, std::forward<Tuple>(t));
}
};
template <typename F, typename P, typename Tuple, int Total, int... N>
struct call_mem_impl<F, P, Tuple, true, Total, N...>
{
static auto call(F f, P p, Tuple && t) -> decltype((p->*f)(std::get<N>(std::forward<Tuple>(t))...))
{
return (p->*f)(std::get<N>(std::forward<Tuple>(t))...);
}
};
template <typename F, typename P, typename Tuple>
auto call_mem(F f, P p, Tuple && t) -> decltype(call_mem_impl<F, P, Tuple, 0 == std::tuple_size<typename std::decay<Tuple>::type>::value, std::tuple_size<typename std::decay<Tuple>::type>::value>::call(f, p, std::forward<Tuple>(t)))
{
return call_mem_impl<F, P, Tuple, 0 == std::tuple_size<typename std::decay<Tuple>::type>::value, std::tuple_size<typename std::decay<Tuple>::type>::value>::call(f, p, std::forward<Tuple>(t));
}
struct CStrCmp {
bool operator()(const char* a, const char* b) const;
};
#ifdef LUALINK_DEFINE
bool CStrCmp::operator()(const char* a, const char* b) const
{
return strcmp(a, b) < 0;
}
#endif
}
}