From 52d03a66b15358e8fd2caeb5b063044c8aa839d2 Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Tue, 6 Jan 2015 14:41:36 -0700 Subject: [PATCH] Add future support, and fix returning of r-values --- include/chaiscript/chaiscript_stdlib.hpp | 10 ++++++++++ .../chaiscript/dispatchkit/bootstrap_stl.hpp | 19 +++++++++++++++++++ .../chaiscript/dispatchkit/handle_return.hpp | 5 +++++ unittests/future.chai | 17 +++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 unittests/future.chai diff --git a/include/chaiscript/chaiscript_stdlib.hpp b/include/chaiscript/chaiscript_stdlib.hpp index 8d4986a4..92483fd4 100644 --- a/include/chaiscript/chaiscript_stdlib.hpp +++ b/include/chaiscript/chaiscript_stdlib.hpp @@ -19,6 +19,11 @@ #include "dispatchkit/bootstrap_stl.hpp" #include "dispatchkit/boxed_value.hpp" +#ifndef CHAISCRIPT_NO_THREADS +#include +#endif + + /// @file /// /// This file generates the standard library that normal ChaiScript usage requires. @@ -40,6 +45,11 @@ namespace chaiscript lib->add(standard_library::map_type >("Map")); lib->add(standard_library::pair_type >("Pair")); +#ifndef CHAISCRIPT_NO_THREADS + lib->add(standard_library::future_type>("future")); + lib->add(chaiscript::fun (const std::function &)>([](const std::function &t_func){ return std::async(std::launch::async, t_func);}), "async"); +#endif + return lib; } diff --git a/include/chaiscript/dispatchkit/bootstrap_stl.hpp b/include/chaiscript/dispatchkit/bootstrap_stl.hpp index acb8344c..b3be6fc5 100644 --- a/include/chaiscript/dispatchkit/bootstrap_stl.hpp +++ b/include/chaiscript/dispatchkit/bootstrap_stl.hpp @@ -564,6 +564,25 @@ namespace chaiscript return m; } + + + + /// Add a MapType container + /// http://www.sgi.com/tech/stl/Map.html + template + ModulePtr future_type(const std::string &type, ModulePtr m = ModulePtr(new Module())) + { + m->add(user_type(), type); + + m->add(fun(&FutureType::valid), "valid"); + m->add(fun(&FutureType::get), "get"); + m->add(fun(&FutureType::wait), "wait"); + + return m; + } + + + } } } diff --git a/include/chaiscript/dispatchkit/handle_return.hpp b/include/chaiscript/dispatchkit/handle_return.hpp index 8f2ebfec..cb1c9773 100644 --- a/include/chaiscript/dispatchkit/handle_return.hpp +++ b/include/chaiscript/dispatchkit/handle_return.hpp @@ -37,6 +37,11 @@ namespace chaiscript { return const_var(r); } + + static Boxed_Value handle(Ret &&r) + { + return Boxed_Value(std::move(r)); + } }; template diff --git a/unittests/future.chai b/unittests/future.chai new file mode 100644 index 00000000..afb9afed --- /dev/null +++ b/unittests/future.chai @@ -0,0 +1,17 @@ +var func = fun(){ + var ret = 0; + for (var i = 0; i < 1000000; ++i) { + ret += i; + } + return ret; +} + + +var fut1 := async(func); +var fut2 := async(func); +var fut3 := async(func); +var fut4 := async(func); + +// simply executing without crashing is good enough for this test + +print(" ${fut1.get()} ${fut2.get()} ${fut3.get()} ${fut4.get()}")