// This file is distributed under the BSD License. // See "license.txt" for details. // Copyright 2009-2012, Jonathan Turner (jonathan@emptycrate.com) // Copyright 2009-2017, Jason Turner (jason@emptycrate.com) // http://www.chaiscript.com // This is an open source non-commercial project. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com #ifndef CHAISCRIPT_HANDLE_RETURN_HPP_ #define CHAISCRIPT_HANDLE_RETURN_HPP_ #include #include #include #include "boxed_number.hpp" #include "boxed_value.hpp" namespace chaiscript { class Boxed_Number; } // namespace chaiscript namespace chaiscript { namespace dispatch { template class Proxy_Function_Callable_Impl; template class Assignable_Proxy_Function_Impl; namespace detail { /// Used internally for handling a return value from a Proxy_Function call template struct Handle_Return { template::type>::value>::type> static Boxed_Value handle(T r) { return Boxed_Value(std::move(r), true); } template::type>::value>::type> static Boxed_Value handle(T &&r) { return Boxed_Value(std::make_shared(std::forward(r)), true); } }; template struct Handle_Return &> { static Boxed_Value handle(const std::function &f) { return Boxed_Value( chaiscript::make_shared>>(f) ); } }; template struct Handle_Return> : Handle_Return &> { }; template struct Handle_Return>> { static Boxed_Value handle(const std::shared_ptr> &f) { return Boxed_Value( chaiscript::make_shared>(std::ref(*f),f) ); } }; template struct Handle_Return> &> : Handle_Return>> { }; template struct Handle_Return>> : Handle_Return>> { }; template struct Handle_Return &> { static Boxed_Value handle(std::function &f) { return Boxed_Value( chaiscript::make_shared>(std::ref(f), std::shared_ptr>()) ); } static Boxed_Value handle(const std::function &f) { return Boxed_Value( chaiscript::make_shared>>(f) ); } }; template struct Handle_Return { static Boxed_Value handle(Ret *p) { return Boxed_Value(p, true); } }; template struct Handle_Return { static Boxed_Value handle(const Ret *p) { return Boxed_Value(p, true); } }; template struct Handle_Return { static Boxed_Value handle(Ret *p) { return Boxed_Value(p, true); } }; template struct Handle_Return { static Boxed_Value handle(const Ret *p) { return Boxed_Value(p, true); } }; template struct Handle_Return &> { static Boxed_Value handle(const std::shared_ptr &r) { return Boxed_Value(r, true); } }; template struct Handle_Return> : Handle_Return &> { }; template struct Handle_Return &> : Handle_Return &> { }; template struct Handle_Return> : Handle_Return &> { static Boxed_Value handle(std::unique_ptr &&r) { return Boxed_Value(std::move(r), true); } }; template struct Handle_Return { static Boxed_Value handle(const Ret &r) { return Boxed_Value(std::cref(r), true); } }; template struct Handle_Return { static Boxed_Value handle(Ret r) { return Boxed_Value(std::move(r)); } }; template struct Handle_Return { static Boxed_Value handle(Ret &r) { return Boxed_Value(std::ref(r)); } }; template<> struct Handle_Return { static Boxed_Value handle(const Boxed_Value &r) { return r; } }; template<> struct Handle_Return : Handle_Return { }; template<> struct Handle_Return : Handle_Return { }; template<> struct Handle_Return : Handle_Return { }; /** * Used internally for handling a return value from a Proxy_Function call */ template<> struct Handle_Return { static Boxed_Value handle(const Boxed_Number &r) { return r.bv; } }; template<> struct Handle_Return : Handle_Return { }; /** * Used internally for handling a return value from a Proxy_Function call */ template<> struct Handle_Return { static Boxed_Value handle() { return void_var(); } }; } } } #endif