pstade::oven::zipped

#include <iostream>

#include <boost/tuple/tuple_io.hpp>

#include <pstade/oven/zipped.hpp>

#include <pstade/oven/copied.hpp>
#include <pstade/oven/io.hpp>
#include <pstade/oven/identities.hpp>
#include <boost/array.hpp>

int
main(){
    namespace oven = pstade::oven;
    
    int  array1[] = {0, 1, 2, 3, 4};
    char array2[] = {'a', 'b', 'c', 'd', 'e'};

    // 標準出力されるように oven::identities をアダプト
    std::cout <<
        boost::make_tuple(array1|oven::identities, array2|oven::identities)
    << std::endl;
    
    std::cout <<
        (boost::make_tuple(array1, array2)|oven::zipped)
    << std::endl;

    return 0;
}


[出力]

({0,1,2,3,4} {a,b,c,d,e})
{(0 a),(1 b),(2 c),(3 d),(4 e)}


pstade::oven::zipped は、tuple, range > を range > の様な形に変換を行うアダプタです。
当然ですが、両方の range の長さは、同じでないとダメです。

boost::tuple<boost::array<int, 5>, boost::array<char, 5> >

↓↓↓↓↓

boost::array<boost::tuple<int, char>, 5>


応用すればループカウンタなんかを付けることも出来るみたい。

std::string str("JOKER");

boost::for_each(
    boost::make_tuple(str, oven::counting(0, str.size()))|oven::zipped,
    [](boost::tuple<char, int> data){
        int index;
        char c;
        boost::tie(c, index) = data;
        std::cout << index << ":" << c << std::endl;
    }
);


[出力]

0:J
1:O
2:K
3:E
4:R


ただ、boost::fusion::vector には対応してないみたい。
pstade::oven::fuzipped 使えばいいそうです。

// oven::fuzipped を使う。
boost::fusion::make_vector(array1, array2)|oven::fuzipped;


最近、露骨に手抜きなのがバレバレっすね…。
コメントありがとうございます。


[pstade]
ver 1.04.3
[参照]
http://d.hatena.ne.jp/faith_and_brave/20100503/