#ifndef SUMMATION_H_INCLUDED
#define SUMMATION_H_INCLUDED

#include "procedure.h"

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

        Summation(){ inref = true; result = new Range; }
        Summation(Range *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:
        Range Answer() { return *result; }
        ~Summation(){ if(inref) delete result;}
};

#endif /*SUMMATION_H_INCLUDED*/