Boost.Phoenix で sleep sort

一時期流行ったアレ。
最初は、Boost.Thread を使った sleep sort を書こうと思っていただけなんですが、気がついたら Boost.Phoenix でガシガシ書いていました。

[ソース]

#include <boost/thread.hpp>
#include <boost/phoenix.hpp>
#include <boost/function.hpp>
#include <boost/typeof/typeof.hpp>
#include <iostream>


int
main(){
    namespace phx = boost::phoenix;
    using phx::local_names::_a;
    using phx::local_names::_b;
    using phx::local_names::_v;
    using phx::local_names::_g;
    using phx::arg_names::arg1;
    using phx::arg_names::arg2;

    BOOST_AUTO(sleep_sort, phx::let(
        _g = arg1,
        _v = arg2
    )[
        phx::for_each(_v,
            phx::lambda[
                phx::bind(
                    &boost::thread_group::create_thread<boost::function<void()> >,
                    _g,
                    phx::lambda(_b = arg1)[
                        phx::bind(
                            boost::this_thread::sleep<boost::posix_time::seconds>,
                            phx::construct<boost::posix_time::seconds>(_b)
                        ),
                        std::cout << _b << std::endl
                    ]
                )
            ]
        )
    ]);
    
    int array[] = {1, 0, 2, 8, 5, 3, 9, 7, 4, 6};
    boost::thread_group group;

    std::cout << "start sleep sort" << std::endl;
    sleep_sort(group, array);
    
    group.join_all();
    return 0;
}

[出力]

start sleep sort
0
1
2
3
4
5
6
7
8
9

テンプレート関数をそのまま渡せないのが悲しいですね。
create_thread は仕方なく boost::function を使っていてぐぬぬ…。
しかし、Boost.Phoenix で書くとスコープが深いな…。
他にも Boost.Asio でも sleep sort を書いてみたいところ。

[boost]

  • ver 1.47.0