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

📄 template.cpp

📁 Oracle调用接口
💻 CPP
字号:
#include "Template.h"Template::Template() : ObjectContainer(TEMPLATE) {	}Template::~Template() {	map<string,TemplateObject *>::iterator i=childs.begin();	while(i!=childs.end()) {		delete i->second;		i++;	}	childs.clear();}void Template::add(const string &name,const string &val) {	TemplateVariable *t = new TemplateVariable(val);	childs[name]=t;}void Template::add(const string &name,int val) {	TemplateVariable *t = new TemplateVariable(val); 	childs[name]=t;}void Template::add(const string &name,double val) {	TemplateVariable *t = new TemplateVariable(val);	childs[name]=t;}void Template::add(const string &name,DataSet *val) {	childs[name]=val;}void Template::parse(char *t_name,FILE *out=stdout) {	TmplTag t;	t.args["filename"]=t_name;	doTemplate(0,this,t,true,out);}TemplateObject *Template::getVal(const string &key) {	if(strict) {		map<string,TemplateObject *>::const_iterator ci=childs.find(key);		if(ci==childs.end()) throw TemplateError("Error: '"+key+"' not defined in this scope");	}	return childs[key];}bool Template::hasKey(const string &key) {	map<string,TemplateObject *>::const_iterator ci=childs.find(key);	if(ci==childs.end()) {			return false;	} else {		return true;	}}#define SET_GENERAL_HANDLERS(p) \do { \	p->addHandler("include",doTemplate); \	p->addHandler("variable",doVariable);\	p->addHandler("dataset",doDataSet); \	p->addHandler("if",doIf); \} while (0) void doVariable(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) {	if(!active) return;try {	//We'll get template error if strict here and val is not exist...	TemplateObject *t=dynamic_cast<ObjectContainer *>(cur)->getVal(tag.args["name"]); 	if(t) {		if(t->getType()!=VARIABLE) throw ParserError("Cannot cast to variable",tag);	} else return;	fputs(dynamic_cast<TemplateVariable *>(t)->getVal().c_str(),out);} catch (TemplateError err) {	throw ParserError(err.getError(),tag);} catch (...) {	throw ParserError("Unknow exception raised",tag);}}void doTemplate(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) {	if(!active) return;	string f_name=tag.args["filename"];	if(f_name[0]!='/') {		f_name=tmpl->getTemplateDir()+"/"+f_name;	}	TemplateContainer *t = new TemplateContainer(f_name.c_str());	Parser *p = new Parser(t,cur,"",out);	SET_GENERAL_HANDLERS(p);	p->setActive(true);	p->parse();	delete p;	delete t;}void doDataSet(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) {try {	if(!active) {		Parser *p=new Parser(tmpl,0,"dataset",out);		p->setActive(false);		SET_GENERAL_HANDLERS(p);		p->parse();		delete p;		return;	}} catch(TemplateError err) {	throw ParserError(err.getError(),tag);}try {		TemplateObject *t=dynamic_cast<ObjectContainer *>(cur)->getVal(tag.args["name"]);	if(t) {		if(t->getType()!=DATASET) throw ParserError("Cannot cast to dataset",tag);	} else { // skip it ..		Parser *p=new Parser(tmpl,0,"dataset",out);		p->setActive(false);		SET_GENERAL_HANDLERS(p);		p->parse();		delete p;		return;	}		DataSet *d=dynamic_cast<DataSet *>(t);	int begin=tmpl->getCurrent();	Parser *p=new Parser(tmpl,d,"dataset",out);		SET_GENERAL_HANDLERS(p);	if(!(d->getSize())) {		p->setActive(false);		p->parse();	} else {		p->setActive(active);		for(int i=0;i<d->getSize();i++) {			d->setCurrentRow(i);			if(i==0) d->add("FIRST","true");			if(i==d->getSize()-1) d->add("LAST","true");			if(i>0 && i<(d->getSize()-1)) d->add("INNER","true");			tmpl->setCurrent(begin);			p->parse();		}	}	delete p;} catch(TemplateError err) {	throw ParserError(err.getError(),tag);}}void doIf(TemplateContainer *tmpl,TemplateObject *cur,TmplTag &tag,bool active,FILE *out) {	string expression=tag.args["expr"];	Parser *p=new Parser(tmpl,cur,"if",out);	SET_GENERAL_HANDLERS(p);	if(!active) {		p->setActive(false);	} else if(expression[0]=='!') {		expression=expression.substr(1);		if(!dynamic_cast<ObjectContainer *>(cur)->hasKey(expression)) {			p->setActive(true);		} else {			p->setActive(false);		}	} else {		if(dynamic_cast<ObjectContainer *>(cur)->hasKey(expression)) {			p->setActive(true);		} else {			p->setActive(false);		}	}	p->parse();	delete p;	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -