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

📄 univar.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	return Calculate(tv1,tv2,14);
}

UniVar operator <(const UniVar & tv1,const UniVar & tv2)
{
	return Calculate(tv1,tv2,15);
}

UniVar iCalculate(DWORD dwOp,const UniVar & tv3,const UniVar & tv4)
{
	int iFlag=0;
	switch(dwOp){
	case WORD_ADD	: iFlag=0;break;
	case WORD_SUB	: iFlag=1;break;
	case WORD_MUL	: iFlag=2;break;
	case WORD_DEV	: iFlag=3;break;
	case WORD_BIG	: iFlag=10;break;
	case WORD_SML	: iFlag=15;break;
	case WORD_SAM	: iFlag=12;break;
	case WORD_BGE	: iFlag=11;break;
	case WORD_SME	: iFlag=14;break;
	case WORD_AND	: iFlag=8;break;
	case WORD_OR	: iFlag=9;break;
	case WORD_BAND	: iFlag=6;break;
	case WORD_BOR	: iFlag=7;break;
	case WORD_XOR	: iFlag=5;break;
	case WORD_MOD	: iFlag=4;break;
	case WORD_NEQ	: iFlag=13;break;
	default:return UniVar(0);
	}
	return Calculate(tv3,tv4,iFlag);
}

BOOL bPrior(DWORD d1,DWORD d2)
{
	int iFlag=0,iFlag1;
	switch(d1){
	case WORD_ADD	: iFlag=3;break;
	case WORD_SUB	: iFlag=3;break;
	case WORD_MUL	: iFlag=5;break;
	case WORD_DEV	: iFlag=5;break;
	case WORD_BIG	: iFlag=2;break;
	case WORD_SML	: iFlag=2;break;
	case WORD_SAM	: iFlag=2;break;
	case WORD_BGE	: iFlag=2;break;
	case WORD_SME	: iFlag=2;break;
	case WORD_AND	: iFlag=1;break;
	case WORD_OR	: iFlag=1;break;
	case WORD_BAND	: iFlag=4;break;
	case WORD_BOR	: iFlag=4;break;
	case WORD_XOR	: iFlag=4;break;
	case WORD_MOD	: iFlag=5;break;
	case WORD_NEQ	: iFlag=2;break;
	case WORD_LEFTSMLBRACKET: iFlag=6;break;
	case WORD_RIGHTSMLBRACKET: iFlag=0;break;
	default: ASSERT(0);return FALSE;
	}
	iFlag1=iFlag;
	switch(d2){
	case WORD_ADD	: iFlag=3;break;
	case WORD_SUB	: iFlag=3;break;
	case WORD_MUL	: iFlag=5;break;
	case WORD_DEV	: iFlag=5;break;
	case WORD_BIG	: iFlag=2;break;
	case WORD_SML	: iFlag=2;break;
	case WORD_SAM	: iFlag=2;break;
	case WORD_BGE	: iFlag=2;break;
	case WORD_SME	: iFlag=2;break;
	case WORD_AND	: iFlag=1;break;
	case WORD_OR	: iFlag=1;break;
	case WORD_BAND	: iFlag=4;break;
	case WORD_BOR	: iFlag=4;break;
	case WORD_XOR	: iFlag=4;break;
	case WORD_MOD	: iFlag=5;break;
	case WORD_NEQ	: iFlag=2;break;
	case WORD_LEFTSMLBRACKET: iFlag=6;break;
	case WORD_RIGHTSMLBRACKET: iFlag=0;break;
	default: ASSERT(0);return FALSE;
	}
	return (iFlag1>iFlag);
}

bool UniVar::Getbyte(int idx,UniVar & tv)
{
	switch(it){
	case DATA_TYPE_HANDLE	:
	case DATA_TYPE_STRING	:
		if(idx>0&&idx<GetDataLength()){
			tv=(int)uv.bv[idx];
			return true;
		}
		break;
	case DATA_TYPE_INT		:
	case DATA_TYPE_DWORD	:
		if(idx>=0||idx<4){
			char * p1=(char *)&uv.iv;
			tv=(int)(p1[idx]);
			return true;
		}
		break;
	case DATA_TYPE_FLOAT	:
		if(idx>=0||idx<8){
			char * p1=(char *)&uv.iv;
			tv=(int)(p1[idx]);
			return true;
		}
		break;
	default:
		break;
	}
	tv=0;
	return false;
}

void UniVar::BlockSet(BLOCKOPRATOR iFlag,UniVar & tv,int iFirst,int iLen,int iReset)
{
	switch(iReset){
	case DATA_TYPE_HANDLE	:
		tv.SetValue((void *)NULL,0);
		break;
	case DATA_TYPE_STRING	:
		tv="";
		break;
	case DATA_TYPE_INT		:
		if(iLen==0)iLen=4;
		tv=0;
		break;
	case DATA_TYPE_DWORD	:
		if(iLen==0)iLen=4;
		tv=(DWORD)0;
		break;
	case DATA_TYPE_FLOAT	:
		if(iLen==0)iLen=8;
		tv=0.0f;
		break;
	default:
		break;
	}
	if(it!=DATA_TYPE_HANDLE){
		if(it==DATA_TYPE_STRING)it=DATA_TYPE_HANDLE;
		else{
			return;
		}
	}
	switch(iFlag){
	case UniVar::univarpt:
		{
			if(iFirst<0||iFirst>(int)(GetDataLength()-sizeof(UniVar)))return;
			UniVar * pv=(UniVar *)(uv.hv+iFirst);
			if(iLen){
				if(!UniVar::ValidVar(pv))memset(pv,0,sizeof(UniVar));
				else *pv=0;
				memcpy(pv,&tv,sizeof(UniVar));
				memset(&tv,0,sizeof(UniVar));
			}
			else{
				tv=0;
				if(!UniVar::ValidVar(pv))memset(pv,0,sizeof(UniVar));
				memcpy(&tv,pv,sizeof(UniVar));
				memset(pv,0,sizeof(UniVar));
			}
		}
		break;
	case UniVar::insertblock: 
		{
			if(iFirst>GetDataLength())iFirst=GetDataLength();
			if(iFirst<0)iFirst=0;
			int iAddlen=tv.GetDataLength();
			BYTE * p1,* p2=(BYTE *)uv.hv,*p3;
			if(iAddlen==0){
				if(iLen==0||iLen>4)iAddlen=4;
				else iAddlen=iLen;
				p3=(BYTE *)&tv.uv.iv;
			}
			else {
				p3=(BYTE *)tv.uv.pv;
			}
			p1=(BYTE *)HeapAlloc(UniVar::m_hCreate,0,GetDataLength()+iAddlen);//new BYTE[GetDataLength()+iAddlen];
			if(p1){
				UniVar::m_iHeapBlock++;
				if(p2){
					memcpy(p1,p2,iFirst);
					memcpy(p1+iFirst+iAddlen,p2+iFirst,GetDataLength()-iFirst);
					HeapFree(UniVar::m_hCreate,0,p2);//delete [] p2;
					UniVar::m_iHeapBlock--;
				}
				memcpy(p1+iFirst,p3,iAddlen);
				uv.heap.handle=uv.heap.pBuffer=p1;
				SetDataLength(GetDataLength()+iAddlen);
			}
		}
		break;
	case UniVar::deleteblock: 
		if(GetDataLength()){
			if(iFirst>GetDataLength())iFirst=GetDataLength();
			if(iFirst<0)iFirst=0;
			if(iLen<0)iLen=0;
			if(iLen>GetDataLength()-iFirst)iLen=GetDataLength()-iFirst;
			if(iLen!=0){
				if(iLen==GetDataLength()){
					if(HeapFree(UniVar::m_hCreate,0,uv.bv))UniVar::m_iHeapBlock--;
					uv.heap.handle=uv.heap.pBuffer=NULL;
					SetDataLength(0);
				}
				else {
					BYTE * p1,* p2=uv.bv;
					p1=(BYTE *)HeapAlloc(UniVar::m_hCreate,0,GetDataLength()-iLen);//new BYTE[GetDataLength()+iAddlen];
					if(p1){
						UniVar::m_iHeapBlock++;
						memcpy(p1,p2,iFirst);
						memcpy(p1+iFirst,p2+iFirst+iLen,GetDataLength()-iFirst-iLen);
						if(HeapFree(UniVar::m_hCreate,0,p2))
							UniVar::m_iHeapBlock--;
						uv.heap.handle=uv.heap.pBuffer=p1;
						SetDataLength(GetDataLength()-iLen);
					}
				}
			}
		}
		break;
	case UniVar::substblock: 
		{
			if(iFirst>GetDataLength())iFirst=GetDataLength();
			if(iFirst<0)iFirst=0;
			if(iLen<0)iLen=0;
			if(iLen>GetDataLength()-iFirst)iLen=GetDataLength()-iFirst;
			int iAddlen=tv.GetDataLength();
			BYTE * p1,* p2=uv.bv,*p3;
			if(iAddlen==0){
				iAddlen=4;
				p3=(BYTE *)&tv.uv.iv;
			}
			else {
				p3=tv.uv.bv;
			}
			int iDef=iAddlen-iLen;
			ASSERT(GetDataLength()+iDef>=0);
			p1=(BYTE *)HeapAlloc(UniVar::m_hCreate,0,GetDataLength()+iDef);
			if(p1){
				UniVar::m_iHeapBlock++;
				if(p2){
					memcpy(p1,p2,iFirst);
					memcpy(p1+iFirst+iAddlen,p2+iFirst+iLen,GetDataLength()-iFirst-iLen);
					if(HeapFree(UniVar::m_hCreate,0,p2))UniVar::m_iHeapBlock--;
				}
				uv.heap.handle=uv.heap.pBuffer=p1;
				memcpy(p1+iFirst,p3,iAddlen);
				SetDataLength(GetDataLength()+iDef);
			}
		}
		break;
	case UniVar::copyblock: 
		if(GetDataLength()){
			if(!iLen)return ;
			int direct=1;
			if(iLen<0){
				iLen=-iLen;
				direct=0;
			};
			if(iFirst<0||iFirst+iLen>GetDataLength())return;
			BYTE * p2=uv.bv;
			switch(tv.it){
			case DATA_TYPE_HANDLE	:
				if(direct){
					tv.SetValue((void *)(p2+iFirst),iLen);
				}
				else{
					if(tv.GetDataLength()<iLen)return;
					memcpy(uv.bv+iFirst,tv.uv.bv,iLen);
				}
				break;
			case DATA_TYPE_STRING	:
				{
					if(direct){
						bool bok=false;
						for(int i=iFirst;i<iLen+iFirst;i++){
							if(p2[i]=='\0'){
								bok=true;
								break;
							}
						}
						if(bok){
							tv=(char *)(p2+iFirst);
							break;
						}
					}
					else{
						if(!tv.GetDataLength())return;
						if(tv.GetDataLength()<iLen){
							memcpy(p2+iFirst,tv.uv.bv,tv.GetDataLength());
						}
						else{
							memcpy(p2+iFirst,tv.uv.bv,iLen);
						}
					}
				}
				break;
			case DATA_TYPE_INT		:
			case DATA_TYPE_DWORD	:
				if(direct){
					if(iLen<4){
						tv.uv.iv=0;
						memcpy((BYTE *)&tv.uv.iv,p2+iFirst,iLen);
					}
					else {
						tv.uv.iv=*((int*)(p2+iFirst));
					}
				}
				else{
					if(tv.GetDataLength()<=4){
						memcpy(p2+iFirst,(BYTE *)&tv.uv,iLen);
					}
				}
				break;
			case DATA_TYPE_FLOAT	:
				if(direct){
					tv.uv.dv=*((double*)(p2+iFirst));
				}
				else{
					if(iLen!=8)return;
					memcpy(p2+iFirst,(BYTE *)&tv.uv,iLen);
				}
				break;
			default:
				break;
			}
		}
		break;
	}
}

const int UniVar::operator =(const UniVar & ttv)
{
	ClearData();
	if(ttv.dwCheckL){
		Uninew(ttv.dwCheckL,ttv.it);
		if(uv.bv)memcpy(uv.bv,ttv.uv.bv,ttv.dwCheckL);
		btmust=ttv.btmust;
		inout=ttv.inout;
	}
	else {
		memcpy(this,&ttv,sizeof(UniVar));
	};
	return 1;
};

UniVar::UniVar(UniVar * ptv)
{
	if(ptv->dwCheckL){
		Uninew(ptv->dwCheckL,ptv->it);
		if(uv.bv)memcpy(uv.bv,ptv->uv.bv,ptv->dwCheckL);
		btmust=ptv->btmust;
		inout=ptv->inout;
	}
	else {
		memcpy(this,ptv,sizeof(UniVar));
	};
};

UniVar::UniVar(int i,UniVar & tv)
{
	if(i==tv.GetType()){
		if(tv.GetDataLength()){
			Uninew(tv.GetDataLength(),tv.it);
			if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
			btmust=tv.btmust;
			inout=tv.inout;
		}
		else {
			memcpy(this,&tv,sizeof(UniVar));
		};
	}
	else {
		dwCheckL=0;
		switch(i){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this=(char *)tv;break;
		case DATA_TYPE_HANDLE:*this=UniVar((void *)tv,tv.GetDataLength());break;
		}
	}
};

BOOL UniVar::ValidVar(UniVar * p){
	if(p->it>=DATA_TYPE_INT&&p->it<DATA_TYPE_MAX){
		if(p->it==DATA_TYPE_HANDLE||p->it==DATA_TYPE_STRING){
			if(p->uv.heap.handle==p->uv.heap.pBuffer)return TRUE;
			return FALSE;
		}
		else return TRUE;
	}
	else return FALSE;
}

UniVar::UniVar(UniVar & tv)
{
	if(tv.GetDataLength()){
		Uninew(tv.GetDataLength(),tv.it);
		if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
		btmust=tv.btmust;
		inout=tv.inout;
	}
	else {
		memcpy(this,&tv,sizeof(UniVar));
	};
};

UniVar::UniVar(UniVar &tv,int btm,int io)
{
	if(tv.GetDataLength()){
		Uninew(tv.GetDataLength(),tv.it);
		if(uv.bv)memcpy(uv.bv,tv.uv.bv,tv.GetDataLength());
		btmust=btm;
		inout=io;
	}
	else {
		memcpy(this,&tv,sizeof(UniVar));
		btmust=btm;
		inout=io;
	};
};

UniVar::UniVar(char * s)
{
	btmust=0;
	inout=0;
	if(s){
		int len=strlen(s)+1;
		Uninew(len,DATA_TYPE_STRING);
		if(uv.bv)memcpy(uv.bv,s,len);
	}
	else {
		Uninew(1,DATA_TYPE_STRING);
		uv.cv[0]='\0';
	}
}

UniVar::UniVar(LPCTSTR s)
{
	btmust=0;
	inout=0;
	if(s){
		int len=strlen(s)+1;
		Uninew(len,DATA_TYPE_STRING);
		if(uv.bv)memcpy(uv.bv,s,len);
	}
	else {
		Uninew(1,DATA_TYPE_STRING);
		if(uv.bv)uv.cv[0]='\0';
	}
};
	
UniVar::UniVar(CString & s)
{
	btmust=0;
	inout=0;
	if(!s.IsEmpty()){
		int len=s.GetLength()+1;
		Uninew(len,DATA_TYPE_STRING);
		if(uv.bv)memcpy(uv.bv,(LPCTSTR)s,len);
	}
	else {
		Uninew(1,DATA_TYPE_STRING);
		if(uv.bv)uv.cv[0]='\0';
	}
};

UniVar::UniVar(void * p,int i)
{
	int j=i&0x00ffffff;
	if(j){
		Uninew(j,DATA_TYPE_HANDLE);
		btmust=0;
		inout=0;
		if(p){
			if(uv.bv)memcpy(uv.bv,p,j);
		}
		else {
			if(uv.bv)memset(uv.bv,0,j);
		}
	}
	else {
		memset(this,0,sizeof(UniVar));
		it=DATA_TYPE_HANDLE;
	}
};

void UniVar::SetValue(void * p,int i)
{
	ClearData();
	int j=i&0x00ffffff;
	if(j){
		Uninew(j,DATA_TYPE_HANDLE);
		btmust=0;
		inout=0;
		if(p){
			if(uv.bv)memcpy(uv.bv,p,j);
		}
		else{
			if(uv.bv)memset(uv.bv,0,j);
		}
	}
	else {
		if(uv.bv)memset(this,0,sizeof(UniVar));
		it=DATA_TYPE_HANDLE;
	}
};

void UniVar::Convert(int oit)
{
	if(oit==it)return ;
	switch(oit){
	case DATA_TYPE_INT:
		if(it==DATA_TYPE_FLOAT)*this=((int)uv.dv);
		else if(it==DATA_TYPE_DWORD)*this=((int)uv.pv);
		else *this=(uv.iv);
		break;
	case DATA_TYPE_FLOAT:
		if(it==DATA_TYPE_INT)*this=((double)uv.iv);
		else if(it==DATA_TYPE_DWORD)*this=((double)uv.pv);
		else *this=(0.0f);
		break;
	case DATA_TYPE_DWORD:
		if(it==DATA_TYPE_INT)*this=((DWORD)uv.iv);
		else if(it==DATA_TYPE_FLOAT)*this=((DWORD)uv.dv);
		else *this=(uv.pv);
		break;
	case DATA_TYPE_STRING:
		if(it==DATA_TYPE_HANDLE)*this=((DWORD)uv.cv);
		else *this=("");
		break;
	case DATA_TYPE_HANDLE:
		if(it==DATA_TYPE_STRING)it=DATA_TYPE_HANDLE;
		else *this=UniVar((void *)NULL,0);
		break;
	default:
		*this=(0);
		break;
	}
}

void UniVar::SetData(UniVar & tv)
{
	if(it==DATA_TYPE_HANDLE){
		if(dwCheckL==tv.dwCheckL)memcpy(uv.cv,tv.uv.cv,dwCheckL);
		else memset(uv.cv,0,GetDataLength());
	}
	else if(it==tv.it)*this=tv;
	else {
		switch(it){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		}
	}
};

void UniVar::SetData(int i,UniVar & tv)
{
	if(i==tv.it)*this=tv;
	else {
		switch(i){
		case DATA_TYPE_INT:*this=(int)tv;break;
		case DATA_TYPE_FLOAT:*this=(double)tv;break;
		case DATA_TYPE_DWORD:*this=(DWORD)tv;break;
		case DATA_TYPE_STRING:*this="";break;
		case DATA_TYPE_HANDLE:*this=UniVar((void *)tv,tv.GetDataLength());break;
		default:*this=(0);break;
		}
	}
}

LPSTR UniVar::ToA(char * szCHString)
{
	if(szCHString==NULL){
		char szBuffer[200];
		switch(it){
		case DATA_TYPE_INT: sprintf(szBuffer,ITOSTRING_STRING,uv.iv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_FLOAT: sprintf(szBuffer,FTOSTRING_STRING,uv.dv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_DWORD: sprintf(szBuffer,XTOSTRING_STRING,uv.pv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_STRING: return uv.cv;
		case DATA_TYPE_HANDLE: 
			{
				for(int i=0;i<GetDataLength();i++){
					if(uv.cv[i]==0){
						CString cs=(char *)(uv.cv);
						*this=UniVar(cs);
						return uv.cv;
					}
				}
			}
		default : *this=("");return uv.cv;
		};
	}
	else {
		char szBuffer[200];
		switch(it){
		case DATA_TYPE_INT: sprintf(szBuffer,szCHString,uv.iv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_FLOAT: sprintf(szBuffer,szCHString,uv.dv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_DWORD: sprintf(szBuffer,szCHString,uv.pv);*this=szBuffer;return uv.cv;
		case DATA_TYPE_STRING: return uv.cv;
		case DATA_TYPE_HANDLE: 
		default : *this=("");return uv.cv;
		};
	}
};

BOOL UniVar::IsSame(UniVar & u)
{
	if(it!=u.it)return FALSE;
	switch(it){
	case DATA_TYPE_STRING: 
	case DATA_TYPE_HANDLE: 
		if(GetDataLength()!=u.GetDataLength())return FALSE;
		if(GetDataLength()==0)return TRUE;
		return (!memcmp((void *)uv.cv,(void *)u.uv.cv,GetDataLength()));
	case DATA_TYPE_FLOAT:
		return (uv.dv==u.uv.dv);
	case DATA_TYPE_INT: 
	case DATA_TYPE_DWORD:
	default:
		return (uv.iv==u.uv.iv);
	}
}

BOOL UniVar::IsSame(UniVar * pu)
{
	if(it!=pu->it)return FALSE;
	switch(it){
	case DATA_TYPE_STRING: 
	case DATA_TYPE_HANDLE: 
		if(GetDataLength()!=pu->GetDataLength())return FALSE;
		return (!memcmp((void *)uv.cv,(void *)pu->uv.cv,GetDataLength()));
	case DATA_TYPE_FLOAT:
		return (uv.dv==pu->uv.dv);
	case DATA_TYPE_INT: 
	case DATA_TYPE_DWORD:
	default:
		return (uv.iv==pu->uv.iv);
	}
}

⌨️ 快捷键说明

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