summaryrefslogtreecommitdiff
path: root/boost/coroutine2/detail/push_coroutine.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:30:07 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2016-10-06 10:32:57 +0900
commit71d216b90256936a9638f325af9bc69d720e75de (patch)
tree9c5f682d341c7c88ad0c8e3d4b262e00b6fb691a /boost/coroutine2/detail/push_coroutine.hpp
parent733b5d5ae2c5d625211e2985ac25728ac3f54883 (diff)
downloadboost-71d216b90256936a9638f325af9bc69d720e75de.tar.gz
boost-71d216b90256936a9638f325af9bc69d720e75de.tar.bz2
boost-71d216b90256936a9638f325af9bc69d720e75de.zip
Imported Upstream version 1.59.0
Change-Id: I2dde00f4eca71df3eea9d251dcaecde18a6c90a5 Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/coroutine2/detail/push_coroutine.hpp')
-rw-r--r--boost/coroutine2/detail/push_coroutine.hpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/boost/coroutine2/detail/push_coroutine.hpp b/boost/coroutine2/detail/push_coroutine.hpp
new file mode 100644
index 0000000000..1a2d01f67e
--- /dev/null
+++ b/boost/coroutine2/detail/push_coroutine.hpp
@@ -0,0 +1,242 @@
+
+// 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_COROUTINES2_DETAIL_PUSH_COROUTINE_HPP
+#define BOOST_COROUTINES2_DETAIL_PUSH_COROUTINE_HPP
+
+#include <iterator>
+#include <type_traits>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+#include <boost/context/execution_context.hpp>
+
+#include <boost/coroutine2/detail/config.hpp>
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace coroutines2 {
+namespace detail {
+
+template< typename T >
+class push_coroutine {
+private:
+ template< typename X >
+ friend class pull_coroutine;
+
+ struct control_block;
+
+ control_block * cb_;
+
+ explicit push_coroutine( control_block *);
+
+public:
+ template< typename Fn >
+ explicit push_coroutine( Fn &&, bool = false);
+
+ template< typename StackAllocator, typename Fn >
+ explicit push_coroutine( StackAllocator, Fn &&, bool = false);
+
+ ~push_coroutine();
+
+ push_coroutine( push_coroutine const&) = delete;
+ push_coroutine & operator=( push_coroutine const&) = delete;
+
+ push_coroutine( push_coroutine &&);
+
+ push_coroutine & operator=( push_coroutine && other) {
+ if ( this != & other) {
+ cb_ = other.cb_;
+ other.cb_ = nullptr;
+ }
+ return * this;
+ }
+
+ push_coroutine & operator()( T const&);
+
+ push_coroutine & operator()( T &&);
+
+ explicit operator bool() const noexcept;
+
+ bool operator!() const noexcept;
+
+ class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void > {
+ private:
+ push_coroutine< T > * c_;
+
+ public:
+ iterator() :
+ c_( nullptr) {
+ }
+
+ explicit iterator( push_coroutine< T > * c) :
+ c_( c) {
+ }
+
+ iterator & operator=( T t) {
+ BOOST_ASSERT( c_);
+ if ( ! ( * c_)( t) ) c_ = 0;
+ return * this;
+ }
+
+ bool operator==( iterator const& other) const {
+ return other.c_ == c_;
+ }
+
+ bool operator!=( iterator const& other) const {
+ return other.c_ != c_;
+ }
+
+ iterator & operator*() {
+ return * this;
+ }
+
+ iterator & operator++() {
+ return * this;
+ }
+ };
+};
+
+template< typename T >
+class push_coroutine< T & > {
+private:
+ template< typename X >
+ friend class pull_coroutine;
+
+ struct control_block;
+
+ control_block * cb_;
+
+ explicit push_coroutine( control_block *);
+
+public:
+ template< typename Fn >
+ explicit push_coroutine( Fn &&, bool = false);
+
+ template< typename StackAllocator, typename Fn >
+ explicit push_coroutine( StackAllocator, Fn &&, bool = false);
+
+ ~push_coroutine();
+
+ push_coroutine( push_coroutine const&) = delete;
+ push_coroutine & operator=( push_coroutine const&) = delete;
+
+ push_coroutine( push_coroutine &&);
+
+ push_coroutine & operator=( push_coroutine && other) {
+ if ( this != & other) {
+ cb_ = other.cb_;
+ other.cb_ = nullptr;
+ }
+ return * this;
+ }
+
+ push_coroutine & operator()( T &);
+
+ explicit operator bool() const noexcept;
+
+ bool operator!() const noexcept;
+
+ class iterator : public std::iterator< std::output_iterator_tag, void, void, void, void > {
+ private:
+ push_coroutine< T & > * c_;
+
+ public:
+ iterator() :
+ c_( nullptr) {
+ }
+
+ explicit iterator( push_coroutine< T & > * c) :
+ c_( c) {
+ }
+
+ iterator & operator=( T & t) {
+ BOOST_ASSERT( c_);
+ if ( ! ( * c_)( t) ) c_ = 0;
+ return * this;
+ }
+
+ bool operator==( iterator const& other) const {
+ return other.c_ == c_;
+ }
+
+ bool operator!=( iterator const& other) const {
+ return other.c_ != c_;
+ }
+
+ iterator & operator*() {
+ return * this;
+ }
+
+ iterator & operator++() {
+ return * this;
+ }
+ };
+};
+
+template<>
+class push_coroutine< void > {
+private:
+ template< typename X >
+ friend class pull_coroutine;
+
+ struct control_block;
+
+ control_block * cb_;
+
+ explicit push_coroutine( control_block *);
+
+public:
+ template< typename Fn >
+ explicit push_coroutine( Fn &&, bool = false);
+
+ template< typename StackAllocator, typename Fn >
+ explicit push_coroutine( StackAllocator, Fn &&, bool = false);
+
+ ~push_coroutine();
+
+ push_coroutine( push_coroutine const&) = delete;
+ push_coroutine & operator=( push_coroutine const&) = delete;
+
+ push_coroutine( push_coroutine &&);
+
+ push_coroutine & operator=( push_coroutine && other) {
+ if ( this != & other) {
+ cb_ = other.cb_;
+ other.cb_ = nullptr;
+ }
+ return * this;
+ }
+
+ push_coroutine & operator()();
+
+ explicit operator bool() const noexcept;
+
+ bool operator!() const noexcept;
+};
+
+template< typename T >
+typename push_coroutine< T >::iterator
+begin( push_coroutine< T > & c) {
+ return typename push_coroutine< T >::iterator( & c);
+}
+
+template< typename T >
+typename push_coroutine< T >::iterator
+end( push_coroutine< T > &) {
+ return typename push_coroutine< T >::iterator();
+}
+
+}}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+#endif
+
+#endif // BOOST_COROUTINES2_DETAIL_PUSH_COROUTINE_HPP