#ifndef __GWL_H__#define __GWL_H__
//GWL名字空间的开始#define GWL_BEGIN namespace gwl{//GWL名字空间的结束#define GWL_END }//使用名字空间GWL#define _GWL using namespace gwl;
#include <tchar.h>#include <windows.h>#include <string>#include <vector>#include <iostream>
GWL_BEGINusing namespace std;
typedef basic_string<TCHAR, char_traits<TCHAR>, allocator<TCHAR> > gstring;
#ifdef _UNICODE#define gout wcout#else#define gout cout#endif
//构建基本错误描述enum {OK,NOTIMPL,MATCHERR,TYPEERR,INPUTERR,OUTPUTERR,BINDERR,DEBINDERR,NULLBIND,UNKNOW};typedef vector<const gstring> gerrortype;class gwlErrorInfo{private: static const gerrortype& error(){ static gerrortype errors(UNKNOW+1); errors[OK] = _T("没有错误"); errors[UNKNOW] =_T("不确定原因的错误"); errors[NOTIMPL] =_T("这个处理没有被真正实现"); errors[MATCHERR] =_T("处理匹配器不能构建"); errors[TYPEERR] = _T("不能处理的数据类型"); errors[INPUTERR] = _T("不能输入这个类型数据"); errors[OUTPUTERR] = _T("不能输出这个类型数据"); errors[BINDERR] = _T("数据不支持绑定操作"); errors[DEBINDERR] = _T("数据不支持解除绑定操作"); errors[NULLBIND] = _T("绑定操作不能针对空指针"); return errors;}public: static const gerrortype& gwlErrors(){return error();}};#define errs gwlErrorInfo::gwlErrors()
////为子类型识别定义一个宏.它把对象本身当做一个异常抛出#define WHO virtual void Who(){throw this;}
//类Element,是编程元素的抽象,被抽象得只有一个特性:被认出身分class Element{public: virtual ~Element(){} virtual void Who() =0; Element(){}protected: explicit Element(const Element&){} Element& operator = (const Element&){return *this;}};////类Company,用来把一些有关联的处理机组织到一起//它相当于现实中的公司或机构class Company:public Element{public: static const gstring& Name() { static gstring name = _T("company"); return name; } WHO};////所有数据的基类型,但它没有任何数据内容. //它是对数据的高度抽象, 抽象到只有它是能被处理这一点特性了.class Data:public Element{ };
////版本信息class VersionInfo:public Data{public: VersionInfo(unsigned int _major =1, unsigned int _minor =0,gstring _name = Company::Name() ): major(_major) ,minor(_minor) ,companyName(_name){}
bool operator == (const VersionInfo& right) { return major == right.major && minor == right.minor && companyName == right.companyName; }
unsigned int major; unsigned int minor; gstring companyName; WHO};////错误信息的携带类型.规定ID为零表示没有错误.class ErrorInfo:public Data{public: ErrorInfo(unsigned int _id, gstring _info):id(_id),info(_info){}
ErrorInfo(unsigned int _id = OK){ id = _id%(UNKNOW+1); info = errs[id]; } ErrorInfo& operator =( ErrorInfo& right){ id = right.id; info= right.info; return *this; } unsigned int id; gstring info; WHOprivate:};////对数据进行分类的模板. template <class PROCESSOR = Processor, class company = Company>class LocalData:public Data{public: typedef LocalData<PROCESSOR, company> localType;};////对错误类型分类的模板.template <class PROCESSOR = Processor, class DATA = Data, class company = Company>class LocalError:public ErrorInfo{public: typedef LocalError<PROCESSOR, DATA, company> localType; LocalError(unsigned int _id, gstring _info): ErrorInfo(_id, _info){} LocalError(unsigned int _id):ErrorInfo(_id){} WHO};
////数据群落//通过数据群落中处理, 用户可以方便的实现自己想要的相关数据处理.template <class PROCESSOR, class company = Company>class DataCommunity:public Data{public: virtual void Set(PROCESSOR& match){} virtual void Get(PROCESSOR& match){}};////处理机的基类型, processor//它是系统中"数据处理块"的高度抽象. 抽象到只能处理数据了.class Processor:public Element{public: Processor(){} virtual void Set(Data& data) {throw ErrorInfo(INPUTERR);} //数据流入 virtual void Get(Data& data) {throw ErrorInfo(OUTPUTERR);} //数据流出 virtual void Bind(Data* data) {throw ErrorInfo(BINDERR);} virtual void Debind(Data* data) {throw ErrorInfo(DEBINDERR);} virtual const ErrorInfo& LastError(){ static ErrorInfo err(NOTIMPL); return err; };protected: //防止因赋值操作和拷贝构造所带来的混乱 Processor& operator =(Processor&){return *this;} explicit Processor(Processor& o){}//这是也防止混乱的.
};
////宏CENOZOIC,用来新生一个处理机#define CENOZOIC(NEW_PROCESSOR_NAME)/class NEW_PROCESSOR_NAME:public Processor/{/public:/ WHO/};
//定义一个从windows动态链接库进行处理机真正实现的建立方针/template<class PROCESSOR>class Windll{public: typedef PROCESSOR* (*CREATE)(PROCESSOR&); Windll():LibHandle(0){} ~Windll(){if (LibHandle) FreeLibrary(LibHandle);} PROCESSOR* Create(TCHAR* path) { CREATE exCreate; if(!path) return 0; LibHandle = LoadLibrary(path); if(!LibHandle) return 0; exCreate = (CREATE)GetProcAddress(LibHandle, "Create"); if(!exCreate) return 0; return exCreate(PROCESSOR()); }private: HMODULE LibHandle;//处理机工厂所在的库的句柄
};
////处理机匹配器.它有以下功能//功能1:对处理机名柄进行智能包装//功能2:对处理所能处理的数据进行匹配template <class PROCESSOR, class COMPANY = Company, template <typename>class ENVIONMENT = Windll>class Match{public: typedef Match<PROCESSOR, COMPANY> MatchType;//, ENVIONMENT> MatchType;//自己的类型 typedef LocalData<PROCESSOR, COMPANY> datatype;//所能处理的数据类型 typedef DataCommunity<PROCESSOR, COMPANY> datacomm;//所能处理的数据群类型
Match(TCHAR* loc) { handle = envionment.Create(loc); } ~Match() { if(handle) { delete handle; handle = 0; } } operator bool(){ return handle?true:false; } //单项数据输入 MatchType& operator >> (datatype& data) { if(!handle) throw ErrorInfo(MATCHERR); handle->Get(data); return *this; }
//单项数据输出 MatchType& operator << (datatype& data) { if(!handle) throw ErrorInfo(MATCHERR); handle->Set(data); return *this; } //数据群落输出 MatchType& operator<< (datacomm& dataSet) { if(!handle) throw ErrorInfo(MATCHERR); dataSet.Set(*handle); return *this; } // 数据群落输入 MatchType& operator >>(datacomm& dataSet) { if(!handle) throw ErrorInfo(MATCHERR); dataSet.Get(*handle); return *this; } const ErrorInfo& LastError() { if(!handle) throw ErrorInfo(MATCHERR); return handle->LastError();
}private: PROCESSOR *handle; ENVIONMENT<PROCESSOR> envionment;};
GWL_END#endif //__GWL_H__
//QQ:707351736
//