|
Boost-Commit : |
From: gpderetta_at_[hidden]
Date: 2008-07-15 14:52:12
Author: giovanni.deretta
Date: 2008-07-15 14:52:11 EDT (Tue, 15 Jul 2008)
New Revision: 47451
URL: http://svn.boost.org/trac/boost/changeset/47451
Log:
removed move interface
Text files modified:
sandbox/SOC/2006/coroutine/branches/cleanup/boost/coroutine/continuation.hpp | 87 +++++++++++++++++++++++++++++++--------
sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/Jamfile.v2 | 2
sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/test_continuation.cpp | 24 ++++------
3 files changed, 80 insertions(+), 33 deletions(-)
Modified: sandbox/SOC/2006/coroutine/branches/cleanup/boost/coroutine/continuation.hpp
==============================================================================
--- sandbox/SOC/2006/coroutine/branches/cleanup/boost/coroutine/continuation.hpp (original)
+++ sandbox/SOC/2006/coroutine/branches/cleanup/boost/coroutine/continuation.hpp 2008-07-15 14:52:11 EDT (Tue, 15 Jul 2008)
@@ -6,17 +6,19 @@
#ifndef BOOST_COROUTINE_CONTINUATION_20080321
# define BOOST_COROUTINE_CONTINUATION_20080321
# include "detail/context_interface.hpp"
-# include "move.hpp"
+# include <boost/type_traits/is_same.hpp>
# include <stdlib.h>
namespace boost{ namespace coroutines{
namespace detail {
extern "C" void trampoline(void *) { }
+
+ struct no_argument {};
}
/// Typeless one shot continuation.
///
- /// Represents the reified state of execution of one computation at
+ /// Represents the reified state of execution of one computation as
/// captured at a specific point. The saved state can then be resumed
/// later. Once captured, a continuation must be fired exactly once.
///
@@ -38,9 +40,14 @@
///
/// - once fired a continuation will remain in the fired state
/// unless another continuation is move-assigned to it.
- template<typename Context>
- class continuation_tpl : public movable<continuation_tpl<Context> > {
+ ///
+ /// @note @c continuation is copyable, but all copies will refer to the
+ /// same logical continuaiton. Once a copy is fired, all other
+ /// copies are invalidated.
+ template<typename Context, typename PType = detail::no_argument>
+ class continuation_tpl {
typedef Context context_interface;
+ typedef PType param_type;
template<typename Functor>
struct bound {
@@ -48,8 +55,8 @@
bound& b = *static_cast<bound*>(x);
// We do not know how long b is going to be valid so we need
- // to copy stuff out of it: first retrive just created context;
- continuation_tpl continuation = move(b.continuation);
+ // to copy stuff out of it: first retrive the just created context;
+ continuation_tpl continuation = b.continuation;
// is that what we wanted?
BOOST_ASSERT(continuation.fired());
@@ -61,15 +68,14 @@
Functor functor = b.functor;
// ... and of the caller continuation ...
- continuation_tpl caller = move(*continuation.m_chain);
+ continuation_tpl caller = *continuation.m_chain;
BOOST_ASSERT(!caller.fired());
// ... pass it to the user function... which will eventually
// return the continuation we will have to exit to.
- //move_from<continuation_tpl> mc = move(caller);
- final = functor(move(caller));
+ final = functor(caller);
// Functor is destroyed here
}
@@ -105,6 +111,7 @@
};
public:
+#ifdef MOVE
/// Move constructor.
///
/// Construct a continuation from an rvalue continuation.
@@ -117,19 +124,39 @@
m_state = from->m_state;
from->m_state = state::fired;
}
+#endif
+
+ continuation_tpl(const continuation_tpl & from) {
+ BOOST_ASSERT(&from != this);
+ m_chain = from.m_chain;
+ m_ctx = from.m_ctx;
+ m_state = from.m_state;
+ //from.m_state = state::fired;
+ }
/// Move assignement operator.
///
/// Assign an rvalue right hand side to @c this.
///
/// @post <tt>this->fired() == original_rhs.fired() && rhs.fired() == true </tt>.
+#ifdef MOVE
continuation_tpl&
operator=(move_from<continuation_tpl> rhs) {
BOOST_ASSERT(&*rhs != this);
m_chain = rhs->m_chain;
- m_ctx = move(rhs->m_ctx);
+ m_ctx = rhs->m_ctx;
m_state = rhs->m_state;
- rhs->m_state = state::fired;
+ return *this;
+ }
+#endif
+
+ continuation_tpl&
+ operator=(const continuation_tpl & rhs) {
+ BOOST_ASSERT(&rhs != this);
+ m_chain = rhs.m_chain;
+ m_ctx = rhs.m_ctx;
+ m_state = rhs.m_state;
+ //rhs.m_state = state::fired;
return *this;
}
@@ -168,7 +195,7 @@
BOOST_ASSERT(current.fired());
- continuation_tpl other = move(*current.m_chain);
+ continuation_tpl other = *current.m_chain;
if (other.m_state == state::delete_this) {
context_interface::destroy_context(other.m_ctx);
other.m_state = state::fired;
@@ -176,13 +203,38 @@
} else {
BOOST_ASSERT(!other.fired());
}
- return move(other);
+ return other;
+ }
+
+ template<typename F>
+ friend
+ continuation_tpl
+ callcc1(F f, param_type in, param_type& out, std::ptrdiff_t stack_size = context_interface::default_stack_size) {
+ bound<F> b = { (void*)0xDEADBEEF, f, continuation_tpl(), (void*)0xDEADBEEF };
+
+ // make a new continuation that will invoke f.
+ detail::callback_type cb = &bound<F>::callcc1_target;
+ context_interface::make_context
+ ( b.continuation.m_ctx,
+ cb,
+ (void*)&b,
+ (std::ptrdiff_t)stack_size);
+
+ b.continuation.m_state = state::ready;
+ b.continuation.m_chain = &b.continuation;
+
+ // then call it.
+ return b.continuation();
+
}
+
template<typename F>
friend
continuation_tpl
- callcc1(F f, std::ptrdiff_t stack_size = context_interface::default_stack_size) {
+ callcc1(F f, std::ptrdiff_t stack_size = context_interface::default_stack_size) {
+ static const int i = boost::is_same<param_type, void>::value;
+ BOOST_STATIC_ASSERT((i));
bound<F> b = { (void*)0xDEADBEEF, f, continuation_tpl(), (void*)0xDEADBEEF };
// make a new continuation that will invoke f.
@@ -204,7 +256,7 @@
/// Destructor.
/// @pre <tt>fired() == true</tt>
~continuation_tpl() {
- BOOST_ASSERT(fired());
+ //BOOST_ASSERT(fired());
}
/// Check if the continuation has been invoked.
@@ -216,9 +268,8 @@
/// @pre this continuation must be active.
/// <tt>fired() == true</tt>.
continuation_tpl& caller_continuation() const {
- //
BOOST_ASSERT(fired());
- // the caller is a valid coroutine or is a dead coroutine.
+ // the caller is a valid continuation or is a dead continuation.
BOOST_ASSERT(!m_chain->fired()|| m_chain->m_chain == m_chain);
return *m_chain;
}
@@ -231,8 +282,8 @@
continuation_tpl * m_chain;
context_storage m_ctx;
-
BOOST_DEDUCED_TYPENAME state::my_state m_state;
+ param_type m_p;
continuation_tpl()
: m_chain()
Modified: sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/Jamfile.v2
==============================================================================
--- sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/Jamfile.v2 (original)
+++ sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/Jamfile.v2 2008-07-15 14:52:11 EDT (Tue, 15 Jul 2008)
@@ -40,7 +40,7 @@
project
: requirements
- # <library>/boost/test//boost_unit_test_framework
+ <library>/boost/test//boost_unit_test_framework
<library>../build//boost_coroutine
<link>static
<define>"_WIN32_WINNT=0x0400" #$(TARGET_SPECIFIC_DEFINE)
Modified: sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/test_continuation.cpp
==============================================================================
--- sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/test_continuation.cpp (original)
+++ sandbox/SOC/2006/coroutine/branches/cleanup/libs/coroutine/test/test_continuation.cpp 2008-07-15 14:52:11 EDT (Tue, 15 Jul 2008)
@@ -7,7 +7,7 @@
#include <iostream>
#include <boost/coroutine/detail/context_linux.hpp>
#include <boost/coroutine/continuation.hpp>
-//#include <boost/test/unit_test.hpp>
+#include <boost/test/unit_test.hpp>
namespace coro = boost::coroutines;
@@ -19,7 +19,7 @@
std::cerr << "**** in f (2)"<<std::endl;
x = x();
std::cerr << "**** in f (3)"<<std::endl;
- return move(x);
+ return x;
}
struct g {
@@ -29,7 +29,7 @@
std::cerr << "**** in g ("<<i<<')'<<std::endl;
x = x();
}
- return f(move(x));
+ return f(x);
}
int n;
};
@@ -52,18 +52,14 @@
}
}
-int main() {
- test_continuation();
- return -1;
-}
-// boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
-// {
-// std::cout << "starting test" <<std::endl;
-// boost::unit_test::test_suite *test = BOOST_TEST_SUITE("continuation test");
+boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] )
+{
+ std::cout << "starting test" <<std::endl;
+ boost::unit_test::test_suite *test = BOOST_TEST_SUITE("continuation test");
-// test->add(BOOST_TEST_CASE(&test_continuation));
+ test->add(BOOST_TEST_CASE(&test_continuation));
-// return test;
-// }
+ return test;
+}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk