/* Copyright (c) 1992 by AT&T Bell Laboratories. */
/* Advanced C++ Programming Styles and Idioms */
/* James O. Coplien */
/* All rights reserved. */

#include "5-20.c"

class Filter: public Value {
public:
    Filter(Frequency w1, Frequency w2 = 0):
        Value(0, w1), omega2(w2), cachedInput(0) {
    }
    virtual Value *evaluate(Value* = 0) = 0;
    virtual Value *operator()(Value*) = 0;
    virtual void print() = 0;
    Frequency f2() { return omega2; }
    Type type() {
        if (cachedInput) return cachedInput->type();
        else return baseType;
    }
protected:
    Type myType, baseType;
    Value *cachedInput;
private:
    Frequency omega2;
};