| |
| // Copyright Keld Helsgaun 2000, 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 <cstddef> |
| #include <iostream> |
| #include <vector> |
| |
| #include <boost/coroutine/all.hpp> |
| |
| typedef boost::coroutines::symmetric_coroutine< void > coro_t; |
| |
| std::vector< int > merge( std::vector< int > const& a, std::vector< int > const& b) |
| { |
| std::vector< int > c; |
| std::size_t idx_a = 0, idx_b = 0; |
| coro_t::call_type * other_a = 0, * other_b = 0; |
| |
| coro_t::call_type coro_a( |
| [&]( coro_t::yield_type & yield) { |
| while ( idx_a < a.size() ) |
| { |
| if ( b[idx_b] < a[idx_a]) |
| yield( * other_b); |
| c.push_back(a[idx_a++]); |
| } |
| while ( c.size() < a.size() + b.size()) |
| c.push_back( b[idx_b]); |
| }); |
| |
| coro_t::call_type coro_b( |
| [&]( coro_t::yield_type & yield) { |
| while ( idx_b < b.size() ) |
| { |
| if ( a[idx_a] < b[idx_b]) |
| yield( * other_a); |
| c.push_back(b[idx_b++]); |
| } |
| while ( c.size() < ( a.size() + b.size() ) ) |
| c.push_back( a[idx_a]); |
| }); |
| |
| |
| other_a = & coro_a; |
| other_b = & coro_b; |
| |
| coro_a(); |
| |
| return c; |
| } |
| |
| void print( std::string const& name, std::vector< int > const& v) |
| { |
| std::cout << name << " : "; |
| for ( auto itm : v) |
| { std::cout << itm << " "; } |
| std::cout << "\n"; |
| } |
| |
| int main( int argc, char * argv[]) |
| { |
| std::vector< int > a = { 1, 5, 6, 10 }; |
| print( "a", a); |
| |
| std::vector< int > b = { 2, 4, 7, 8, 9, 13 }; |
| print( "b", b); |
| |
| std::vector< int > c = merge( a, b); |
| print( "c", c); |
| |
| std::cout << "Done" << std::endl; |
| |
| return EXIT_SUCCESS; |
| } |