blob: 99b6420c56d01de7e816bf644d4bc018ac3a88e6 [file] [log] [blame]
// 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;
}