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
11using namespace mcld;
12
13InputTree::Succeeder InputTree::Afterward;
14InputTree::Includer  InputTree::Downward;
15
16//===----------------------------------------------------------------------===//
17// InputTree
18//===----------------------------------------------------------------------===//
19InputTree& 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, 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
36InputTree& InputTree::enterGroup(TreeIteratorBase pRoot,
37                                 const InputTree::Mover& pMover)
38{
39  NodeBase* node = createNode();
40  pMover.connect(pRoot, node);
41  return *this;
42}
43
44InputTree& 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, node);
51  return *this;
52}
53
54//===----------------------------------------------------------------------===//
55// non-member functions
56//===----------------------------------------------------------------------===//
57bool mcld::isGroup(const InputTree::iterator& pos)
58{
59  return !pos.hasData() && !pos.isRoot();
60}
61
62bool mcld::isGroup(const InputTree::const_iterator& pos)
63{
64  return !pos.hasData() && !pos.isRoot();
65}
66
67bool mcld::isGroup(const InputTree::dfs_iterator& pos)
68{
69  return !pos.hasData() && !pos.isRoot();
70}
71
72bool mcld::isGroup(const InputTree::const_dfs_iterator& pos)
73{
74  return !pos.hasData() && !pos.isRoot();
75}
76
77bool mcld::isGroup(const InputTree::bfs_iterator& pos)
78{
79  return !pos.hasData() && !pos.isRoot();
80}
81
82bool mcld::isGroup(const InputTree::const_bfs_iterator& pos)
83{
84  return !pos.hasData() && !pos.isRoot();
85}
86
87