#ifdef _DEBUG #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // CTreeNode implementation ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// template CTreeNode::CTreeNode() { } template CTreeNode::~CTreeNode() { Destroy(); if( GetObject() ) { delete GetObject(); } } ////////////////////////////////////////////////////////////////////// // Destroy ////////////////////////////////////////////////////////////////////// template inline void CTreeNode::Destroy() { for( int i = GetChildCount()-1; i >= 0; i-- ) { RemoveChild(i); } } ////////////////////////////////////////////////////////////////////// // Children Members ////////////////////////////////////////////////////////////////////// template inline int CTreeNode::GetChildCount() { return (int)m_Children.GetSize(); } template inline CTreeNode* CTreeNode::GetChild(int iIndex) { if( iIndex > m_Children.GetUpperBound() ) { return NULL; } if( iIndex < 0 ) { return NULL; } return m_Children[iIndex]; } template inline int CTreeNode::AddChild(CTreeNode* pNode) { return (int)m_Children.Add(pNode); } template inline void CTreeNode::RemoveChild(CTreeNode* pNode) { for( int i = 0; i < GetChildCount(); i++ ) { CTreeNode* pChildNode = GetChild(i); if( pNode == pChildNode ) { RemoveChild(i); return; } } } template inline void CTreeNode::RemoveChild(int iIndex) { CTreeNode* pChildNode = GetChild(iIndex); if( pChildNode ) { delete pChildNode; m_Children.RemoveAt(iIndex); } } ////////////////////////////////////////////////////////////////////// // Association Members ////////////////////////////////////////////////////////////////////// template inline int CTreeNode::GetAssocCount() { return (int)m_Associations.GetSize(); } template inline CTreeNode* CTreeNode::GetAssoc(int iIndex) { if( iIndex > m_Associations.GetUpperBound() ) { return NULL; } if( iIndex < 0 ) { return NULL; } return m_Associations[iIndex]; } template inline int CTreeNode::AddAssoc(CTreeNode* pNode) { // disallow multiple associations for the same node for( int i = 0; i < GetAssocCount(); i++ ) { if( pNode == GetAssoc(i) ) { return i; } } return (int)m_Associations.Add(pNode); } template inline void CTreeNode::RemoveAssoc(CTreeNode* pNode) { for( int i = 0; i < GetAssocCount(); i++ ) { CTreeNode* pAssocNode = GetAssoc(i); if( pNode == pAssocNode ) { RemoveAssoc(i); return; } } } template inline void CTreeNode::RemoveAssoc(int iIndex) { CTreeNode* pAssocNode = GetAssoc(iIndex); if( pAssocNode ) { m_Associations.RemoveAt(iIndex); } } ////////////////////////////////////////////////////////////////////// // CTree implementation ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// template CTree::CTree() { m_pRootNode = NULL; } template CTree::~CTree() { if( m_pRootNode ) { delete m_pRootNode; m_pRootNode = NULL; } }