00001 #ifndef EXPRESSION_H 00002 #define EXPRESSION_H 00003 // $Id: expression_h-source.html,v 1.1 2001/04/16 17:43:00 dvermeir Exp $ 00004 00005 #include <list> 00006 00007 #include "path.h" 00008 #include "domain.h" 00009 #include "datepattern.h" 00010 #include "logrecord.h" 00011 00012 class Expression { 00013 public: 00014 Expression() {} 00015 virtual ~Expression() {} 00016 virtual bool eval(const LogRecord& r) const = 0; 00017 virtual void print(ostream& os) const = 0; 00018 friend ostream& operator<<(ostream& os,const Expression& e); 00019 }; 00020 00021 class PathExpression: public Expression { 00022 public: 00023 PathExpression(const Path& path): path_(path) {} 00024 bool eval(const LogRecord& r) const; 00025 void print(ostream& os) const; 00026 private: 00027 Path path_; 00028 }; 00029 00030 class DomainExpression: public Expression { 00031 public: 00032 DomainExpression(const Domain& domain): domain_(domain) {} 00033 bool eval(const LogRecord& r) const; 00034 void print(ostream& os) const; 00035 private: 00036 Domain domain_; 00037 }; 00038 00039 class DateExpression: public Expression { 00040 public: 00041 DateExpression(const DatePattern& date): date_(date) {} 00042 bool eval(const LogRecord& r) const; 00043 void print(ostream& os) const; 00044 private: 00045 DatePattern date_; 00046 }; 00047 00048 class NotExpression: public Expression { 00049 public: 00050 NotExpression(const Expression* e): exp_(e) {} 00051 ~NotExpression() { delete exp_; } 00052 bool eval(const LogRecord& r) const { return (exp_ ? !exp_->eval(r) : false); } 00053 void print(ostream& os) const; 00054 private: 00055 const Expression* exp_; 00056 00057 }; 00058 00059 class AndExpression: public Expression { 00060 public: 00061 AndExpression() {} 00062 ~AndExpression(); 00063 void add(Expression* e) { if (e) exps_.push_back(e); } 00064 bool eval(const LogRecord& r) const; 00065 void print(ostream& os) const; 00066 private: 00067 list<Expression*> exps_; 00068 }; 00069 00070 #endif