Skip to content

Commit

Permalink
primitive const reference as args
Browse files Browse the repository at this point in the history
  • Loading branch information
lucklove committed Feb 13, 2016
1 parent da3b77d commit 50b2f9d
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 62 deletions.
6 changes: 3 additions & 3 deletions inc/nua/function.hh
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ namespace nua
using function_base::function_base;
using function_base::push;

Ret operator()(Args... args);
Ret operator()(Args... args) const;
};

template <typename... Args>
Expand All @@ -48,7 +48,7 @@ namespace nua
using function_base::function_base;
using function_base::push;

void operator()(Args... args);
void operator()(Args... args) const;
};

template <typename... Rets, typename... Args>
Expand All @@ -57,7 +57,7 @@ namespace nua
using function_base::function_base;
using function_base::push;

std::tuple<Rets...> operator()(Args... args);
std::tuple<Rets...> operator()(Args... args) const;
};
}

6 changes: 3 additions & 3 deletions inc/nua/function_impl.hh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
namespace nua
{
template <typename Ret, typename... Args>
Ret function<Ret(Args...)>::operator()(Args... args)
Ret function<Ret(Args...)>::operator()(Args... args) const
{
StackGuard sg{l_};
int handler_index = ErrorHandler::set_error_handler(l_);
Expand All @@ -21,7 +21,7 @@ namespace nua
}

template <typename... Args>
void function<void(Args...)>::operator()(Args... args)
void function<void(Args...)>::operator()(Args... args) const
{
StackGuard sg{l_};
int handler_index = ErrorHandler::set_error_handler(l_);
Expand All @@ -31,7 +31,7 @@ namespace nua
}

template <typename... Rets, typename... Args>
std::tuple<Rets...> function<std::tuple<Rets...>(Args...)>::operator()(Args... args)
std::tuple<Rets...> function<std::tuple<Rets...>(Args...)>::operator()(Args... args) const
{
StackGuard sg{l_};
int handler_index = ErrorHandler::set_error_handler(l_);
Expand Down
16 changes: 11 additions & 5 deletions inc/nua/stack.hh
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ namespace nua
}

template <typename T>
typename std::enable_if<!is_primitive<T>::value, T>::type
typename std::enable_if<!is_primitive<typename std::decay<T>::type>::value, T>::type
get(lua_State* l, int index)
{
static_assert(!std::is_rvalue_reference<T>::value, "not support rvalue reference");
Expand Down Expand Up @@ -103,7 +103,10 @@ namespace nua
}

template <typename T>
typename std::enable_if<std::is_integral<T>::value || std::is_floating_point<T>::value, T>::type
typename std::enable_if<
std::is_integral<typename std::decay<T>::type>::value || std::is_floating_point<typename std::decay<T>::type>::value,
typename std::decay<T>::type
>::type
get(lua_State* l, int index)
{
if(lua_isboolean(l, index))
Expand All @@ -123,7 +126,7 @@ namespace nua
}

template <typename T>
typename std::enable_if<std::is_same<T, std::string>::value, std::string>::type
typename std::enable_if<std::is_same<typename std::decay<T>::type, std::string>::value, std::string>::type
get(lua_State* l, int index)
{
if(lua_isstring(l, index))
Expand All @@ -133,7 +136,7 @@ namespace nua
}

template <typename T>
typename std::enable_if<std::is_same<T, std::nullptr_t>::value, std::nullptr_t>::type
typename std::enable_if<std::is_same<typename std::decay<T>::type, std::nullptr_t>::value, std::nullptr_t>::type
get(lua_State* l, int index)
{
if(!lua_isnil(l, index))
Expand All @@ -145,7 +148,10 @@ namespace nua
}

template <typename T>
typename std::enable_if<std::is_base_of<nua::function_base, T>::value, T>::type
typename std::enable_if<
std::is_base_of<nua::function_base, typename std::decay<T>::type>::value,
typename std::decay<T>::type
>::type
get(lua_State* l, int index)
{
lua_pushvalue(l, index);
Expand Down
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ SET(TEST_SOURCES
set_class.cc
type_error.cc
reference_and_value_combination.cc
primitive_const_reference.cc
function.cc
)

Expand Down
22 changes: 0 additions & 22 deletions test/function.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,28 +50,6 @@ TEST_CASE(return_multi)
TEST_CHECK(std::get<2>(t) == 3);
}

TEST_CASE(as_arg)
{
nua::Context ctx;

ctx["take_fun_arg"] = [](nua::function<int(int, int)> func, int a, int b)
{
return func(a, b);
};

ctx(R"(
function add(a, b)
return a + b
end
function pass_add(x, y)
return take_fun_arg(add, x, y)
end
)");

TEST_CHECK(ctx["pass_add"](3, 5).get<int>() == 8);
}

TEST_CASE(closure)
{
nua::Context ctx;
Expand Down
51 changes: 51 additions & 0 deletions test/primitive_const_reference.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include "UnitTest.hh"
#include "nua/nua.hh"

TEST_CASE(const_string_reference)
{
nua::Context ctx;
ctx["test"] = [](const std::string& s) { TEST_CHECK(s == "nua"); };
ctx["test"]("nua");
}

TEST_CASE(const_function_reference)
{
nua::Context ctx;

ctx["take_fun_arg"] = [](const nua::function<int(int, int)>& func, int a, int b)
{
return func(a, b);
};

ctx(R"(
function add(a, b)
return a + b
end
function pass_add(x, y)
return take_fun_arg(add, x, y)
end
)");

TEST_CHECK(ctx["pass_add"](3, 5).get<int>() == 8);
}

TEST_CASE(const_number_reference)
{
nua::Context ctx;
ctx["test_int"] = [](const int& v) { TEST_CHECK(v == 47); };
ctx["test_int"](47);
ctx["test_long"] = [](const long& v) { TEST_CHECK(v == 233); };
ctx["test_long"](233);
ctx["test_float"] = [](const float& v) { TEST_CHECK(v == 2.5); };
ctx["test_float"](2.5);
ctx["test_double"] = [](const double& v) { TEST_CHECK(v == 3.14159); };
ctx["test_double"](3.14159);
}

TEST_CASE(const_nullptr_type)
{
nua::Context ctx;
ctx["test"] = [](const std::nullptr_t& v) { TEST_CHECK(v == nullptr); };
ctx["test"](nullptr);
}
29 changes: 0 additions & 29 deletions test/test.cc
Original file line number Diff line number Diff line change
@@ -1,31 +1,2 @@
#define TEST_MAIN
#include "UnitTest.hh"
#include "nua/nua.hh"

TEST_CASE(test)
{
nua::Context st{true};
struct Obj2
{ void print() { std::cout << "obj2" << std::endl; } };
struct Obj
{
Obj2& get_obj2()
{return obj2; }
void print()
{ std::cout << "obj1" << std::endl; }
Obj2 obj2;
};

st.setClass<Obj>("obj2", &Obj::get_obj2, "print", &Obj::print);
st.setClass<Obj2>("print", &Obj2::print);
st(R"(
function test(cpp_obj)
cpp_obj:print()
local cpp_obj2 = cpp_obj:obj2()
cpp_obj:print()
cpp_obj2:print()
end
)");
Obj o;
st["test"](o);
}

0 comments on commit 50b2f9d

Please sign in to comment.