15.39 Query.h文件代码:
#ifndef QUERY_H
#define QUERY_H
#include <iostream>
#include "TextQuery.h"
#include "QueryResult.h"
using namespace std;
class Query;
Query operator~(const Query&);
Query operator|(const Query&, const Query&);
Query operator&(const Query&, const Query&);
class Query_base {
friend class Query;
protected:
using line_no = TextQuery::line_no;
virtual ~Query_base() = default;
private:
virtual QueryResult eval(const TextQuery&) const = 0;
virtual string rep() const = 0;
};
class Query {
friend Query operator~(const Query&);
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
public:
Query(const string&);
QueryResult eval(const TextQuery &t) const { return q->eval(t); }
string rep() const { return q->rep(); }
private:
Query(shared_ptr<Query_base> query): q(query) { }
shared_ptr<Query_base> q;
};
ostream& operator<<(ostream &, const Query &);
class WordQuery: public Query_base {
friend class Query;
WordQuery(const string &s): query_word(s) { }
QueryResult eval(const TextQuery &t) const
{ return t.query(query_word); }
string rep() const { return query_word; }
string query_word;
};
class NotQuery: public Query_base {
friend Query operator~(const Query&);
NotQuery(const Query &q): query(q) { }
string rep() const { return "~(" + query.rep() + ")"; };
QueryResult eval(co