diff options
Diffstat (limited to 'libs/context/example/execution_context/parameter.cpp')
-rw-r--r-- | libs/context/example/execution_context/parameter.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libs/context/example/execution_context/parameter.cpp b/libs/context/example/execution_context/parameter.cpp new file mode 100644 index 000000000..c33de7382 --- /dev/null +++ b/libs/context/example/execution_context/parameter.cpp @@ -0,0 +1,55 @@ + +// Copyright Oliver Kowalke 2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include <cstdlib> +#include <exception> +#include <iostream> +#include <string> + +#include <boost/context/all.hpp> +#include <boost/lexical_cast.hpp> + +class X{ +private: + int * inp_; + std::string outp_; + std::exception_ptr excptr_; + boost::context::execution_context caller_; + boost::context::execution_context callee_; + +public: + X(): + inp_( nullptr), + outp_(), + excptr_(), + caller_(boost::context::execution_context::current()), + callee_(boost::context::fixedsize_stack(), + [=](){ + try { + int i = * inp_; + outp_ = boost::lexical_cast<std::string>(i); + caller_.resume(); + } catch (...) { + excptr_=std::current_exception(); + } + }) + {} + + std::string operator()(int i){ + inp_ = & i; + callee_.resume(); + if(excptr_){ + std::rethrow_exception(excptr_); + } + return outp_; + } +}; + +int main() { + X x; + std::cout<<x(7)<<std::endl; + std::cout << "done" << std::endl; +} |