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 12using namespace mcld; 13 14InputTree::Succeeder InputTree::Afterward; 15InputTree::Includer InputTree::Downward; 16 17//===----------------------------------------------------------------------===// 18// InputTree 19InputTree::InputTree(InputFactory& pInputFactory) 20 : m_FileFactory(pInputFactory) { 21} 22 23InputTree::~InputTree() 24{ 25} 26 27InputTree& 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 44InputTree& 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 56InputTree& 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 64InputTree& 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 78bool mcld::isGroup(const InputTree::iterator& pos) 79{ 80 return !pos.hasData(); 81} 82 83bool mcld::isGroup(const InputTree::const_iterator& pos) 84{ 85 return !pos.hasData(); 86} 87 88bool mcld::isGroup(const InputTree::dfs_iterator& pos) 89{ 90 return !pos.hasData(); 91} 92 93bool mcld::isGroup(const InputTree::const_dfs_iterator& pos) 94{ 95 return !pos.hasData(); 96} 97 98bool mcld::isGroup(const InputTree::bfs_iterator& pos) 99{ 100 return !pos.hasData(); 101} 102 103bool mcld::isGroup(const InputTree::const_bfs_iterator& pos) 104{ 105 return !pos.hasData(); 106} 107 108