diff --git a/include/chaiscript/chaiscript_stdlib.hpp b/include/chaiscript/chaiscript_stdlib.hpp index 8d4986a..92483fd 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 acb8344..b3be6fc 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 8f2ebfe..cb1c977 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 0000000..afb9afe --- /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()}")