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