HiveBrain v1.2.0
Get Started
← Back to all entries
patterncppMinor

Generic pipe and filters

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
andgenericfilterspipe

Problem

I made a template pipe and filters to replace an old pipe and filters implementation that used inheritance and had a very heavy base class.

#include 
#include 
#include 
#include 

template 
class pipeline {
    typedef boost::function filter_function;
    typedef std::list filter_list;
    filter_list m_list;

public:
    template
    void add(T t) {
        m_list.push_back(boost::bind(&T::filter, t, _1));
    }

    Data run(Data data) {
        typedef typename filter_list::iterator iter;
        iter end = m_list.end();

        for(iter it = m_list.begin(); it != end; ++it) {
            data = (*it)(data);
        }

        return data;
    }
};

struct foo {
    int filter(int i) {
        return i + 1;
    }
};

int main(int argc, _TCHAR* argv[])
{
    pipeline pipe;
    foo f;
    pipe.add(f);
    std::cout > c;
}


Except the fact that add() is a template, are there any issues anyone sees with this approach?

Solution

-
As run() is several lines long, it should be defined outside the class. Anything defined inside is automatically inlined.

-
Depending on the size of data when passing by value, it may be best to pass it to run() by const&, modify a local copy, and return that. RVO should still kick in.

-
Is there a significance to the name foo here? If not, it should be more accurate and start with a capital letter as it's a user-defined type. The capitalization also applies to pipeline.

-
iter end = m_list.end(); seems pointless here. You can just use m_list.end() inside the loop statement.

As m_list is not being modified inside the loop, you can instead use cbegin() and cend() for const-correctness.

If you have C++11, you can use auto to replace the defined iterator inside the loop statement.

-
Your "pause" is okay, but you can also use std::cin.get() to do the same thing.

Context

StackExchange Code Review Q#26444, answer score: 7

Revisions (0)

No revisions yet.