📄 formulamodula.cpp
字号:
// FormulaModula.cpp: implementation of the CFormulaImpl class.
//
//////////////////////////////////////////////////////////////////////
/*
* Generated by MyEclipse Struts
*
* Written by Yang Huaisheng
* Homepage: http://codefan.spaces.live.com
* version 0.01
* create at 2006-04-30
*
* Distribute freely, except: don't remove my name from the source or
* documentation (don't take credit for my work), mark your changes (don't
* get me blamed for your possible bugs), don't alter or remove this
* notice.
* No warrantee of any kind, express or implied, is included with this
* software; use at your own risk, responsibility for damages (if any) to
* anyone resulting from the use of this software rests entirely with the
* user.
*
* Send bug reports, bug fixes, enhancements, requests, flames, etc. to
* codefan@hotmial.com
*
*/
#include "stdafx.h"
#include "..\HEADER\FormulaImpl.h"
#include "..\..\Formule\Calc\RegularOpt.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CVarItem::CVarItem():
nAllocType(0){
nLen = 0;
fArVal = NULL;
nStyle = VIS_UNKNOW;
isUsed = FALSE;
vType = VDT_NUMBER;
}
CVarItem::~CVarItem()
{
// if(nAllocType==1 && sVal != NULL)
// delete [] sVal; else
if(nAllocType==2 && fArVal != NULL){
delete [] fArVal;
fArVal = NULL;
}
nAllocType=0;
}
CVarItem & CVarItem::Clone (CVarItem & tmpItem)
{
// vType = tmpItem.vType;//
// fVal = tmpItem.fVal;
// return *this;
if(nAllocType==2 && fArVal != NULL)
delete [] fArVal;
fArVal = NULL;
//isUsed = tmpItem.isUsed;
//nISN = tmpItem.nISN;
//nStyle = tmpItem.nStyle;// 0:unknow 1:varialbe 2:const variable 3:temp variable
nAllocType = tmpItem.nAllocType;// 0:nualloc 1:alloc char[] 2:alloc float[]
vType = tmpItem.vType;//
switch(vType){
case VDT_NUMBER :
fVal = tmpItem.fVal;
break;
case VDT_ARRAY_NUMBER :
{
nLen = tmpItem.nLen;
if(nAllocType==2 && tmpItem.fArVal != NULL){
fArVal = new float[nLen];
CopyMemory(fArVal,tmpItem.fArVal,sizeof(float)*nLen);
}else{
nAllocType=0;
fArVal = tmpItem.fArVal;
}
}
break;
//case VDT_STRING :
default:
szValue = tmpItem.szValue;
break;
}
return *this;
}
CVarItem & CVarItem::operator=(CVarItem & tmpItem)
{
if(nAllocType==2 && fArVal != NULL)
delete [] fArVal;
fArVal = NULL;
isUsed = tmpItem.isUsed;
nISN = tmpItem.nISN;
nStyle = tmpItem.nStyle;// 0:unknow 1:varialbe 2:const variable 3:temp variable
nAllocType = tmpItem.nAllocType;// 0:nualloc 1:alloc char[] 2:alloc float[]
vType = tmpItem.vType;//
strcpy(szName,tmpItem.szName); //char[32]
// szValue = tmpItem.szValue;
switch(vType){
case VDT_NUMBER :
fVal = tmpItem.fVal;
break;
case VDT_ARRAY_NUMBER :
{
nLen = tmpItem.nLen;
if(nAllocType==2 && tmpItem.fArVal != NULL){
fArVal = new float[nLen];
CopyMemory(fArVal,tmpItem.fArVal,sizeof(float)*nLen);
}else{
nAllocType=0;
fArVal = tmpItem.fArVal;
}
}
break;
//case VDT_STRING :
default:
szValue = tmpItem.szValue;
break;
}
return *this;
}
void CVarItem::SetName(LPCTSTR sn)
{
int nsl = (strlen(sn) > SIGNLENGTH) ? SIGNLENGTH : strlen(sn);
CopyMemory(szName,sn,nsl);
szName[nsl] = 0;
}
void CVarItem::SetType(VAR_DATA_TYPE vt)
{
if(vType==vt) return;
vType = vt;
if(nAllocType==2 && fArVal != NULL){
delete [] fArVal;
fArVal = NULL;
nAllocType = 0;
}
nLen = 0;
}
void CVarItem::SetValue(LPCTSTR sv)
{
szValue = sv;
if(CRegularOpt::IsNumber(sv)){
SetType(VDT_NUMBER);
fVal = float(atof(sv));
}else if(CRegularOpt::IsNumberArray(sv)){
SetType(VDT_ARRAY_NUMBER);
if(nAllocType==2 && fArVal != NULL)
delete [] fArVal;
fArVal = NULL;
CArray<float,float> arfData;
CRegularOpt::SplitFloatList(sv,arfData,',');
nLen = arfData.GetSize();
if(nLen>0){
nAllocType=2;
fArVal = new float[nLen];
for(int i=0;i<nLen;i++)
fArVal[i] = arfData[i];
}
}else{
SetType(VDT_STRING);
}
}
void CVarItem::SetString(LPCTSTR sv)
{
SetType(VDT_STRING);
szValue = sv;
}
void CVarItem::SetFloat(float fv)
{
//szValue.Format("%f",fv);
SetType(VDT_NUMBER);
fVal = fv;
}
void CVarItem::SetArrayNumber(int nl,float * lpv,bool bCopy)
{
vType = VDT_ARRAY_NUMBER;
if(nAllocType==2 && fArVal != NULL){
delete [] fArVal;
fArVal = NULL;
nAllocType = 0;
}
nLen = nl;
if(bCopy && nl>0){
nAllocType=2;
fArVal = new float[nl];
CopyMemory( fArVal,lpv,nl*sizeof(float));
}else
fArVal = lpv;
}
inline void CVarItem::SetUsed()
{
isUsed = TRUE;
}
CString CVarItem::GetName()
{
switch(nStyle){
case VIS_VARIABLE:
return CString(szName);
case VIS_CONST:
return GetValue();
case VIS_TEMP:{
CString sTmpName;
sTmpName.Format("TMP#%d", nISN-TEMPISN_START+1);
return sTmpName;
}
}
return CString(" ");
}
VAR_DATA_TYPE CVarItem::GetType()
{
return vType;
}
CString CVarItem::GetValue()
{
switch(vType){
case VDT_STRING:
return szValue;
case VDT_NUMBER :
szValue.Format("%f",fVal);
szValue = CRegularOpt::PrecisionNum(szValue);
return szValue;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return CString("");
CString sTmp ;
sTmp.Format("%f",fArVal[0]);
szValue = CRegularOpt::PrecisionNum(sTmp);
for(int i=1;i<nLen;i++){
sTmp.Format("%f",fArVal[i]);
szValue +="," + CRegularOpt::PrecisionNum(sTmp);
}
}
}
return szValue;
}
float CVarItem::GetFloat(float fPos)
{
switch(vType){
case VDT_NUMBER :
return fVal;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return 0.f;
if(nLen==1) return fArVal[0];
if(fPos<0)
return fArVal[0] + fPos*(fArVal[1]-fArVal[0]);
if(fPos < nLen-1)
return fArVal[int(fPos)]
+ (fArVal[int(fPos)+1] - fArVal[int(fPos)]) * (fPos-int(fPos));
return fArVal[nLen-1] + (fArVal[nLen-1]-fArVal[nLen-2]) * (fPos-nLen+1);
}
break;
};
return 0.f;
}
BOOL CVarItem::ToBool()
{
if(szValue.CompareNoCase("true")==0)
return TRUE;
return (GetFloat(0) < -0.01) || (GetFloat(0) > 0.01);
}
float CVarItem::ToFloat()
{
return GetFloat(0);
}
int CVarItem::ToInt()
{
return int(GetFloat()+0.5);
}
float CVarItem::MinFloat()
{
switch(vType){
case VDT_NUMBER :
return fVal;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return 0.f;
float minFV = fArVal[0];
for(int i=1;i<nLen;i++)
if(minFV > fArVal[i])
minFV = fArVal[i];
return minFV;
}
};
return 0.f;
}
float CVarItem::MaxFloat()
{
switch(vType){
case VDT_NUMBER :
return fVal;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return 0.f;
float maxFV = fArVal[0];
for(int i=1;i<nLen;i++)
if(maxFV < fArVal[i])
maxFV = fArVal[i];
return maxFV;
}
};
return 0.f;
}
float CVarItem::SumFloat()
{
switch(vType){
case VDT_NUMBER :
return fVal;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return 0.f;
float sumFV = fArVal[0];
for(int i=1;i<nLen;i++)
sumFV += fArVal[i];
return sumFV;
}
};
return 0.f;
}
float CVarItem::AveFloat()
{
switch(vType){
case VDT_NUMBER :
return fVal;
case VDT_ARRAY_NUMBER :
{
if(nLen==0) return 0.f;
float sumFV = fArVal[0];
for(int i=1;i<nLen;i++)
sumFV += fArVal[i];
return sumFV / nLen;
}
};
return 0.f;
}
int CVarItem::GetCount()
{
if(vType == VDT_ARRAY_NUMBER)
return nLen;
return 1;
}
CString CVarItem::ToString()
{
return GetValue();
}
CString CVarItem::GetDescribe(LIST_VAR_TYPE nListType)
{
CString sDesc;
switch(nStyle){
case VIS_VARIABLE:
sDesc = "VAR ";
sDesc += szName;
break;
case VIS_CONST:
sDesc = "CONST ";
break;
case VIS_TEMP:
sDesc.Format("TMP#%d ", nISN-TEMPISN_START+1);
break;
}
return sDesc + ":" + GetValue();
}
CVarItem AFXAPI operator+( CVarItem & tmpItem, CVarItem & tmpItem2)
{
// CString
CVarItem retVar;
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
retVar.SetFloat(tmpItem.ToFloat() + tmpItem2.ToFloat());
else
retVar.SetString( tmpItem.ToString() + tmpItem2.ToString());
return retVar;
}
CVarItem AFXAPI operator-(CVarItem & tmpItem,CVarItem & tmpItem2)
{
CVarItem retVar;
retVar.SetFloat(tmpItem.ToFloat() - tmpItem2.ToFloat());
return retVar;
}
CVarItem AFXAPI operator*(CVarItem & tmpItem,CVarItem & tmpItem2)
{
CVarItem retVar;
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
retVar.SetFloat(tmpItem.ToFloat() * tmpItem2.ToFloat());
else
retVar.SetString( tmpItem.ToString() + tmpItem2.ToString());
return retVar;
}
CVarItem AFXAPI operator/(CVarItem & tmpItem,CVarItem & tmpItem2)
{
CVarItem retVar;
if(tmpItem2.ToFloat()==0.f)
retVar.SetFloat(0);
else
retVar.SetFloat(tmpItem.ToFloat() / tmpItem2.ToFloat());
return retVar;
}
BOOL AFXAPI operator==(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() == tmpItem2.ToFloat();
return tmpItem.ToString() == tmpItem2.ToString();
}
BOOL AFXAPI operator!=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() != tmpItem2.ToFloat();
return tmpItem.ToString() != tmpItem2.ToString();
}
BOOL AFXAPI operator>(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() > tmpItem2.ToFloat();
return tmpItem.ToString() > tmpItem2.ToString();
}
BOOL AFXAPI operator<(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() < tmpItem2.ToFloat();
return tmpItem.ToString() < tmpItem2.ToString();
}
BOOL AFXAPI operator>=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() >= tmpItem2.ToFloat();
return tmpItem.ToString() >= tmpItem2.ToString();
}
BOOL AFXAPI operator<=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
)
return tmpItem.ToFloat() <= tmpItem2.ToFloat();
return tmpItem.ToString() <= tmpItem2.ToString();
}
BOOL AFXAPI operator!(CVarItem & tmpItem)
{
return ! tmpItem.ToBool();
}
BOOL AFXAPI operator||(CVarItem & tmpItem,CVarItem & tmpItem2)
{
return tmpItem.ToBool() || tmpItem2.ToBool() ;
}
BOOL AFXAPI operator&&(CVarItem & tmpItem,CVarItem & tmpItem2)
{
return tmpItem.ToBool() && tmpItem2.ToBool() ;
}
//-----------------------------------------------------------------------------------
CFormulaModule::CFormulaModule()
{
nFormulaSum = 0;
nCurVarISN =VARISN_START;
nCurTempISN =TEMPISN_START;
nCurConstISN=CONSTISN_START;
vRetType = VDT_VOID;
nPrmSum = 0;
nSourceLen=0;
szSource=NULL;
pParentModule = NULL;
}
CFormulaModule::~CFormulaModule()
{
Release();
}
void CFormulaModule::Reset()
{
nCurVarISN =VARISN_START;
nCurTempISN =TEMPISN_START;
nCurConstISN=CONSTISN_START;
vRetType = VDT_VOID;
varTable.RemoveAll();
nFormulaSum = 0;
nPrmSum = 0;
}
void CFormulaModule::Release()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -