pstade::oven::cycled

#include <iostream>
#include <string>

#include <pstade/oven/cycled.hpp>

#include <pstade/oven/io.hpp>

int
main(){
    namespace oven = pstade::oven;
    namespace lambda = boost::lambda;
    
    std::cout << (std::string("01")|oven::cycled(3)) << std::endl;
    
    int array[] = {0, 1, 2};
    auto range = array|oven::cycled(3);
    std::cout << range << std::endl;

    array[1] = 7;
    std::cout << range << std::endl;

    return 0;
}


[出力]

{0,1,0,1,0,1}
{0,1,2,0,1,2,0,1,2}
{0,7,2,0,7,2,0,7,2}


pstade::oven::cycled は、range を引数の数だけ展開するアダプタです。
何かのデータを繰り返し展開したい場合に便利そう。
また、引数なしにすると無限に繰り返しを行ないます。

std::wcout.imbue(std::locale("japanese"));
std::wcout << (std::wstring(L"無駄")|oven::cycled) << std::endl;


[出力]

{無,駄,無,駄,無,駄,無,駄,無,駄,無,駄,無,駄,...


これで、DIOごっこが出来ます。
しかし、"," がちょっと邪魔なので、見やすいように改造。

struct to_string{
    typedef std::string result_type;
    template<typename T>
    result_type operator()(const T rhs) const{
        return static_cast<const std::string&>(rhs|pstade::oven::copied);
    }
};

std::cout <<
    (std::string("オラ")
        |oven::rows(1, 4)
        |oven::cycled
        |oven::transformed(to_string()))
<< std::endl;


[出力]

{オラ,オラ,オラ,オラ,オラ,オラ,オラ,オラ,オラ,...


ふぅやれやれだぜ。


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