mardi 26 mai 2015

Custom range for boost::range library

I’m writing filter and map algorithms using boost::range library:

template <class Range> struct Converter
{
    Converter(const Range& p_range) : m_range(p_range) {}

    template<class OutContainer> operator OutContainer() const
    {
        return {m_range.begin(), m_range.end()};
    }

private:
    Range m_range;
};

template<class Range> Converter<Range> convert(const Range& p_range) { return {p_range}; }

template<class Range, class Fun> auto map(Range&& p_range, Fun&& p_fun)
{
    return convert(p_range | boost::adaptors::transformed(p_fun));
}

template<class Range, class Pred> auto filter(Range&& p_range, Pred&& p_pred)
{
    return convert(p_range | boost::adaptors::filtered(p_pred));
}

Right now I can use them like this:

std::vector<int> l_in  = {1, 2, 3, 4, 5};
std::vector<int> l_tmp_out = filter(l_in, [](int p){ return p < 4; });
std::vector<int> l_out = map(l_tmp_out, [](int p){ return p + 5; });

I would also like to write code this way:

map(filter(l_in, [](int p){ return p < 4; }), [](int p){ return p + 5; });

Unfortunately my Converter class does not compose with boost::range algorithms so this example does not compile. I'm looking for a proper way to change that.

Aucun commentaire:

Enregistrer un commentaire