📄 cquery.h
字号:
# ifndef QUERY_CLASS
# define QUERY_CLASS
# include "CTextQuery.h"
class Query_base
{
friend class Query;
protected:
typedef TextQuery::line_no line_no;
virtual ~Query_base(){ }
private:
virtual set<line_no> eval(const TextQuery& ) const=0;
virtual ostream& display(ostream& ) const=0;
};
class Query
{
friend Query operator~(const Query& );
friend Query operator&(const Query&,const Query&);
friend Query operator||(const Query&,const Query&);
friend inline ostream& operator<<(ostream& os,const Query& q);
public:
Query(const string& s);
Query(const Query& q):p(q.p),use(q.use){++*use;}
~Query(){decr_use();}
Query& operator=(const Query& q);
set<TextQuery::line_no> eval(const TextQuery& t) const {return p->eval(t);}
ostream& display(ostream& os) const {return p->display(os);}
Query_base* operator->() {return p;}
Query_base& operator*() {return *p;}
private:
Query(Query_base* ptr):p(ptr),use(new size_t(1)){}
void decr_use()
{
if(--*(this->use)==0)
{
delete p;
delete use;
}
}
Query_base* p;
size_t* use;
};
inline Query& Query::operator=(const Query& q)
{
++*(q.use);
if(--*(this->use)==0)
delete p;
this->p=q.p;
this->use=q.use;
return *this;
}
inline ostream& operator<<(ostream& os,const Query& q)
{
return q.display(os);
}
class WordQuery:public Query_base
{
friend class Query;
WordQuery(const string& s):query_word(s){}
set<TextQuery::line_no> eval(const TextQuery& t) const
{
return t.run_query(query_word);
}
ostream& display(ostream& os) const
{
os<<query_word;
return os;
}
string query_word;
};
inline Query::Query(const string& s):p(new WordQuery(s))
{
use=new size_t(1);
}
class NotQuery:public Query_base
{
friend Query operator~(const Query& );
NotQuery(Query q):query(q){};
set<TextQuery::line_no> eval(const TextQuery& t) const;
ostream& display(ostream& os) const
{
os<<"~("<<query;
os<<")";
return os;
}
const Query query;
};
inline Query operator~(const Query& q)
{
return new NotQuery(q);
}
class BinaryQuery:public Query_base
{
protected:
friend class Query;
BinaryQuery(Query l,Query r,string s):lq(l),rq(r),oper(s){}
ostream& display(ostream& os) const
{
os<<"("<<lq<<" "<<oper<<" "<<rq<<")";
return os;
}
const Query lq,rq;
string oper;
};
class AndQuery:public BinaryQuery
{
friend Query operator&(const Query&,const Query&);
AndQuery(Query l,Query r):BinaryQuery(l,r,"&"){}
set<TextQuery::line_no> eval(const TextQuery& t) const;
};
inline Query operator&(const Query& q1,const Query& q2)
{
return new AndQuery(q1,q2);
}
class OrQuery:public BinaryQuery
{
friend Query operator||(const Query&,const Query&);
OrQuery(Query l,Query r):BinaryQuery(l,r,"||"){}
set<TextQuery::line_no> eval(const TextQuery& t) const;
};
inline Query operator||(const Query& q1,const Query& q2)
{
return new OrQuery(q1,q2);
}
# endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -