📄 ncbi_tree.hpp
字号:
}///////////////////////////////////////////////////////////////////////////////// CTreeNode<TValue>//template<class TValue>CTreeNode<TValue>::CTreeNode(const TValue& value): m_Parent(0), m_Value(value){}template<class TValue>CTreeNode<TValue>::~CTreeNode(){ _ASSERT(m_Parent == 0); ITERATE(typename TNodeList, it, m_Nodes) { CTreeNode* node = *it; node->m_Parent = 0; delete node; }}template<class TValue>CTreeNode<TValue>::CTreeNode(const TTreeType& tree): m_Parent(0), m_Value(tree.m_Value){ CopyFrom(tree);}template<class TValue>CTreeNode<TValue>& CTreeNode<TValue>::operator=(const TTreeType& tree){ NON_CONST_ITERATE(typename TNodeList, it, m_Nodes) { CTreeNode* node = *it; delete node; } m_Nodes.clear(); CopyFrom(tree); return *this;}template<class TValue>void CTreeNode<TValue>::CopyFrom(const TTreeType& tree){ ITERATE(typename TNodeList, it, tree.m_Nodes) { const CTreeNode* src_node = *it; CTreeNode* new_node = new CTreeNode(*src_node); AddNode(new_node); }}template<class TValue>void CTreeNode<TValue>::RemoveNode(TTreeType* subnode){ NON_CONST_ITERATE(typename TNodeList, it, m_Nodes) { CTreeNode* node = *it; if (node == subnode) { m_Nodes.erase(it); node->m_Parent = 0; delete node; break; } } }template<class TValue>void CTreeNode<TValue>::RemoveNode(TNodeList_I it){ CTreeNode* node = *it; node->m_Parent = 0; m_Nodes.erase(it); delete node;}template<class TValue>typename CTreeNode<TValue>::TTreeType* CTreeNode<TValue>::DetachNode(typename CTreeNode<TValue>::TTreeType* subnode){ NON_CONST_ITERATE(typename TNodeList, it, m_Nodes) { CTreeNode* node = *it; if (node == subnode) { m_Nodes.erase(it); node->SetParent(0); return node; } } return 0;}template<class TValue>typename CTreeNode<TValue>::TTreeType* CTreeNode<TValue>::DetachNode(typename CTreeNode<TValue>::TNodeList_I it){ CTreeNode* node = *it; m_Nodes.erase(it); node->SetParent(0); return node;}template<class TValue>void CTreeNode<TValue>::AddNode(typename CTreeNode<TValue>::TTreeType* subnode){ _ASSERT(subnode != this); m_Nodes.push_back(subnode); subnode->SetParent(this);}template<class TValue>CTreeNode<TValue>* CTreeNode<TValue>::AddNode(const TValue& val){ TTreeType* subnode = new TTreeType(val); AddNode(subnode); return subnode;}template<class TValue>void CTreeNode<TValue>::MoveSubnodes(TTreeType* src_tree_node){ _ASSERT(!IsParent(*src_tree_node)); TNodeList& src_nodes = src_tree_node->m_Nodes; ITERATE(typename TNodeList, it, src_nodes) { AddNode(*it); } src_nodes.clear();}template<class TValue>void CTreeNode<TValue>::InsertNode(TNodeList_I it, TTreeType* subnode){ m_Nodes.insert(it, subnode); subnode->SetParent(this);}template<class TValue>void CTreeNode<TValue>::RemoveAllSubNodes(EDeletePolicy del){ if (del == eDelete) { NON_CONST_ITERATE(typename TNodeList, it, m_Nodes) { CTreeNode* node = *it; delete node; } } m_Nodes.clear();}template<class TValue>const typename CTreeNode<TValue>::TTreeType* CTreeNode<TValue>::GetRoot() const{ const TTreeType* node_ptr = this; while (true) { const TTreeType* parent = node_ptr->GetParent(); if (parent) node_ptr = parent; else break; } return node_ptr;}template<class TValue>typename CTreeNode<TValue>::TTreeType* CTreeNode<TValue>::GetRoot(){ TTreeType* node_ptr = this; while (true) { TTreeType* parent = node_ptr->GetParent(); if (parent) node_ptr = parent; else break; } return node_ptr;}template<class TValue>bool CTreeNode<TValue>::IsParent(const TTreeType& tree_node) const{ _ASSERT(this != &tree_node); const TTreeType* node_ptr = GetParent(); while (node_ptr) { if (node_ptr == &tree_node) return true; node_ptr = node_ptr->GetParent(); } return false;}///////////////////////////////////////////////////////////////////////////////// CTreePairNode<TId, TValue>//template<class TId, class TValue>CTreePairNode<TId, TValue>::CTreePairNode(const TId& id, const TValue& value) : TParent(TTreePair(id, value)){}template<class TId, class TValue>CTreePairNode<TId, TValue>::CTreePairNode(const CTreePairNode<TId, TValue>& tr): TParent(tr){}template<class TId, class TValue>CTreePairNode<TId, TValue>& CTreePairNode<TId, TValue>::operator=(const CTreePairNode<TId, TValue>& tr){ TParent::operator=(tr);}template<class TId, class TValue>CTreePairNode<TId, TValue>*CTreePairNode<TId, TValue>::AddNode(const TId& id, const TValue& value){ return (CTreePairNode<TId, TValue>*)TParent::AddNode(TTreePair(id, value));}template<class TId, class TValue>void CTreePairNode<TId, TValue>::FindNodes(const list<TId>& node_path, TPairTreeNodeList* res){ typename TParent::TTreeType* tr = this; ITERATE(typename list<TId>, sit, node_path) { const TId& search_id = *sit; bool sub_level_found = false; typename TParent::TNodeList_I it = tr->SubNodeBegin(); typename TParent::TNodeList_I it_end = tr->SubNodeEnd(); for (; it != it_end; ++it) { TParent* node = *it; const TTreePair& node_pair = node->GetValue(); if (node_pair.id == search_id) { tr = node; sub_level_found = true; break; } } // for it if (!sub_level_found) { return; } sub_level_found = false; } // ITERATE res.push_back(tr);}template<class TId, class TValue>void CTreePairNode<TId, TValue>::FindNodes(const list<TId>& node_path, TConstPairTreeNodeList* res) const{ const typename TParent::TTreeType* tr = this; ITERATE(typename list<TId>, sit, node_path) { const TId& search_id = *sit; bool sub_level_found = false; typename TParent::TNodeList_CI it = tr->SubNodeBegin(); typename TParent::TNodeList_CI it_end = tr->SubNodeEnd(); for (; it != it_end; ++it) { const TParent* node = *it; const TTreePair& node_pair = node->GetValue(); if (node_pair.id == search_id) { tr = node; sub_level_found = true; break; } } // for it if (!sub_level_found) { return; } sub_level_found = false; } // ITERATE res->push_back((TPairTreeType*)tr);}/* @} */END_NCBI_SCOPE/* * =========================================================================== * $Log: ncbi_tree.hpp,v $ * Revision 1000.4 2004/06/01 19:07:49 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33 * * Revision 1.33 2004/04/26 14:47:51 ucko * Qualify dependent names with "this->" as needed (by GCC 3.4). * * Revision 1.32 2004/04/19 16:00:14 kuznets * Algorithms migrated to <algo/tree> * * Revision 1.31 2004/04/12 15:17:46 vasilche * Added missing typename keyword. * * Revision 1.30 2004/04/12 13:28:25 kuznets * + MoveSubnodes * * Revision 1.29 2004/04/09 15:27:30 gorelenk * Added missed 'typename' (s) . * * Revision 1.28 2004/04/09 14:25:56 kuznets * + TreeReRoot, improved internal data integrity diagnostics * * Revision 1.27 2004/04/08 18:34:19 kuznets * attached code to a doxygen group * +TreePrinting template (for debug purposes) * * Revision 1.26 2004/04/08 12:22:56 kuznets * Fixed compilation warnings * * Revision 1.25 2004/04/08 11:47:46 kuznets * + TreeFindCommonParent, + TreeTraceToRoot * * Revision 1.24 2004/04/06 15:53:16 kuznets * Minor correction in the comments * * Revision 1.23 2004/03/10 15:59:33 kuznets * TreeDepthFirstTraverse fixed bug in tree iteration logic * (corner case for empty tree) * * Revision 1.22 2004/02/17 19:07:27 kuznets * GCC warning fix * * Revision 1.21 2004/01/29 20:03:17 jcherry * Added default value for AddNode(const TValue& val) * * Revision 1.20 2004/01/15 20:05:53 yazhuk * Added return falue to operator= * * Revision 1.19 2004/01/14 17:38:05 kuznets * TreeDepthFirstTraverse improved to support more traversal options * (ETreeTraverseCode) * * Revision 1.18 2004/01/14 17:02:32 kuznets * + PairTreeBackTraceNode * * Revision 1.17 2004/01/14 16:24:17 kuznets * + CTreeNode::RemoveAllSubNodes * * Revision 1.16 2004/01/14 15:25:38 kuznets * Fixed bug in PairTreeTraceNode algorithm * * Revision 1.15 2004/01/14 14:18:21 kuznets * +TreeDepthFirstTraverse algorithm * * Revision 1.14 2004/01/12 22:04:03 ucko * Fix typo caught by MIPSpro. * * Revision 1.13 2004/01/12 21:03:42 ucko * Fix use of typename in PairTreeTraceNode<>, silently added in last revision. * * Revision 1.12 2004/01/12 20:09:22 kuznets * Renamed CTreeNWay to CTreeNode * * Revision 1.11 2004/01/12 18:01:15 jcherry * Added IsLeaf method * * Revision 1.10 2004/01/12 16:49:48 kuznets * CTreePairNode added id, value accessor functions * * Revision 1.9 2004/01/12 15:26:22 kuznets * Fixed various compilation warnings (GCC & WorkShop) * * Revision 1.8 2004/01/12 15:01:58 kuznets * +CTreePairNode::FindNodes * * Revision 1.7 2004/01/09 19:01:39 kuznets * Fixed compilation for GCC * * Revision 1.6 2004/01/09 17:15:11 kuznets * Cosmetic cleanup * * Revision 1.5 2004/01/09 13:27:39 kuznets * Cosmetic fixes. nodelist_iterator renamed to match the NCBI coding policy. * * Revision 1.4 2004/01/07 21:38:29 jcherry * Added method for adding child node given a value * * Revision 1.3 2004/01/07 21:10:58 jcherry * Compile fixes * * Revision 1.2 2004/01/07 17:21:53 kuznets * + template implementation * * Revision 1.1 2004/01/07 13:17:10 kuznets * Initial revision * * * ========================================================================== */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -