From 5fa44d5eef388206d08c18c4ce1732eb5dcc56dd Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 19 May 2015 13:47:34 -0600 Subject: [PATCH 1/2] Automatically deduce types of lambda for fun() --- include/chaiscript/dispatchkit/bootstrap.hpp | 10 ++--- .../chaiscript/dispatchkit/bootstrap_stl.hpp | 37 +++++++++---------- .../dispatchkit/register_function.hpp | 20 ++++++++++ .../chaiscript/language/chaiscript_engine.hpp | 6 +-- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 291a75f..9a87c8b 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -57,7 +57,7 @@ namespace chaiscript typedef typename std::remove_extent::type ReturnType; const auto extent = std::extent::value; m->add(user_type(), type); - m->add(fun( + m->add(fun( [extent](T& t, size_t index)->ReturnType &{ if (extent > 0 && index >= extent) { throw std::range_error("Array index out of range. Received: " + std::to_string(index) + " expected < " + std::to_string(extent)); @@ -68,7 +68,7 @@ namespace chaiscript ), "[]" ); - m->add(fun( + m->add(fun( [extent](const T &t, size_t index)->const ReturnType &{ if (extent > 0 && index >= extent) { throw std::range_error("Array index out of range. Received: " + std::to_string(index) + " expected < " + std::to_string(extent)); @@ -79,7 +79,7 @@ namespace chaiscript ), "[]" ); - m->add(fun( + m->add(fun( [extent](const T &) { return extent; }), "size"); @@ -465,7 +465,7 @@ namespace chaiscript operators::assign(m); operators::equal(m); - m->add(fun([](const std::string &s) -> std::string { return s; }), "to_string"); + m->add(fun([](const std::string &s) -> std::string { return s; }), "to_string"); m->add(fun(&Bootstrap::bool_to_string), "to_string"); m->add(fun(&unknown_assign), "="); m->add(fun(&throw_exception), "throw"); @@ -503,7 +503,7 @@ namespace chaiscript m->add(fun(&ptr_assign::type>), "="); m->add(fun(&ptr_assign::type>), "="); m->add(chaiscript::base_class()); - m->add(fun &)>( + m->add(fun( [](dispatch::Assignable_Proxy_Function &t_lhs, const std::shared_ptr &t_rhs) { t_lhs.assign(t_rhs); } diff --git a/include/chaiscript/dispatchkit/bootstrap_stl.hpp b/include/chaiscript/dispatchkit/bootstrap_stl.hpp index 260dc99..ad31f6b 100644 --- a/include/chaiscript/dispatchkit/bootstrap_stl.hpp +++ b/include/chaiscript/dispatchkit/bootstrap_stl.hpp @@ -252,7 +252,7 @@ namespace chaiscript fun(std::function (std::mem_fn(static_cast(&ContainerType::at)))), "[]"); m->add( - fun( + fun( [](const ContainerType *c, int index) -> typename ContainerType::const_reference { return c->at(index); }), "[]"); @@ -277,9 +277,9 @@ namespace chaiscript template ModulePtr container_type(const std::string &/*type*/, ModulePtr m = std::make_shared()) { - m->add(fun([](const ContainerType *a) { return a->size(); } ), "size"); - m->add(fun([](const ContainerType *a) { return a->empty(); } ), "empty"); - m->add(fun([](ContainerType *a) { a->clear(); } ), "clear"); + m->add(fun([](const ContainerType *a) { return a->size(); } ), "size"); + m->add(fun([](const ContainerType *a) { return a->empty(); } ), "empty"); + m->add(fun([](ContainerType *a) { a->clear(); } ), "clear"); return m; } @@ -547,23 +547,20 @@ namespace chaiscript }()); - typedef std::function find_func; + m->add(fun([](const String *s, const String &f, size_t pos) { return s->find(f, pos); } ), "find"); + m->add(fun([](const String *s, const String &f, size_t pos) { return s->rfind(f, pos); } ), "rfind"); + m->add(fun([](const String *s, const String &f, size_t pos) { return s->find_first_of(f, pos); } ), "find_first_of"); + m->add(fun([](const String *s, const String &f, size_t pos) { return s->find_last_of(f, pos); } ), "find_last_of"); + m->add(fun([](const String *s, const String &f, size_t pos) { return s->find_last_not_of(f, pos); } ), "find_last_not_of"); + m->add(fun([](const String *s, const String &f, size_t pos) { return s->find_first_not_of(f, pos); } ), "find_first_not_of"); + m->add(fun([](String *s) { s->clear(); } ), "clear"); + m->add(fun([](const String *s) { return s->empty(); } ), "empty"); + m->add(fun([](const String *s) { return s->size(); } ), "size"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->find(f, pos); } )), "find"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->rfind(f, pos); } ) ), "rfind"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->find_first_of(f, pos); } ) ), "find_first_of"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->find_last_of(f, pos); } ) ), "find_last_of"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->find_last_not_of(f, pos); } ) ), "find_last_not_of"); - m->add(fun(find_func( [](const String *s, const String &f, size_t pos) { return s->find_first_not_of(f, pos); } ) ), "find_first_not_of"); - - m->add(fun( std::function( [](String *s) { return s->clear(); } ) ), "clear"); - m->add(fun( std::function( [](const String *s) { return s->empty(); } ) ), "empty"); - m->add(fun( std::function( [](const String *s) { return s->size(); } ) ), "size"); - - m->add(fun( std::function( [](const String *s) { return s->c_str(); } ) ), "c_str"); - m->add(fun( std::function( [](const String *s) { return s->data(); } ) ), "data"); - m->add(fun( std::function( [](const String *s, size_t pos, size_t len) { return s->substr(pos, len); } ) ), "substr"); + m->add(fun([](const String *s) { return s->c_str(); } ), "c_str"); + m->add(fun([](const String *s) { return s->data(); } ), "data"); + m->add(fun([](const String *s, size_t pos, size_t len) { return s->substr(pos, len); } ), "substr"); return m; } @@ -577,7 +574,7 @@ namespace chaiscript { m->add(user_type(), type); - m->add(fun([](const FutureType &t) { return t.valid(); }), "valid"); + m->add(fun([](const FutureType &t) { return t.valid(); }), "valid"); m->add(fun(&FutureType::get), "get"); m->add(fun(&FutureType::wait), "wait"); diff --git a/include/chaiscript/dispatchkit/register_function.hpp b/include/chaiscript/dispatchkit/register_function.hpp index ccfdb49..4998ede 100644 --- a/include/chaiscript/dispatchkit/register_function.hpp +++ b/include/chaiscript/dispatchkit/register_function.hpp @@ -36,6 +36,7 @@ namespace chaiscript return std::function(func); } + template std::function to_function(Ret (Class::*func)(Args...)) { @@ -62,6 +63,25 @@ namespace chaiscript #endif } + template + std::function to_function_callable(Ret (Class::*)(Args...), T t) + { + return std::function(t); + } + + template + std::function to_function_callable(Ret (Class::*)(Args...) const, T t) + { + return std::function(t); + } + + + template + auto to_function(T t) -> decltype(to_function_callable(&T::operator(), t)) + { + return to_function_callable(&T::operator(), t); + } + } } diff --git a/include/chaiscript/language/chaiscript_engine.hpp b/include/chaiscript/language/chaiscript_engine.hpp index 0592ec9..5b3602b 100644 --- a/include/chaiscript/language/chaiscript_engine.hpp +++ b/include/chaiscript/language/chaiscript_engine.hpp @@ -370,7 +370,7 @@ namespace chaiscript // m_engine.add(fun &)>(std::bind(&chaiscript::dispatch::Proxy_Function_Base::operator(), std::placeholders::_1, std::placeholders::_2, std::ref(m_engine.conversions()))), "call"); // - m_engine.add(fun &)>( + m_engine.add(fun( [=](const dispatch::Proxy_Function_Base &t_fun, const std::vector &t_params) { return t_fun(t_params, this->m_engine.conversions()); }), "call"); @@ -378,9 +378,9 @@ namespace chaiscript m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_type_name, std::ref(m_engine)), "name"); m_engine.add(fun(&chaiscript::detail::Dispatch_Engine::get_type, std::ref(m_engine)), "type"); - m_engine.add(fun([this](const std::string &t_type_name){ return this->m_engine.get_type(t_type_name, true); }), "type"); + m_engine.add(fun([this](const std::string &t_type_name){ return this->m_engine.get_type(t_type_name, true); }), "type"); - m_engine.add(fun &)>( + m_engine.add(fun( [=](const Type_Info &t_from, const Type_Info &t_to, const std::function &t_func) { m_engine.add(chaiscript::type_conversion(t_from, t_to, t_func)); } From da39b8403b371aa048f39e291dcf5372a15fafee Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 19 May 2015 14:15:21 -0600 Subject: [PATCH 2/2] Remove more usage of `new` --- .../chaiscript/dispatchkit/handle_return.hpp | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/include/chaiscript/dispatchkit/handle_return.hpp b/include/chaiscript/dispatchkit/handle_return.hpp index ed165e0..d028e85 100644 --- a/include/chaiscript/dispatchkit/handle_return.hpp +++ b/include/chaiscript/dispatchkit/handle_return.hpp @@ -54,9 +54,7 @@ namespace chaiscript { static Boxed_Value handle(const std::function &f) { return Boxed_Value( - std::shared_ptr( - new dispatch::Proxy_Function_Impl(f) - ) + chaiscript::make_shared>(f) ); } }; @@ -66,10 +64,8 @@ namespace chaiscript { static Boxed_Value handle(const std::function &f) { return Boxed_Value( - std::shared_ptr( - new Proxy_Function_Impl(f) - ) - ); + chaiscript::make_shared>(f) + ); } }; @@ -78,12 +74,7 @@ namespace chaiscript { static Boxed_Value handle(const std::shared_ptr> &f) { return Boxed_Value( - std::shared_ptr( - new Assignable_Proxy_Function_Impl( - std::ref(*f), - f - ) - ) + chaiscript::make_shared>(std::ref(*f),f) ); } }; @@ -93,13 +84,8 @@ namespace chaiscript { static Boxed_Value handle(const std::shared_ptr> &f) { return Boxed_Value( - std::shared_ptr( - new Assignable_Proxy_Function_Impl( - std::ref(*f), - f - ) - ) - ); + chaiscript::make_shared>(std::ref(*f),f) + ); } }; @@ -108,13 +94,8 @@ namespace chaiscript { static Boxed_Value handle(const std::shared_ptr> &f) { return Boxed_Value( - std::shared_ptr( - new Assignable_Proxy_Function_Impl( - std::ref(*f), - f - ) - ) - ); + chaiscript::make_shared>(std::ref(*f),f) + ); } }; @@ -123,20 +104,14 @@ namespace chaiscript { static Boxed_Value handle(std::function &f) { return Boxed_Value( - std::shared_ptr( - new Assignable_Proxy_Function_Impl( - std::ref(f), - std::shared_ptr>() - ) - ) - ); + chaiscript::make_shared>(std::ref(f), + std::shared_ptr>()) + ); } static Boxed_Value handle(const std::function &f) { return Boxed_Value( - std::shared_ptr( - new dispatch::Proxy_Function_Impl(f) - ) + chaiscript::make_shared>(f) ); } };