www.pudn.com > MathHead > MathNode.cpp


#include "StdAfx.h" 
#include "mathnode.h" 
 
CMathNode::CMathNode(void) 
{ 
	m_Type = Node_Null; 
	__RawData[0] = 0; 
	__RawData[1] = 0; 
	__RawData[2] = 0; 
} 
 
CMathNode::~CMathNode(void) 
{ 
	Null(); 
} 
 
// Makes the CMathNode null 
void CMathNode::Null(void) 
{ 
	if (m_Type == Node_Op) 
	{ 
		for(unsigned int i = 0; i < m_nSubs; i++) 
			m_pSubArray[i].Null(); 
		delete [] m_pSubArray; 
	} 
	m_Type = Node_Null; 
	__RawData[0] = 0; 
	__RawData[1] = 0; 
	__RawData[2] = 0; 
} 
 
// Moves contents of a CMathNode to another, making the source null 
void CMathNode::MoveTo(CMathNode * pDest) 
{ 
	pDest->Null(); 
	pDest->m_Type = m_Type; 
	pDest->__RawData[0] = __RawData[0]; 
	pDest->__RawData[1] = __RawData[1]; 
	pDest->__RawData[2] = __RawData[2]; 
 
	m_Type = Node_Null; 
	__RawData[0] = 0; 
	__RawData[1] = 0; 
	__RawData[2] = 0; 
} 
 
 
void CMathNode::CopyTo(CMathNode * pDest) 
{ 
	pDest->Null(); 
	pDest->m_Type = m_Type; 
	if (m_Type == Node_Op) 
	{ 
		pDest->m_Op			= m_Op; 
		pDest->m_nSubs		= m_nSubs; 
		pDest->m_pSubArray	= new CMathNode[m_nSubs]; 
		for (unsigned int i = 0; i < m_nSubs; i++) 
			m_pSubArray[i].CopyTo(&pDest->m_pSubArray[i]); 
	} 
	else 
	{ 
		pDest->__RawData[0] = __RawData[0]; 
		pDest->__RawData[1] = __RawData[1]; 
		pDest->__RawData[2] = __RawData[2]; 
	} 
} 
 
// Turns a CMathNode into "Node_Exact' 
bool CMathNode::MakeExact(__int64 val) 
{ 
	Null(); 
	m_Type = Node_Exact; 
	m_Exact = val; 
    return false; 
} 
 
// Turns a CMathNode into "Node_Approx' 
bool CMathNode::MakeApprox(double val) 
{ 
	Null(); 
	m_Type = Node_Approx; 
	m_Approx = val; 
    return false; 
} 
 
// Turns a CMathNode into "Node_Var' 
bool CMathNode::MakeVar(wchar_t var) 
{ 
	Null(); 
	m_Type = Node_Var; 
	m_Var = var; 
    return false; 
} 
 
 
bool CMathNode::MakeOp(OpType type) 
{ 
	Null(); 
	m_Type = Node_Op; 
	m_Op = type; 
	if		(m_Op == Op_Null) 
		m_nSubs = 0; 
	else if	(m_Op == Op_Add) 
		m_nSubs = 2; 
	else if (m_Op == Op_Sub) 
		m_nSubs = 2; 
	else if (m_Op == Op_Mul) 
		m_nSubs = 2;	 
	else if (m_Op == Op_Div) 
		m_nSubs = 2;	 
	else if (m_Op == Op_Exp) 
		m_nSubs = 2; 
	else if (m_Op == Op_ParOpen) 
		m_nSubs = 0; 
	else if (m_Op == Op_ParClose) 
		m_nSubs = 0; 
	else 
		return true; 
	 
	return ((m_pSubArray = new CMathNode[m_nSubs]) == 0); 
}