//	te-Branch.cpp:	implementation of the CTE_Branch class

#include <stdafx.h>
#include <te-Branch.h>

#define new DEBUG_NEW

//////////////////////////////////////////////////////////////////////////////

//	No children
CTE_Branch::CTE_Branch()		
{
}

//	N children
CTE_Branch::CTE_Branch(int num, CTE_Effect** ppChild)
{ 
	for (int i = 0; i < num; i++)
		m_pChildren.push_back(ppChild[i]);
}
	
//	1 child
CTE_Branch::CTE_Branch(CTE_Effect* pChild)
{
	m_pChildren.push_back(pChild);
}

//	2 children	
CTE_Branch::CTE_Branch(CTE_Effect* pChild0, CTE_Effect* pChild1)
{
	m_pChildren.push_back(pChild0);	
	m_pChildren.push_back(pChild1);	
}

//	3 children
CTE_Branch::CTE_Branch
(
	CTE_Effect* pChild0, 
	CTE_Effect* pChild1, 
	CTE_Effect* pChild2
)
{
	m_pChildren.push_back(pChild0);	
	m_pChildren.push_back(pChild1);	
	m_pChildren.push_back(pChild2);	
}

//	4 children
CTE_Branch::CTE_Branch
(
	CTE_Effect* pChild0, 
	CTE_Effect* pChild1, 
	CTE_Effect* pChild2, 
	CTE_Effect* pChild3
)
{
	m_pChildren.push_back(pChild0);	
	m_pChildren.push_back(pChild1);	
	m_pChildren.push_back(pChild2);	
	m_pChildren.push_back(pChild3);
}

CTE_Branch::~CTE_Branch()		
{ 
	DeleteChildren(); 
}

//////////////////////////////////////////////////////////////////////////////
//	Data member access

//	Set first child
void		
CTE_Branch::SetChild(CTE_Effect* pChild) 
{	
	if (m_pChildren.size() <= 0)
	{
		//	Add new child pointer
		m_pChildren.push_back(pChild);
	}
	else
	{
		//	Replace existing child pointer
		m_pChildren[0] = pChild; 
	}
}

//	Convenient way to set 2 children
void		
CTE_Branch::SetChildren(CTE_Effect* pChild0, CTE_Effect* pChild1) 
{	
	int num_children = 2; 
	for (int n = 0; n < num_children; n++)
	{
		CTE_Effect* pChild;
		switch(n)
		{
		case 0:		pChild = pChild0;	break;
		case 1:		pChild = pChild1;	break;
		default:	break;
		}
		
		if (m_pChildren.size() <= n)
		{	
			//	Add new child pointer
			m_pChildren.push_back(pChild);
		}
		else
		{
			//	Replace existing child pointer
			m_pChildren[n] = pChild; 
		}
	}
}

//	Convenient way to set 3 children
void		
CTE_Branch::SetChildren
(
	CTE_Effect* pChild0, 
	CTE_Effect* pChild1, 
	CTE_Effect* pChild2
) 
{	
	int num_children = 3; 
	for (int n = 0; n < num_children; n++)
	{
		CTE_Effect* pChild;
		switch(n)
		{
		case 0:		pChild = pChild0;	break;
		case 1:		pChild = pChild1;	break;
		case 2:		pChild = pChild2;	break;
		default:	break;
		}
		
		if (m_pChildren.size() <= n)
		{	
			//	Add new child pointer
			m_pChildren.push_back(pChild);
		}
		else
		{
			//	Replace existing child pointer
			m_pChildren[n] = pChild; 
		}
	}
}

//	Convenient way to set 4 children
void		
CTE_Branch::SetChildren
(
	CTE_Effect* pChild0, 
	CTE_Effect* pChild1, 
	CTE_Effect* pChild2, 
	CTE_Effect* pChild3
) 
{	
	int num_children = 4; 
	for (int n = 0; n < num_children; n++)
	{
		CTE_Effect* pChild;
		switch(n)
		{
		case 0:		pChild = pChild0;	break;
		case 1:		pChild = pChild1;	break;
		case 2:		pChild = pChild2;	break;
		case 3:		pChild = pChild3;	break;
		default:	break;
		}
		
		if (m_pChildren.size() <= n)
		{	
			//	Add new child pointer
			m_pChildren.push_back(pChild);
		}
		else
		{
			//	Replace existing child pointer
			m_pChildren[n] = pChild; 
		}
	}
}

void		
CTE_Branch::ReplaceChild(int i, CTE_Effect* pChild) 
{	
	ASSERT(i >= 0 && i < m_pChildren.size()); 
	delete m_pChildren[i];	//??
	m_pChildren[i] = pChild; 
}

//////////////////////////////////////////////////////////////////////////////
//	Operations

void		
CTE_Branch::DeleteChildren(void)
{
	//	Delete heap objects
	for (int i = 0; i < m_pChildren.size(); i++)
		delete m_pChildren[i];

	//	Delete collection of pointers
	m_pChildren.empty();
}

void	
CTE_Branch::Dump(void) const
{
	CTE_Primitive::Dump();

	TRACE("\nCTE_Branch: has %d children %d.", m_pChildren.size());
	for (int i = 0; i < m_pChildren.size(); i++)
	{
		TRACE("\n  child %d is %p.", i, m_pChildren[i]);
		if (m_pChildren[i] != NULL)
		m_pChildren[i]->Dump();
	}
}