2
0
mirror of https://github.com/boostorg/context.git synced 2026-01-19 04:02:17 +00:00

move classes to namespace std

This commit is contained in:
Oliver Kowalke
2023-04-08 10:23:26 +02:00
parent d67f4bb6ce
commit 7e556147fa
44 changed files with 139 additions and 1142 deletions

View File

@@ -11,9 +11,7 @@
#include <libunwind.h>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
void backtrace() {
unw_cursor_t cursor;
@@ -45,13 +43,13 @@ void foo() {
bar();
}
ctx::fiber_context f1( ctx::fiber_context && c) {
std::fiber_context f1( std::fiber_context && c) {
foo();
return std::move( c);
}
int main() {
ctx::fiber_context{ f1 }.resume();
std::fiber_context{ f1 }.resume();
std::cout << "main: done" << std::endl;
return EXIT_SUCCESS;
}

View File

@@ -8,13 +8,11 @@
#include <iostream>
#include <list>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
int main() {
ctx::fiber_context f1, f2, f3;
f3 = ctx::fiber_context{[&](ctx::fiber_context && f)->ctx::fiber_context{
std::fiber_context f1, f2, f3;
f3 = std::fiber_context{[&](std::fiber_context && f)->std::fiber_context{
f2 = std::move( f);
for (;;) {
std::cout << "f3\n";
@@ -22,7 +20,7 @@ int main() {
}
return {};
}};
f2 = ctx::fiber_context{[&](ctx::fiber_context && f)->ctx::fiber_context{
f2 = std::fiber_context{[&](std::fiber_context && f)->std::fiber_context{
f1 = std::move( f);
for (;;) {
std::cout << "f2\n";
@@ -30,7 +28,7 @@ int main() {
}
return {};
}};
f1 = ctx::fiber_context{[&](ctx::fiber_context && /*main*/)->ctx::fiber_context{
f1 = std::fiber_context{[&](std::fiber_context && /*main*/)->std::fiber_context{
for (;;) {
std::cout << "f1\n";
f3 = std::move( f2).resume();

View File

@@ -10,9 +10,7 @@
#include <iostream>
#include <emmintrin.h>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
void echoSSE( int i) {
__m128i xmm;
@@ -28,8 +26,8 @@ void echoSSE( int i) {
int main( int argc, char * argv[]) {
int i = 0;
ctx::fiber_context f{
[&i](ctx::fiber_context && f) {
std::fiber_context f{
[&i](std::fiber_context && f) {
for (;;) {
std::cout << i;
echoSSE( i);

View File

@@ -7,11 +7,9 @@
#include <cstdlib>
#include <iostream>
#include <boost/context/fiber_context.hpp>
#include <boost/context/fiber_context>
namespace ctx = boost::context;
ctx::fiber_context bar( ctx::fiber_context && f) {
std::fiber_context bar( std::fiber_context && f) {
do {
std::cout << "bar\n";
f = std::move( f).resume();
@@ -20,7 +18,7 @@ ctx::fiber_context bar( ctx::fiber_context && f) {
}
int main() {
ctx::fiber_context f{ bar };
std::fiber_context f{ bar };
do {
std::cout << "foo\n";
f = std::move( f).resume();

View File

@@ -8,14 +8,12 @@
#include <iostream>
#include <memory>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
int main() {
int a;
ctx::fiber_context f{
[&a](ctx::fiber_context && f){
std::fiber_context f{
[&a](std::fiber_context && f){
a=0;
int b=1;
for(;;){

View File

@@ -7,14 +7,12 @@
#include <cstdlib>
#include <iostream>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
int main() {
int data = 1;
ctx::fiber_context f{
[&data](ctx::fiber_context && f){
std::fiber_context f{
[&data](std::fiber_context && f){
std::cout << "entered first time: " << data << std::endl;
data += 2;
f = std::move( f).resume();

View File

@@ -7,9 +7,7 @@
#include <cstdlib>
#include <iostream>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
class moveable {
public:
@@ -40,8 +38,8 @@ public:
int main() {
moveable data{ 1 };
ctx::fiber_context f{ std::allocator_arg, ctx::fixedsize_stack{},
[&data](ctx::fiber_context && f){
std::fiber_context f{ std::allocator_arg, std::fixedsize_stack{},
[&data](std::fiber_context && f){
std::cout << "entered first time: " << data.value << std::endl;
data = std::move( moveable{ 3 });
f = std::move( f).resume();

View File

@@ -7,11 +7,9 @@
#include <cstdlib>
#include <iostream>
#include <boost/context/fiber_context.hpp>
#include <boost/context/fiber_context>
namespace ctx = boost::context;
ctx::fiber_context f1( ctx::fiber_context && f) {
std::fiber_context f1( std::fiber_context && f) {
std::cout << "f1: entered first time" << std::endl;
f = std::move( f).resume();
std::cout << "f1: entered second time" << std::endl;
@@ -19,7 +17,7 @@ ctx::fiber_context f1( ctx::fiber_context && f) {
}
int main() {
ctx::fiber_context f{ f1 };
std::fiber_context f{ f1 };
f = std::move( f).resume();
std::cout << "f1: returned first time" << std::endl;
f = std::move( f).resume();

View File

@@ -8,13 +8,11 @@
#include <iostream>
#include <tuple>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
int main() {
int data = 0;
ctx::fiber_context f{ [&data](ctx::fiber_context && f) {
std::fiber_context f{ [&data](std::fiber_context && f) {
std::cout << "f1: entered first time: " << data << std::endl;
data += 1;
f = std::move( f).resume();
@@ -30,7 +28,7 @@ int main() {
f = std::move( f).resume();
std::cout << "f1: returned second time: " << data << std::endl;
data += 1;
f = std::move( f).resume_with([&data](ctx::fiber_context && f){
f = std::move( f).resume_with([&data](std::fiber_context && f){
std::cout << "f2: entered: " << data << std::endl;
data = -1;
return std::move( f);

View File

@@ -8,11 +8,9 @@
#include <iostream>
#include <tuple>
#include <boost/context/fiber_context.hpp>
#include <boost/context/fiber_context>
namespace ctx = boost::context;
ctx::fiber_context f1( ctx::fiber_context && f) {
std::fiber_context f1( std::fiber_context && f) {
std::cout << "f1: entered first time" << std::endl;
f = std::move( f).resume();
std::cout << "f1: entered second time" << std::endl;
@@ -21,13 +19,13 @@ ctx::fiber_context f1( ctx::fiber_context && f) {
return std::move( f);
}
ctx::fiber_context f2( ctx::fiber_context && f) {
std::fiber_context f2( std::fiber_context && f) {
std::cout << "f2: entered" << std::endl;
return std::move( f);
}
int main() {
ctx::fiber_context f{ f1 };
std::fiber_context f{ f1 };
f = std::move( f).resume();
std::cout << "f1: returned first time" << std::endl;
f = std::move( f).resume();

View File

@@ -12,9 +12,7 @@
#include <memory>
#include <sstream>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
/*
* grammar:
@@ -98,7 +96,7 @@ int main() {
char c;
bool done = false;
// execute parser in new execution context
ctx::fiber_context source{[&is,&c,&done](ctx::fiber_context && sink){
std::fiber_context source{[&is,&c,&done](std::fiber_context && sink){
// create parser with callback function
Parser p( is,
[&sink,&c](char c_){

View File

@@ -8,9 +8,7 @@
#include <iostream>
#include <memory>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
#ifdef BOOST_MSVC //MS VisualStudio
__declspec(noinline) void access( char *buf);
@@ -34,15 +32,15 @@ int main() {
int count = 100*1024;
#if defined(BOOST_USE_SEGMENTED_STACKS)
std::cout << "using segmented_stack stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << ctx::segmented_stack::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "initial stack size = " << std::segmented_stack::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application should not fail" << std::endl;
#else
std::cout << "using standard stacks: allocates " << count << " * 4kB == " << 4 * count << "kB on stack, ";
std::cout << "initial stack size = " << ctx::fixedsize_stack::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "initial stack size = " << std::fixedsize_stack::traits_type::default_size() / 1024 << "kB" << std::endl;
std::cout << "application might fail" << std::endl;
#endif
ctx::fiber_context{
[count](ctx::fiber_context && f){
std::fiber_context{
[count](std::fiber_context && f){
bar( count);
return std::move( f);
}}.resume();

View File

@@ -7,18 +7,16 @@
#include <cstdlib>
#include <iostream>
#include <boost/context/continuation.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
int main() {
std::cout << "minimum stack size: " << ctx::stack_traits::minimum_size() << " byte\n";
std::cout << "default stack size: " << ctx::stack_traits::default_size() << " byte\n";
std::cout << "minimum stack size: " << std::stack_traits::minimum_size() << " byte\n";
std::cout << "default stack size: " << std::stack_traits::default_size() << " byte\n";
std::cout << "maximum stack size: ";
if ( ctx::stack_traits::is_unbounded() ) {
if ( std::stack_traits::is_unbounded() ) {
std::cout << "unlimited\n";
} else {
std::cout << ctx::stack_traits::maximum_size() << " byte\n";
std::cout << std::stack_traits::maximum_size() << " byte\n";
}
std::cout << "main: done" << std::endl;
return EXIT_SUCCESS;

View File

@@ -10,20 +10,18 @@
#include <stdexcept>
#include <string>
#include <boost/context/fiber_context.hpp>
namespace ctx = boost::context;
#include <boost/context/fiber_context>
struct my_exception : public std::runtime_error {
ctx::fiber_context f;
my_exception( ctx::fiber_context && f_, std::string const& what) :
std::fiber_context f;
my_exception( std::fiber_context && f_, std::string const& what) :
std::runtime_error{ what },
f{ std::move( f_) } {
}
};
int main() {
ctx::fiber_context f{[](ctx::fiber_context && f) ->ctx::fiber_context {
std::fiber_context f{[](std::fiber_context && f) ->std::fiber_context {
std::cout << "entered" << std::endl;
try {
f = std::move( f).resume();
@@ -34,7 +32,7 @@ int main() {
return {};
}};
f = std::move( f).resume();
f = std::move( f).resume_with([](ctx::fiber_context && f) ->ctx::fiber_context {
f = std::move( f).resume_with([](std::fiber_context && f) ->std::fiber_context {
throw my_exception(std::move( f), "abc");
return {};
});

View File

@@ -1,74 +0,0 @@
// 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)
#ifndef BOOST_CONTEXT_DETAIL_APPLY_H
#define BOOST_CONTEXT_DETAIL_APPLY_H
#include <functional>
#include <tuple>
#include <type_traits>
#include <utility>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#if defined(BOOST_NO_CXX17_STD_INVOKE)
#include <boost/context/detail/invoke.hpp>
#endif
#include <boost/context/detail/index_sequence.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
#if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable: 4100)
#endif
namespace boost {
namespace context {
namespace detail {
template< typename Fn, typename Tpl, std::size_t ... I >
auto
apply_impl( Fn && fn, Tpl && tpl, index_sequence< I ... >)
#if defined(BOOST_NO_CXX17_STD_INVOKE)
-> decltype( boost::context::detail::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... ) )
#else
-> decltype( std::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... ) )
#endif
{
#if defined(BOOST_NO_CXX17_STD_INVOKE)
return boost::context::detail::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... );
#else
return std::invoke( std::forward< Fn >( fn), std::get< I >( std::forward< Tpl >( tpl) ) ... );
#endif
}
template< typename Fn, typename Tpl >
auto
apply( Fn && fn, Tpl && tpl)
-> decltype( apply_impl( std::forward< Fn >( fn),
std::forward< Tpl >( tpl),
make_index_sequence< std::tuple_size< typename std::decay< Tpl >::type >::value >{}) )
{
return apply_impl( std::forward< Fn >( fn),
std::forward< Tpl >( tpl),
make_index_sequence< std::tuple_size< typename std::decay< Tpl >::type >::value >{});
}
}}}
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_CONTEXT_DETAIL_APPLY_H

View File

@@ -17,8 +17,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
// http://ericniebler.com/2013/08/07/universal-references-and-the-copy-constructo/
@@ -31,7 +30,7 @@ using disable_overload =
>::value
>::type;
}}}
}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX

View File

@@ -16,8 +16,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
struct forced_unwind {
@@ -30,7 +29,7 @@ struct forced_unwind {
}
};
}}}
}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX

View File

@@ -1,36 +0,0 @@
// 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)
#ifndef BOOST_CONTEXT_DETAIL_EXCHANGE_H
#define BOOST_CONTEXT_DETAIL_EXCHANGE_H
#include <algorithm>
#include <utility>
#include <boost/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace detail {
template< typename T, typename U = T >
T exchange( T & t, U && nv) {
T ov = std::move( t);
t = std::forward< U >( nv);
return ov;
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_CONTEXT_DETAIL_EXCHANGE_H

View File

@@ -16,8 +16,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
typedef void* fcontext_t;
@@ -36,7 +35,7 @@ fcontext_t BOOST_CONTEXT_CALLDECL make_fcontext( void * sp, std::size_t size, vo
extern "C" BOOST_CONTEXT_DECL
transfer_t BOOST_CONTEXT_CALLDECL ontop_fcontext( fcontext_t const to, void * vp, transfer_t (* fn)( transfer_t) );
}}}
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -1,50 +0,0 @@
// 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)
#ifndef BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H
#define BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H
#include <cstddef>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#if defined(BOOST_CONTEXT_NO_CXX14_INTEGER_SEQUENCE)
#include <boost/mp11/integer_sequence.hpp>
#endif
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace detail {
#if ! defined(BOOST_CONTEXT_NO_CXX14_INTEGER_SEQUENCE)
template< std::size_t ... I >
using index_sequence = std::index_sequence< I ... >;
template< std::size_t I >
using make_index_sequence = std::make_index_sequence< I >;
template< typename ... T >
using index_sequence_for = std::index_sequence_for< T ... >;
#else
template< std::size_t ... I >
using index_sequence = mp11::index_sequence< I ... >;
template< std::size_t I >
using make_index_sequence = mp11::make_index_sequence< I >;
template< typename ... T >
using index_sequence_for = mp11::index_sequence_for< T ... >;
#endif
}}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_CONTEXT_DETAIL_INDEX_SEQUENCE_H

View File

@@ -1,50 +0,0 @@
// 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)
#ifndef BOOST_CONTEXT_DETAIL_INVOKE_H
#define BOOST_CONTEXT_DETAIL_INVOKE_H
#include <functional>
#include <type_traits>
#include <utility>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace detail {
template< typename Fn, typename ... Args >
typename std::enable_if<
std::is_member_pointer< typename std::decay< Fn >::type >::value,
typename std::result_of< Fn &&( Args && ... ) >::type
>::type
invoke( Fn && fn, Args && ... args) {
return std::mem_fn( fn)( std::forward< Args >( args) ... );
}
template< typename Fn, typename ... Args >
typename std::enable_if<
! std::is_member_pointer< typename std::decay< Fn >::type >::value,
typename std::result_of< Fn &&( Args && ... ) >::type
>::type
invoke( Fn && fn, Args && ... args) {
return std::forward< Fn >( fn)( std::forward< Args >( args) ... );
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_CONTEXT_DETAIL_INVOKE_H

View File

@@ -26,8 +26,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
#if BOOST_COMP_GNUC || BOOST_COMP_CLANG
@@ -69,7 +68,7 @@ void prefetch_range( void * addr, std::size_t len) {
#undef BOOST_HAS_PREFETCH
}}}
}}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -1,129 +0,0 @@
// 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)
#ifndef BOOST_CONTEXT_DETAIL_TUPLE_H
#define BOOST_CONTEXT_DETAIL_TUPLE_H
#include <tuple>
#include <utility>
#include <boost/config.hpp>
#include <boost/context/detail/config.hpp>
#include <boost/context/detail/index_sequence.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace detail {
template< typename ... S, typename ... T, std::size_t ... I >
void
head_impl( std::tuple< S ... > & s,
std::tuple< T ... > & t, index_sequence< I ... >) {
t = std::tuple< T ... >{ std::get< I >( s) ... };
}
template< typename ... S, typename ... T, std::size_t ... I >
void
head_impl( std::tuple< S ... > && s,
std::tuple< T ... > & t, index_sequence< I ... >) {
t = std::tuple< T ... >{ std::get< I >( std::move( s) ) ... };
}
template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
void
tail_impl( std::tuple< S ... > & s, index_sequence< I1 ... >,
std::tuple< T ... > & t, index_sequence< I2 ... >) {
constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
t = std::tuple< T ... >{ std::get< (Idx + I2) >( s) ... };
}
template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
void
tail_impl( std::tuple< S ... > && s, index_sequence< I1 ... >,
std::tuple< T ... > & t, index_sequence< I2 ... >) {
constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
t = std::tuple< T ... >{ std::get< (Idx + I2) >( std::move( s) ) ... };
}
template< typename ... T >
class tuple_head;
template< typename ... T >
class tuple_head< std::tuple< T ... > > {
private:
std::tuple< T ... > & t_;
public:
tuple_head( std::tuple< T ... > & t) noexcept :
t_( t) {
}
template< typename ... S >
void operator=( std::tuple< S ... > & s) {
static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
head_impl( s,
t_, index_sequence_for< T ... >{} );
}
template< typename ... S >
void operator=( std::tuple< S ... > && s) {
static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
head_impl( std::move( s),
t_, index_sequence_for< T ... >{} );
}
};
template< typename ... T >
class tuple_tail;
template< typename ... T >
class tuple_tail< std::tuple< T ... > > {
private:
std::tuple< T ... > & t_;
public:
tuple_tail( std::tuple< T ... > & t) noexcept :
t_( t) {
}
template< typename ... S >
void operator=( std::tuple< S ... > & s) {
static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
tail_impl( s, index_sequence_for< S ... >{},
t_, index_sequence_for< T ... >{} );
}
template< typename ... S >
void operator=( std::tuple< S ... > && s) {
static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
tail_impl( std::move( s), index_sequence_for< S ... >{},
t_, index_sequence_for< T ... >{} );
}
};
template< typename ... T >
detail::tuple_head< std::tuple< T ... > >
head( std::tuple< T ... > & tpl) {
return tuple_head< std::tuple< T ... > >{ tpl };
}
template< typename ... T >
detail::tuple_tail< std::tuple< T ... > >
tail( std::tuple< T ... > & tpl) {
return tuple_tail< std::tuple< T ... > >{ tpl };
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS
#include BOOST_ABI_SUFFIX
#endif
#endif // BOOST_CONTEXT_DETAIL_TUPLE_H

View File

@@ -17,23 +17,15 @@
#include <functional>
#include <memory>
#include <ostream>
#include <tuple>
#include <utility>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/intrusive_ptr.hpp>
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
#include <boost/context/detail/exchange.hpp>
#endif
#if defined(BOOST_NO_CXX17_STD_INVOKE)
#include <boost/context/detail/invoke.hpp>
#endif
#include <boost/context/detail/disable_overload.hpp>
#include <boost/context/detail/exception.hpp>
#include <boost/context/detail/fcontext.hpp>
#include <boost/context/detail/tuple.hpp>
#include <boost/context/fixedsize_stack.hpp>
#include <boost/context/flags.hpp>
#include <boost/context/preallocated.hpp>
@@ -60,8 +52,7 @@
# pragma warning(disable: 4702)
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
inline
@@ -111,11 +102,7 @@ transfer_t fiber_context_ontop( transfer_t t) {
t.data = nullptr;
// execute function, pass fiber_context via reference
Ctx c = p( Ctx{ t.fctx } );
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return { exchange( c.fctx_, nullptr), nullptr };
#else
return { std::exchange( c.fctx_, nullptr), nullptr };
#endif
}
template< typename Ctx, typename StackAlloc, typename Fn >
@@ -151,16 +138,8 @@ public:
fcontext_t run( fcontext_t fctx) {
// invoke context-function
#if defined(BOOST_NO_CXX17_STD_INVOKE)
Ctx c = boost::context::detail::invoke( fn_, Ctx{ fctx } );
#else
Ctx c = std::invoke( fn_, Ctx{ fctx } );
#endif
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( c.fctx_, nullptr);
#else
return std::exchange( c.fctx_, nullptr);
#endif
}
};
@@ -296,11 +275,7 @@ public:
~fiber_context() {
if ( BOOST_UNLIKELY( nullptr != fctx_) ) {
detail::ontop_fcontext(
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::exchange( fctx_, nullptr),
#else
std::exchange( fctx_, nullptr),
#endif
nullptr,
detail::fiber_context_unwind);
}
@@ -324,11 +299,7 @@ public:
fiber_context resume() && {
BOOST_ASSERT( nullptr != fctx_);
return { detail::jump_fcontext(
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::exchange( fctx_, nullptr),
#else
std::exchange( fctx_, nullptr),
#endif
nullptr).fctx };
}
@@ -337,11 +308,7 @@ public:
BOOST_ASSERT( nullptr != fctx_);
auto p = std::forward< Fn >( fn);
return { detail::ontop_fcontext(
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::exchange( fctx_, nullptr),
#else
std::exchange( fctx_, nullptr),
#endif
& p,
detail::fiber_context_ontop< fiber_context, decltype(p) >).fctx };
}
@@ -369,7 +336,7 @@ public:
}
#if !defined(BOOST_EMBTC)
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, fiber_context const& other) {
@@ -381,7 +348,7 @@ public:
}
#else
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, fiber_context const& other);
@@ -402,13 +369,13 @@ public:
}
#endif
inline
void swap( fiber_context & l, fiber_context & r) noexcept {
l.swap( r);
}
}}
}
#if defined(BOOST_MSVC)
# pragma warning(pop)

View File

@@ -28,7 +28,6 @@ extern "C" {
#include <memory>
#include <ostream>
#include <system_error>
#include <tuple>
#include <utility>
#include <boost/assert.hpp>
@@ -36,13 +35,7 @@ extern "C" {
#include <boost/predef.h>
#include <boost/context/detail/disable_overload.hpp>
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
#include <boost/context/detail/exchange.hpp>
#endif
#include <boost/context/detail/externc.hpp>
#if defined(BOOST_NO_CXX17_STD_INVOKE)
#include <boost/context/detail/invoke.hpp>
#endif
#include <boost/context/fixedsize_stack.hpp>
#include <boost/context/flags.hpp>
#include <boost/context/preallocated.hpp>
@@ -59,8 +52,7 @@ extern "C" {
#include <sanitizer/tsan_interface.h>
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
// tampoline function
@@ -163,11 +155,7 @@ struct BOOST_CONTEXT_DECL fiber_context_activation_record {
(const void **) & current()->from->stack_bottom,
& current()->from->stack_size);
#endif
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( current()->from, nullptr);
#else
return std::exchange( current()->from, nullptr);
#endif
}
template< typename Ctx, typename Fn >
@@ -177,36 +165,14 @@ struct BOOST_CONTEXT_DECL fiber_context_activation_record {
// `this` will become the active (running) context
// returned by fiber_context::current()
current() = this;
#if defined(BOOST_NO_CXX14_GENERIC_LAMBDAS)
current()->ontop = std::bind(
[](typename std::decay< Fn >::type & fn, fiber_context_activation_record *& ptr){
Ctx c{ ptr };
c = fn( std::move( c) );
if ( ! c) {
ptr = nullptr;
}
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( c.ptr_, nullptr);
#else
return std::exchange( c.ptr_, nullptr);
#endif
},
std::forward< Fn >( fn),
std::placeholders::_1);
#else
current()->ontop = [fn=std::forward<Fn>(fn)](fiber_context_activation_record *& ptr){
Ctx c{ ptr };
c = fn( std::move( c) );
if ( ! c) {
ptr = nullptr;
}
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( c.ptr_, nullptr);
#else
return std::exchange( c.ptr_, nullptr);
#endif
};
#endif
#if defined(BOOST_USE_SEGMENTED_STACKS)
// adjust segmented stack properties
__splitstack_getcontext( from->sctx.segments_ctx);
@@ -225,11 +191,7 @@ struct BOOST_CONTEXT_DECL fiber_context_activation_record {
(const void **) & current()->from->stack_bottom,
& current()->from->stack_size);
#endif
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( current()->from, nullptr);
#else
return std::exchange( current()->from, nullptr);
#endif
}
virtual void deallocate() noexcept {
@@ -285,11 +247,7 @@ public:
Ctx c{ from };
try {
// invoke context-function
#if defined(BOOST_NO_CXX17_STD_INVOKE)
c = boost::context::detail::invoke( fn_, std::move( c) );
#else
c = std::invoke( fn_, std::move( c) );
#endif
} catch ( forced_unwind const& ex) {
c = Ctx{ ex.from };
}
@@ -482,11 +440,7 @@ public:
fiber_context resume() && {
BOOST_ASSERT( nullptr != ptr_);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::fiber_context_activation_record * ptr = detail::exchange( ptr_, nullptr)->resume();
#else
detail::fiber_context_activation_record * ptr = std::exchange( ptr_, nullptr)->resume();
#endif
if ( BOOST_UNLIKELY( detail::fiber_context_activation_record::current()->force_unwind) ) {
throw detail::forced_unwind{ ptr};
} else if ( BOOST_UNLIKELY( nullptr != detail::fiber_context_activation_record::current()->ontop) ) {
@@ -499,13 +453,8 @@ public:
template< typename Fn >
fiber_context resume_with( Fn && fn) && {
BOOST_ASSERT( nullptr != ptr_);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::fiber_context_activation_record * ptr =
detail::exchange( ptr_, nullptr)->resume_with< fiber_context >( std::forward< Fn >( fn) );
#else
detail::fiber_context_activation_record * ptr =
std::exchange( ptr_, nullptr)->resume_with< fiber_context >( std::forward< Fn >( fn) );
#endif
if ( BOOST_UNLIKELY( detail::fiber_context_activation_record::current()->force_unwind) ) {
throw detail::forced_unwind{ ptr};
} else if ( BOOST_UNLIKELY( nullptr != detail::fiber_context_activation_record::current()->ontop) ) {
@@ -577,7 +526,7 @@ void swap( fiber_context & l, fiber_context & r) noexcept {
l.swap( r);
}
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -20,19 +20,12 @@
#include <memory>
#include <ostream>
#include <system_error>
#include <tuple>
#include <utility>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/context/detail/disable_overload.hpp>
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
#include <boost/context/detail/exchange.hpp>
#endif
#if defined(BOOST_NO_CXX17_STD_INVOKE)
#include <boost/context/detail/invoke.hpp>
#endif
#include <boost/context/fixedsize_stack.hpp>
#include <boost/context/flags.hpp>
#include <boost/context/preallocated.hpp>
@@ -47,8 +40,7 @@
# pragma warning(disable: 4702)
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
// tampoline function
@@ -121,11 +113,7 @@ struct BOOST_CONTEXT_DECL fiber_context_activation_record {
// context switch from parent context to `this`-context
// context switch
::SwitchToFiber( fiber_context);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return detail::exchange( current()->from, nullptr);
#else
return std::exchange( current()->from, nullptr);
#endif
}
template< typename Ctx, typename Fn >
@@ -135,43 +123,17 @@ struct BOOST_CONTEXT_DECL fiber_context_activation_record {
// `this` will become the active (running) context
// returned by fiber_context::current()
current() = this;
#if defined(BOOST_NO_CXX14_GENERIC_LAMBDAS)
current()->ontop = std::bind(
[](typename std::decay< Fn >::type & fn, fiber_context_activation_record *& ptr){
Ctx c{ ptr };
c = fn( std::move( c) );
if ( ! c) {
ptr = nullptr;
}
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( c.ptr_, nullptr);
#else
return std::exchange( c.ptr_, nullptr);
#endif
},
std::forward< Fn >( fn),
std::placeholders::_1);
#else
current()->ontop = [fn=std::forward<Fn>(fn)](fiber_context_activation_record *& ptr){
Ctx c{ ptr };
c = fn( std::move( c) );
if ( ! c) {
ptr = nullptr;
}
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return exchange( c.ptr_, nullptr);
#else
return std::exchange( c.ptr_, nullptr);
#endif
};
#endif
// context switch
::SwitchToFiber( fiber_context);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
return detail::exchange( current()->from, nullptr);
#else
return std::exchange( current()->from, nullptr);
#endif
}
virtual void deallocate() noexcept {
@@ -222,11 +184,7 @@ public:
Ctx c{ from };
try {
// invoke context-function
#if defined(BOOST_NO_CXX17_STD_INVOKE)
c = boost::context::detail::invoke( fn_, std::move( c) );
#else
c = std::invoke( fn_, std::move( c) );
#endif
} catch ( forced_unwind const& ex) {
c = Ctx{ ex.from };
}
@@ -346,11 +304,7 @@ public:
fiber_context resume() && {
BOOST_ASSERT( nullptr != ptr_);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::fiber_context_activation_record * ptr = detail::exchange( ptr_, nullptr)->resume();
#else
detail::fiber_context_activation_record * ptr = std::exchange( ptr_, nullptr)->resume();
#endif
if ( BOOST_UNLIKELY( detail::fiber_context_activation_record::current()->force_unwind) ) {
throw detail::forced_unwind{ ptr};
} else if ( BOOST_UNLIKELY( nullptr != detail::fiber_context_activation_record::current()->ontop) ) {
@@ -363,13 +317,8 @@ public:
template< typename Fn >
fiber_context resume_with( Fn && fn) && {
BOOST_ASSERT( nullptr != ptr_);
#if defined(BOOST_NO_CXX14_STD_EXCHANGE)
detail::fiber_context_activation_record * ptr =
detail::exchange( ptr_, nullptr)->resume_with< fiber_context >( std::forward< Fn >( fn) );
#else
detail::fiber_context_activation_record * ptr =
std::exchange( ptr_, nullptr)->resume_with< fiber_context >( std::forward< Fn >( fn) );
#endif
if ( BOOST_UNLIKELY( detail::fiber_context_activation_record::current()->force_unwind) ) {
throw detail::forced_unwind{ ptr};
} else if ( BOOST_UNLIKELY( nullptr != detail::fiber_context_activation_record::current()->ontop) ) {
@@ -441,7 +390,7 @@ void swap( fiber_context & l, fiber_context & r) noexcept {
l.swap( r);
}
}}
}
#if defined(BOOST_MSVC)
# pragma warning(pop)

View File

@@ -32,8 +32,7 @@ extern "C" {
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
template< typename traitsT >
class basic_fixedsize_stack {
@@ -88,7 +87,7 @@ typedef basic_fixedsize_stack< stack_traits > fixedsize_stack;
typedef fixedsize_stack default_stack;
# endif
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -13,13 +13,12 @@
# include BOOST_ABI_PREFIX
# endif
namespace boost {
namespace context {
namespace std {
struct exec_ontop_arg_t {};
const exec_ontop_arg_t exec_ontop_arg{};
}}
}
# ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -36,8 +36,7 @@ extern "C" {
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
#if defined(BOOST_CONTEXT_USE_MAP_STACK)
namespace detail {
@@ -143,7 +142,7 @@ public:
typedef basic_pooled_fixedsize_stack< stack_traits > pooled_fixedsize_stack;
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -34,8 +34,7 @@ extern "C" {
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
template< typename traitsT >
class basic_protected_fixedsize_stack {
@@ -93,7 +92,7 @@ public:
typedef basic_protected_fixedsize_stack< stack_traits > protected_fixedsize_stack;
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -34,8 +34,7 @@ void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS],
int * new_value, int * old_value);
}
namespace boost {
namespace context {
namespace std {
template< typename traitsT >
class basic_segmented_stack {
@@ -73,7 +72,7 @@ typedef basic_segmented_stack< stack_traits > segmented_stack;
typedef segmented_stack default_stack;
# endif
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -17,8 +17,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
struct preallocated {
void * sp;
@@ -30,7 +29,7 @@ struct preallocated {
}
};
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -17,8 +17,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
#if ! defined(BOOST_CONTEXT_NO_CXX11)
struct BOOST_CONTEXT_DECL stack_context {
@@ -63,7 +62,7 @@ struct BOOST_CONTEXT_DECL stack_context {
};
#endif
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -17,8 +17,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
struct BOOST_CONTEXT_DECL stack_traits
{
@@ -33,7 +32,7 @@ struct BOOST_CONTEXT_DECL stack_traits
static std::size_t maximum_size() BOOST_NOEXCEPT_OR_NOTHROW;
};
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -27,8 +27,7 @@ extern "C" {
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
template< typename traitsT >
class basic_protected_fixedsize_stack {
@@ -73,7 +72,7 @@ public:
typedef basic_protected_fixedsize_stack< stack_traits > protected_fixedsize_stack;
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -16,8 +16,7 @@
# include BOOST_ABI_PREFIX
#endif
namespace boost {
namespace context {
namespace std {
namespace detail {
// zero-initialization
@@ -51,7 +50,7 @@ fiber_context_activation_record::current() noexcept {
}
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -56,8 +56,7 @@ rlim_t stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW {
}
namespace boost {
namespace context {
namespace std {
bool
stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW {
@@ -86,7 +85,7 @@ stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
return static_cast< std::size_t >( stacksize_limit() );
}
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -51,8 +51,7 @@ std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
}
namespace boost {
namespace context {
namespace std {
// Windows seams not to provide a limit for the stacksize
// libcoco uses 32k+4k bytes as minimum
@@ -91,7 +90,7 @@ stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
return 1 * 1024 * 1024 * 1024; // 1GB
}
}}
}
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_SUFFIX

View File

@@ -57,38 +57,6 @@ local only-when-segmented-stack-is-available =
;
test-suite minimal :
[ run test_invoke.cpp :
: :
[ requires cxx11_auto_declarations
cxx11_constexpr
cxx11_defaulted_functions
cxx11_final
cxx11_hdr_thread
cxx11_hdr_tuple
cxx11_lambdas
cxx11_noexcept
cxx11_nullptr
cxx11_rvalue_references
cxx11_template_aliases
cxx11_thread_local
cxx11_variadic_templates ] ]
[ run test_apply.cpp :
: :
[ requires cxx11_auto_declarations
cxx11_constexpr
cxx11_defaulted_functions
cxx11_final
cxx11_hdr_thread
cxx11_hdr_tuple
cxx11_lambdas
cxx11_noexcept
cxx11_nullptr
cxx11_rvalue_references
cxx11_template_aliases
cxx11_thread_local
cxx11_variadic_templates ] ]
[ run test_fiber_context.cpp :
: :
<context-impl>fcontext

View File

@@ -1,208 +0,0 @@
// Copyright Oliver Kowalke 2009.
// 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 <iostream>
#include <memory>
#include <sstream>
#include <stdexcept>
#include <string>
#include <tuple>
#include <utility>
#include <boost/assert.hpp>
#include <boost/core/lightweight_test.hpp>
#include <boost/context/detail/apply.hpp>
#include <boost/context/detail/config.hpp>
#define BOOST_CHECK_EQUAL(a, b) BOOST_TEST_EQ(a, b)
namespace ctx = boost::context;
struct callable {
int k{ 0 };
callable() = default;
callable( int k_) :
k{ k_ } {
}
int foo( int i, int j) const {
return i + j + k;
}
int operator()( int i, int j) const {
return foo( i, j);
}
};
struct movable {
int k{ 0 };
movable() = default;
movable( int k_) :
k{ k_ } {
}
movable( movable const&) = delete;
movable & operator=( movable const&) = delete;
movable( movable && other) :
k{ other.k } {
other.k = -1;
}
movable & operator=( movable && other) {
if ( this == & other) return * this;
k = other.k;
other.k = -1;
return * this;
}
int foo( int i, int j) const {
return i + j + k;
}
int operator()( int i, int j) const {
return foo( i, j);
}
};
int fn1( int i, int j) {
return i + j;
}
int * fn2( int * ip) {
return ip;
}
int * fn3( int & ir) {
return & ir;
}
int & fn4( int & ir) {
return ir;
}
int fn5( int i, callable && c) {
return i + c.k;
}
int fn6( int i, movable && m) {
return i + m.k;
}
void test1() {
int result = ctx::detail::apply( fn1, std::make_tuple( 1, 2) );
BOOST_CHECK_EQUAL( result, 3);
}
void test2() {
{
int i = 3;
int * ip = & i;
int * result = ctx::detail::apply( fn2, std::make_tuple( ip) );
BOOST_CHECK_EQUAL( result, ip);
BOOST_CHECK_EQUAL( * result, i);
}
{
int i = 3;
int * result = ctx::detail::apply( fn2, std::make_tuple( & i) );
BOOST_CHECK_EQUAL( result, & i);
BOOST_CHECK_EQUAL( * result, i);
}
}
void test3() {
{
int i = 'c';
int & ir = i;
int * result = ctx::detail::apply( fn3, std::make_tuple( std::ref( ir) ) );
BOOST_CHECK_EQUAL( result, & ir);
BOOST_CHECK_EQUAL( * result, i);
}
{
int i = 'c';
int * result = ctx::detail::apply( fn3, std::make_tuple( std::ref( i) ) );
BOOST_CHECK_EQUAL( result, & i);
BOOST_CHECK_EQUAL( * result, i);
}
}
void test4() {
{
int i = 3;
int & ir = i;
int & result = ctx::detail::apply( fn4, std::make_tuple( std::ref( ir) ) );
BOOST_CHECK_EQUAL( result, ir);
BOOST_CHECK_EQUAL( & result, & ir);
BOOST_CHECK_EQUAL( result, i);
}
{
int i = 3;
int & result = ctx::detail::apply( fn4, std::make_tuple( std::ref( i) ) );
BOOST_CHECK_EQUAL( & result, & i);
BOOST_CHECK_EQUAL( result, i);
}
}
void test5() {
{
callable c( 5);
int result = ctx::detail::apply( fn5, std::make_tuple( 1, std::move( c) ) );
BOOST_CHECK_EQUAL( result, 6);
BOOST_CHECK_EQUAL( c.k, 5);
}
{
movable m( 5);
int result = ctx::detail::apply( fn6, std::make_tuple( 1, std::move( m) ) );
BOOST_CHECK_EQUAL( result, 6);
BOOST_CHECK_EQUAL( m.k, -1);
}
}
void test6() {
{
callable c;
int result = ctx::detail::apply( c, std::make_tuple( 1, 2) );
BOOST_CHECK_EQUAL( result, 3);
BOOST_CHECK_EQUAL( c.k, 0);
}
{
callable c;
int result = ctx::detail::apply( & callable::foo, std::make_tuple( c, 1, 2) );
BOOST_CHECK_EQUAL( result, 3);
BOOST_CHECK_EQUAL( c.k, 0);
}
}
void test7() {
{
movable m;
int result = ctx::detail::apply( std::move( m), std::make_tuple( 1, 2) );
BOOST_CHECK_EQUAL( result, 3);
}
{
movable m;
int result = ctx::detail::apply( & movable::foo, std::make_tuple( std::move( m), 1, 2) );
BOOST_CHECK_EQUAL( result, 3);
}
}
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
return boost::report_errors();
}

View File

@@ -20,7 +20,6 @@
#include <boost/core/lightweight_test.hpp>
#include <boost/utility.hpp>
#include <boost/context/detail/config.hpp>
#include <boost/context/detail/fcontext.hpp>
#define BOOST_CHECK(x) BOOST_TEST(x)
@@ -65,7 +64,7 @@ typedef simple_stack_allocator<
8 * 1024 * 1024, 64 * 1024, 8 * 1024
> stack_allocator;
namespace ctx = boost::context::detail;
namespace ctx = std::detail;
typedef simple_stack_allocator<
8 * 1024 * 1024, // 8MB

View File

@@ -27,7 +27,6 @@
#include <boost/variant.hpp>
#include <boost/context/fiber_context.hpp>
#include <boost/context/detail/config.hpp>
#ifdef BOOST_WINDOWS
#include <windows.h>
@@ -43,14 +42,12 @@
typedef boost::variant<int,std::string> variant_t;
namespace ctx = boost::context;
int value1 = 0;
std::string value2;
double value3 = 0.;
struct X {
ctx::fiber_context foo( ctx::fiber_context && f, int i) {
std::fiber_context foo( std::fiber_context && f, int i) {
value1 = i;
return std::move( f);
}
@@ -109,8 +106,8 @@ public:
};
struct my_exception : public std::runtime_error {
ctx::fiber_context f;
my_exception( ctx::fiber_context && f_, char const* what) :
std::fiber_context f;
my_exception( std::fiber_context && f_, char const* what) :
std::runtime_error( what),
f{ std::move( f_) } {
}
@@ -134,8 +131,8 @@ void test_move() {
value1 = 0;
int i = 1;
BOOST_CHECK_EQUAL( 0, value1);
ctx::fiber_context f1{
[&i](ctx::fiber_context && f) {
std::fiber_context f1{
[&i](std::fiber_context && f) {
value1 = i;
f = std::move( f).resume();
value1 = i;
@@ -148,7 +145,7 @@ void test_move() {
BOOST_CHECK( f1);
BOOST_CHECK( ! f1.empty() );
BOOST_CHECK( f1.can_resume() );
ctx::fiber_context f2;
std::fiber_context f2;
BOOST_CHECK( f2.empty() );
BOOST_CHECK( ! f2.can_resume() );
f2 = std::move( f1);
@@ -169,7 +166,7 @@ void test_move() {
void test_bind() {
value1 = 0;
X x;
ctx::fiber_context f{ std::bind( & X::foo, x, std::placeholders::_1, 7) };
std::fiber_context f{ std::bind( & X::foo, x, std::placeholders::_1, 7) };
f = std::move( f).resume();
BOOST_CHECK_EQUAL( 7, value1);
}
@@ -177,8 +174,8 @@ void test_bind() {
void test_exception() {
{
const char * what = "hello world";
ctx::fiber_context f{
[&what](ctx::fiber_context && f) {
std::fiber_context f{
[&what](std::fiber_context && f) {
try {
throw std::runtime_error( what);
} catch ( std::runtime_error const& e) {
@@ -195,7 +192,7 @@ void test_exception() {
{
bool catched = false;
std::thread([&catched](){
ctx::fiber_context f{ [&catched](ctx::fiber_context && f){
std::fiber_context f{ [&catched](std::fiber_context && f){
seh( catched);
return std::move( f);
}};
@@ -210,8 +207,8 @@ void test_exception() {
void test_fp() {
value3 = 0.;
double d = 7.13;
ctx::fiber_context f{
[&d]( ctx::fiber_context && f) {
std::fiber_context f{
[&d]( std::fiber_context && f) {
d += 3.45;
value3 = d;
return std::move( f);
@@ -225,10 +222,10 @@ void test_fp() {
void test_stacked() {
value1 = 0;
value3 = 0.;
ctx::fiber_context f{
[](ctx::fiber_context && f) {
ctx::fiber_context f1{
[](ctx::fiber_context && f) {
std::fiber_context f{
[](std::fiber_context && f) {
std::fiber_context f1{
[](std::fiber_context && f) {
value1 = 3;
return std::move( f);
}};
@@ -245,14 +242,14 @@ void test_stacked() {
void test_prealloc() {
value1 = 0;
ctx::default_stack alloc;
ctx::stack_context sctx( alloc.allocate() );
std::default_stack alloc;
std::stack_context sctx( alloc.allocate() );
void * sp = static_cast< char * >( sctx.sp) - 10;
std::size_t size = sctx.size - 10;
int i = 7;
ctx::fiber_context f{
std::allocator_arg, ctx::preallocated( sp, size, sctx), alloc,
[&i]( ctx::fiber_context && f) {
std::fiber_context f{
std::allocator_arg, std::preallocated( sp, size, sctx), alloc,
[&i]( std::fiber_context && f) {
value1 = i;
return std::move( f);
}};
@@ -265,7 +262,7 @@ void test_prealloc() {
void test_ontop() {
{
int i = 3;
ctx::fiber_context f{ [&i](ctx::fiber_context && f) {
std::fiber_context f{ [&i](std::fiber_context && f) {
for (;;) {
i *= 10;
f = std::move( f).resume();
@@ -274,7 +271,7 @@ void test_ontop() {
}};
f = std::move( f).resume();
// Pass fn by reference to see if the types are properly decayed.
auto fn = [&i](ctx::fiber_context && f){
auto fn = [&i](std::fiber_context && f){
i -= 10;
return std::move( f);
};
@@ -283,8 +280,8 @@ void test_ontop() {
BOOST_CHECK_EQUAL( i, 200);
}
{
ctx::fiber_context f1;
ctx::fiber_context f{ [&f1](ctx::fiber_context && f) {
std::fiber_context f1;
std::fiber_context f{ [&f1](std::fiber_context && f) {
f = std::move( f).resume();
BOOST_CHECK( f.empty() );
BOOST_CHECK( ! f.can_resume() );
@@ -292,7 +289,7 @@ void test_ontop() {
}};
f = std::move( f).resume();
f = std::move( f).resume_with(
[&f1](ctx::fiber_context && f){
[&f1](std::fiber_context && f){
f1 = std::move( f);
return std::move( f);
});
@@ -302,7 +299,7 @@ void test_ontop() {
void test_ontop_exception() {
value1 = 0;
value2 = "";
ctx::fiber_context f{ [](ctx::fiber_context && f){
std::fiber_context f{ [](std::fiber_context && f){
for (;;) {
value1 = 3;
try {
@@ -318,7 +315,7 @@ void test_ontop_exception() {
BOOST_CHECK_EQUAL( 3, value1);
const char * what = "hello world";
f = std::move( f).resume_with(
[what](ctx::fiber_context && f){
[what](std::fiber_context && f){
throw my_exception( std::move( f), what);
return std::move( f);
});
@@ -329,8 +326,8 @@ void test_ontop_exception() {
void test_termination1() {
{
value1 = 0;
ctx::fiber_context f{
[](ctx::fiber_context && f){
std::fiber_context f{
[](std::fiber_context && f){
Y y;
f = std::move( f).resume();
return std::move(f);
@@ -342,8 +339,8 @@ void test_termination1() {
{
value1 = 0;
BOOST_CHECK_EQUAL( 0, value1);
ctx::fiber_context f{
[](ctx::fiber_context && f) {
std::fiber_context f{
[](std::fiber_context && f) {
value1 = 3;
return std::move( f);
}};
@@ -356,8 +353,8 @@ void test_termination1() {
value1 = 0;
BOOST_CHECK_EQUAL( 0, value1);
int i = 3;
ctx::fiber_context f{
[&i](ctx::fiber_context && f){
std::fiber_context f{
[&i](std::fiber_context && f){
value1 = i;
f = std::move( f).resume();
value1 = i;
@@ -379,8 +376,8 @@ void test_termination2() {
{
value1 = 0;
value3 = 0.0;
ctx::fiber_context f{
[](ctx::fiber_context && f){
std::fiber_context f{
[](std::fiber_context && f){
Y y;
value1 = 3;
value3 = 4.;
@@ -402,8 +399,8 @@ void test_termination2() {
}
void test_sscanf() {
ctx::fiber_context{
[]( ctx::fiber_context && f) {
std::fiber_context{
[]( std::fiber_context && f) {
{
double n1 = 0;
double n2 = 0;
@@ -430,8 +427,8 @@ void test_sscanf() {
}
void test_snprintf() {
ctx::fiber_context{
[]( ctx::fiber_context && f) {
std::fiber_context{
[]( std::fiber_context && f) {
{
const char *fmt = "sqrt(2) = %f";
char buf[19];
@@ -452,8 +449,8 @@ void test_snprintf() {
#ifdef BOOST_WINDOWS
void test_bug12215() {
ctx::fiber_context{
[](ctx::fiber_context && f) {
std::fiber_context{
[](std::fiber_context && f) {
char buffer[MAX_PATH];
GetModuleFileName( nullptr, buffer, MAX_PATH);
return std::move( f);
@@ -465,15 +462,15 @@ void test_goodcatch() {
value1 = 0;
value3 = 0.0;
{
ctx::fiber_context f{
[]( ctx::fiber_context && f) {
std::fiber_context f{
[]( std::fiber_context && f) {
Y y;
value3 = 2.;
f = std::move( f).resume();
try {
value3 = 3.;
f = std::move( f).resume();
} catch ( boost::context::detail::forced_unwind const&) {
} catch ( std::detail::forced_unwind const&) {
value3 = 4.;
throw;
} catch (...) {
@@ -500,8 +497,8 @@ void test_badcatch() {
value1 = 0;
value3 = 0.;
{
ctx::fiber_context f{
[]( ctx::fiber_context && f) {
std::fiber_context f{
[]( std::fiber_context && f) {
Y y;
try {
value3 = 3.;

View File

@@ -1,241 +0,0 @@
// Copyright Oliver Kowalke 2009.
// 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 <iostream>
#include <memory>
#include <sstream>
#include <stdexcept>
#include <string>
#include <tuple>
#include <utility>
#include <boost/config.hpp>
#include <boost/assert.hpp>
#include <boost/core/lightweight_test.hpp>
#if defined(BOOST_NO_CXX17_STD_INVOKE)
#include <boost/context/detail/invoke.hpp>
#include <boost/context/detail/config.hpp>
#define BOOST_CHECK_EQUAL(a, b) BOOST_TEST_EQ(a, b)
namespace ctx = boost::context;
struct callable {
int k{ 0 };
callable() = default;
callable( int k_) :
k{ k_ } {
}
int foo( int i, int j) const {
return i + j + k;
}
int operator()( int i, int j) const {
return foo( i, j);
}
};
struct movable {
int k{ 0 };
movable() = default;
movable( int k_) :
k{ k_ } {
}
movable( movable const&) = delete;
movable & operator=( movable const&) = delete;
movable( movable && other) :
k{ other.k } {
other.k = -1;
}
movable & operator=( movable && other) {
if ( this == & other) return * this;
k = other.k;
other.k = -1;
return * this;
}
int foo( int i, int j) const {
return i + j + k;
}
int operator()( int i, int j) const {
return foo( i, j);
}
};
int fn1( int i, int j) {
return i + j;
}
int * fn2( int * ip) {
return ip;
}
int * fn3( int & ir) {
return & ir;
}
int & fn4( int & ir) {
return ir;
}
template< typename T >
int fn5( int i, T && t_) {
T t = std::forward< T >( t_);
return i + t.k;
}
void test1() {
int result = ctx::detail::invoke( fn1, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
}
void test2() {
{
int i = 3;
int * ip = & i;
int * result = ctx::detail::invoke( fn2, ip);
BOOST_CHECK_EQUAL( result, ip);
BOOST_CHECK_EQUAL( * result, i);
}
{
int i = 3;
int * result = ctx::detail::invoke( fn2, & i);
BOOST_CHECK_EQUAL( result, & i);
BOOST_CHECK_EQUAL( * result, i);
}
}
void test3() {
{
int i = 3;
int & ir = i;
int * result = ctx::detail::invoke( fn3, ir);
BOOST_CHECK_EQUAL( result, & ir);
BOOST_CHECK_EQUAL( * result, i);
}
{
int i = 3;
int * result = ctx::detail::invoke( fn3, i);
BOOST_CHECK_EQUAL( result, & i);
BOOST_CHECK_EQUAL( * result, i);
}
}
void test4() {
{
int i = 3;
int & ir = i;
int & result = ctx::detail::invoke( fn4, ir);
BOOST_CHECK_EQUAL( result, ir);
BOOST_CHECK_EQUAL( & result, & ir);
BOOST_CHECK_EQUAL( result, i);
}
{
int i = 3;
int & result = ctx::detail::invoke( fn4, i);
BOOST_CHECK_EQUAL( & result, & i);
BOOST_CHECK_EQUAL( result, i);
}
}
void test5() {
{
callable c( 5);
int result = ctx::detail::invoke( fn5< callable >, 1, std::move( c) );
BOOST_CHECK_EQUAL( result, 6);
BOOST_CHECK_EQUAL( c.k, 5);
}
{
movable m( 5);
int result = ctx::detail::invoke( fn5< movable >, 1, std::move( m) );
BOOST_CHECK_EQUAL( result, 6);
BOOST_CHECK_EQUAL( m.k, -1);
}
}
void test6() {
{
callable c;
int result = ctx::detail::invoke( c, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
BOOST_CHECK_EQUAL( c.k, 0);
}
{
callable c;
int result = ctx::detail::invoke( & callable::foo, c, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
BOOST_CHECK_EQUAL( c.k, 0);
}
}
void test7() {
{
int result = ctx::detail::invoke( movable{}, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
}
{
int result = ctx::detail::invoke( & movable::foo, movable{}, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
}
}
template< typename R, typename Fn, typename ... Args >
R apply( Fn && fn, Args && ... args) {
return ctx::detail::invoke(
std::forward< Fn >( fn),
std::forward< Args >( args) ... );
}
void test8() {
{
int result = apply< int >( fn1, 1, 2);
BOOST_CHECK_EQUAL( result, 3);
}
{
int i = 3;
int & ir = i;
int * result = apply< int * >( fn3, ir);
BOOST_CHECK_EQUAL( result, & ir);
BOOST_CHECK_EQUAL( * result, i);
}
{
movable m( 5);
int result = apply< int >( fn5< movable >, 1, std::move( m) );
BOOST_CHECK_EQUAL( result, 6);
BOOST_CHECK_EQUAL( m.k, -1);
}
}
#else
void dummy() {}
#endif
int main()
{
#if defined(BOOST_NO_CXX17_STD_INVOKE)
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
#else
dummy();
#endif
return boost::report_errors();
}