⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cquery.h

📁 非常实用的查询工具
💻 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 + -