2025-04-27 07:49:33 -04:00

220 lines
4.1 KiB
C++

// 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();
}
}