Home | History | Annotate | Download | only in Core
      1 //===- InputTree.cpp ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #include <mcld/InputTree.h>
     10 
     11 using namespace mcld;
     12 
     13 InputTree::Succeeder InputTree::Afterward;
     14 InputTree::Includer  InputTree::Downward;
     15 
     16 //===----------------------------------------------------------------------===//
     17 // InputTree
     18 //===----------------------------------------------------------------------===//
     19 InputTree& InputTree::merge(TreeIteratorBase pRoot,
     20                             const InputTree::Mover& pMover,
     21                             InputTree& pTree)
     22 {
     23   if (this == &pTree)
     24     return *this;
     25 
     26   if (!pTree.empty()) {
     27     pMover.connect(pRoot, iterator(pTree.m_Root.node.right));
     28     BinaryTreeBase<Input>::m_Root.summon(
     29         pTree.BinaryTreeBase<Input>::m_Root);
     30     BinaryTreeBase<Input>::m_Root.delegate(pTree.m_Root);
     31     pTree.m_Root.node.left = pTree.m_Root.node.right = &pTree.m_Root.node;
     32   }
     33   return *this;
     34 }
     35 
     36 InputTree& InputTree::enterGroup(TreeIteratorBase pRoot,
     37                                  const InputTree::Mover& pMover)
     38 {
     39   NodeBase* node = createNode();
     40   pMover.connect(pRoot, iterator(node));
     41   return *this;
     42 }
     43 
     44 InputTree& InputTree::insert(TreeIteratorBase pRoot,
     45                              const InputTree::Mover& pMover,
     46                              mcld::Input& pInput)
     47 {
     48   BinaryTree<Input>::node_type* node = createNode();
     49   node->data = &pInput;
     50   pMover.connect(pRoot, iterator(node));
     51   return *this;
     52 }
     53 
     54 //===----------------------------------------------------------------------===//
     55 // non-member functions
     56 //===----------------------------------------------------------------------===//
     57 bool mcld::isGroup(const InputTree::iterator& pos)
     58 {
     59   return !pos.hasData() && !pos.isRoot();
     60 }
     61 
     62 bool mcld::isGroup(const InputTree::const_iterator& pos)
     63 {
     64   return !pos.hasData() && !pos.isRoot();
     65 }
     66 
     67 bool mcld::isGroup(const InputTree::dfs_iterator& pos)
     68 {
     69   return !pos.hasData() && !pos.isRoot();
     70 }
     71 
     72 bool mcld::isGroup(const InputTree::const_dfs_iterator& pos)
     73 {
     74   return !pos.hasData() && !pos.isRoot();
     75 }
     76 
     77 bool mcld::isGroup(const InputTree::bfs_iterator& pos)
     78 {
     79   return !pos.hasData() && !pos.isRoot();
     80 }
     81 
     82 bool mcld::isGroup(const InputTree::const_bfs_iterator& pos)
     83 {
     84   return !pos.hasData() && !pos.isRoot();
     85 }
     86 
     87