#ifndef SUMMATION_H_INCLUDED
#define SUMMATION_H_INCLUDED

#include "procedure.h"

template < class Item, class Result = Item >
class Summation : public Procedure<Item>
{
    protected:
        Result *result;
        bool inref;

        Summation(){ inref = true; result = new Result; }
        Summation(Result *r){ inref = false; result = r; }
        void Init() {}
        void Do(const Item& e){ if(Cond(e)) Add(e); }
        virtual void Add(const Item& e) = 0;
        virtual bool Cond(const Item& e) const { return true;}
    public:
        Result Answer() { return *result; }
        ~Summation(){ if(inref) delete result;}
};

#endif /*SUMMATION_H_INCLUDED*/
