2
0
mirror of https://github.com/boostorg/asio.git synced 2026-01-29 19:12:09 +00:00
Files
asio/example/http/server4/coroutine.hpp
Christopher Kohlhoff 760f58b6ca Merged from trunk.
........
  r63568 | chris_kohlhoff | 2010-07-04 16:49:18 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fix coroutine macros to work with MSVC's edit-and-continue debug settings.
........
  r63569 | chris_kohlhoff | 2010-07-04 16:53:57 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Reworked timeout examples.
........
  r63570 | chris_kohlhoff | 2010-07-04 16:57:32 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Ensure arguments to handlers are passed as const types.
........
  r63571 | chris_kohlhoff | 2010-07-04 17:19:30 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fences for arm.
........
  r63572 | chris_kohlhoff | 2010-07-04 17:20:18 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fences for arm.
........
  r63573 | chris_kohlhoff | 2010-07-04 17:21:24 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fix forward declaration.
........
  r63574 | chris_kohlhoff | 2010-07-04 17:23:27 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Add cancellation of reactor operations.
........
  r63575 | chris_kohlhoff | 2010-07-04 17:26:36 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fixes in non_blocking_read.
........
  r63576 | chris_kohlhoff | 2010-07-04 17:28:20 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Make more tolerant of different platform sdk variants.
........
  r63577 | chris_kohlhoff | 2010-07-04 17:37:42 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Eliminate unnecessary uses of hash_map.
........
  r63578 | chris_kohlhoff | 2010-07-04 17:43:23 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Point docs at new timeout examples.
........
  r63592 | chris_kohlhoff | 2010-07-04 23:11:14 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Add missing operator+ overload. Fixes #4382.
........
  r63594 | chris_kohlhoff | 2010-07-04 23:42:41 +1000 (Sun, 04 Jul 2010) | 2 lines
  
  Fix unused parameters.
........
  r63646 | chris_kohlhoff | 2010-07-05 17:43:22 +1000 (Mon, 05 Jul 2010) | 2 lines
  
  Add missing parameter.
........


[SVN r63682]
2010-07-06 04:49:47 +00:00

88 lines
2.1 KiB
C++

//
// coroutine.hpp
// ~~~~~~~~~~~~~
//
// Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// 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 COROUTINE_HPP
#define COROUTINE_HPP
class coroutine
{
public:
coroutine() : value_(0) {}
bool is_child() const { return value_ < 0; }
bool is_parent() const { return !is_child(); }
bool is_complete() const { return value_ == -1; }
private:
friend class coroutine_ref;
int value_;
};
class coroutine_ref
{
public:
coroutine_ref(coroutine& c) : value_(c.value_), modified_(false) {}
coroutine_ref(coroutine* c) : value_(c->value_), modified_(false) {}
~coroutine_ref() { if (!modified_) value_ = -1; }
operator int() const { return value_; }
int& operator=(int v) { modified_ = true; return value_ = v; }
private:
void operator=(const coroutine_ref&);
int& value_;
bool modified_;
};
#define CORO_REENTER(c) \
switch (coroutine_ref _coro_value = c) \
case -1: if (_coro_value) \
{ \
goto terminate_coroutine; \
terminate_coroutine: \
_coro_value = -1; \
goto bail_out_of_coroutine; \
bail_out_of_coroutine: \
break; \
} \
else case 0:
#define CORO_YIELD_IMPL(n) \
for (_coro_value = (n);;) \
if (_coro_value == 0) \
{ \
case (n): ; \
break; \
} \
else \
switch (_coro_value ? 0 : 1) \
for (;;) \
case -1: if (_coro_value) \
goto terminate_coroutine; \
else for (;;) \
case 1: if (_coro_value) \
goto bail_out_of_coroutine; \
else case 0:
#define CORO_FORK_IMPL(n) \
for (_coro_value = -(n);; _coro_value = (n)) \
if (_coro_value == (n)) \
{ \
case -(n): ; \
break; \
} \
else
#if defined(_MSC_VER)
# define CORO_YIELD CORO_YIELD_IMPL(__COUNTER__ + 1)
# define CORO_FORK CORO_FORK_IMPL(__COUNTER__ + 1)
#else // defined(_MSC_VER)
# define CORO_YIELD CORO_YIELD_IMPL(__LINE__)
# define CORO_FORK CORO_FORK_IMPL(__LINE__)
#endif // defined(_MSC_VER)
#endif // COROUTINE_HPP