#ifndef filter_h #define filter_h #include #include "value.hpp" /* A Filter is a special type of derived value that can only return a boolean. * Container objects have a vector of filters that control if a "fill" call * actually places data into the container or not. */ namespace filval { class Filter : public DerivedValue{ }; class FilterAnd : public Filter { protected: Filter *filterA; Filter *filterB; void update_value(){ value = filterA->get_value() && filterB->get_value(); } public: FilterAnd(Filter *filterA, Filter *filterB) :filterA(filterA), filterB(filterB){ } }; class FilterOr : public Filter { private: Filter *filterA; Filter *filterB; void update_value(){ value = filterA->get_value() || filterB->get_value(); } public: FilterOr(Filter *filterA, Filter *filterB) :filterA(filterA), filterB(filterB){ } }; class FilterInv : public Filter { private: Filter *filter; void update_value(){ value = !filter->get_value(); } public: FilterInv(Filter *filter) :filter(filter){ } }; template class FilterGreaterThan : public Filter { private: Value *filter_value; Value *range_low; void update_value(){ value = filter_value->get_value() > range_low->get_value(); } public: FilterGreaterThan(GenValue* filter_value, GenValue* range_low) :filter_value(dynamic_cast*>(filter_value)), range_low(dynamic_cast*>(range_low)) { } FilterGreaterThan(GenValue* filter_value, T range_low) :filter_value(dynamic_cast*>(filter_value)){ this->range_low = new ConstantValue(range_low); } }; template class FilterLessThan : public Filter { private: Value *filter_value; Value *range_high; void update_value(){ value = filter_value->get_value() < range_high->get_value(); } public: FilterLessThan(GenValue* filter_value, GenValue* range_high) :filter_value(dynamic_cast*>(filter_value)), range_high(dynamic_cast*>(range_high)) { } FilterLessThan(GenValue* filter_value, T range_high) :filter_value(dynamic_cast*>(filter_value)){ this->range_high = new ConstantValue(range_high); } }; template class RangeFilter : public FilterAnd { public: RangeFilter(Value *filter_value, Value *range_low, Value *range_high){ this->filterA = new FilterLessThan(filter_value, range_high); this->filterB = new FilterGreaterThan(filter_value, range_low); } RangeFilter(Value *filter_value, T range_low, T range_high){ this->filterA = new FilterLessThan(filter_value, range_high); this->filterB = new FilterGreaterThan(filter_value, range_low); } }; } #endif // filter_h