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/MC/InputTree.h> 10 #include <mcld/MC/InputFactory.h> 11 12 using namespace mcld; 13 14 InputTree::Succeeder InputTree::Afterward; 15 InputTree::Includer InputTree::Downward; 16 17 //===----------------------------------------------------------------------===// 18 // InputTree 19 InputTree::InputTree(InputFactory& pInputFactory) 20 : m_FileFactory(pInputFactory) { 21 } 22 23 InputTree::~InputTree() 24 { 25 } 26 27 InputTree& InputTree::merge(TreeIteratorBase pRoot, 28 const InputTree::Mover& pMover, 29 InputTree& pTree) 30 { 31 if (this == &pTree) 32 return *this; 33 34 if (!pTree.empty()) { 35 pMover.connect(pRoot, iterator(pTree.m_Root.node.right)); 36 BinaryTreeBase<Input>::m_Root.summon( 37 pTree.BinaryTreeBase<Input>::m_Root); 38 BinaryTreeBase<Input>::m_Root.delegate(pTree.m_Root); 39 pTree.m_Root.node.left = pTree.m_Root.node.right = &pTree.m_Root.node; 40 } 41 return *this; 42 } 43 44 InputTree& InputTree::insert(TreeIteratorBase pRoot, 45 const InputTree::Mover& pMover, 46 const std::string& pNamespec, 47 const sys::fs::Path& pPath, 48 unsigned int pType) 49 { 50 BinaryTree<Input>::node_type* node = createNode(); 51 node->data = m_FileFactory.produce(pNamespec, pPath, pType); 52 pMover.connect(pRoot, iterator(node)); 53 return *this; 54 } 55 56 InputTree& InputTree::enterGroup(TreeIteratorBase pRoot, 57 const InputTree::Mover& pMover) 58 { 59 NodeBase* node = createNode(); 60 pMover.connect(pRoot, iterator(node)); 61 return *this; 62 } 63 64 InputTree& InputTree::insert(TreeIteratorBase pRoot, 65 const InputTree::Mover& pMover, 66 const mcld::Input& pInput) 67 { 68 BinaryTree<Input>::node_type* node = createNode(); 69 node->data = const_cast<mcld::Input*>(&pInput); 70 pMover.connect(pRoot, iterator(node)); 71 return *this; 72 } 73 74 75 76 //===----------------------------------------------------------------------===// 77 // non-member functions 78 bool mcld::isGroup(const InputTree::iterator& pos) 79 { 80 return !pos.hasData(); 81 } 82 83 bool mcld::isGroup(const InputTree::const_iterator& pos) 84 { 85 return !pos.hasData(); 86 } 87 88 bool mcld::isGroup(const InputTree::dfs_iterator& pos) 89 { 90 return !pos.hasData(); 91 } 92 93 bool mcld::isGroup(const InputTree::const_dfs_iterator& pos) 94 { 95 return !pos.hasData(); 96 } 97 98 bool mcld::isGroup(const InputTree::bfs_iterator& pos) 99 { 100 return !pos.hasData(); 101 } 102 103 bool mcld::isGroup(const InputTree::const_bfs_iterator& pos) 104 { 105 return !pos.hasData(); 106 } 107 108