1//===- GroupReader.h ------------------------------------------------------===//
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#ifndef MCLD_GROUPREADER_H
10#define MCLD_GROUPREADER_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <mcld/Module.h>
16
17namespace mcld
18{
19class Archive;
20class ArchiveReader;
21class DynObjReader;
22class LinkerConfig;
23class ObjectReader;
24class BinaryReader;
25
26/** \class GroupReader
27 *  \brief GroupReader handles the Group Node in InputTree
28 *
29 *  Group Node is the root of sub-tree in InputTree which includes the iputs in
30 *  the command line options --start-group and --end-group options
31 */
32class GroupReader
33{
34public:
35  GroupReader(Module& pModule,
36              ObjectReader& pObjectReader,
37              DynObjReader& pDynObjReader,
38              ArchiveReader& pArchiveReader,
39              BinaryReader& pBinaryReader);
40
41  ~GroupReader();
42
43  /// readGroup - handle the input sub-tree wich its root is pRoot
44  /// @param pRoot - the root Group node of the sub-tree
45  bool readGroup(Module::input_iterator pRoot,
46                 InputBuilder& pBuilder,
47                 const LinkerConfig& pConfig);
48
49private:
50  /// ArchiveListEntry - record the Archive and the corresponding input iterator
51  /// of the archive node
52  struct ArchiveListEntry {
53    ArchiveListEntry(Archive& pArchive, Module::input_iterator pIterator)
54      : archive(pArchive), input(pIterator) {
55    }
56    Archive& archive;
57    Module::input_iterator input;
58  };
59
60private:
61  Module& m_Module;
62  ObjectReader& m_ObjectReader;
63  DynObjReader& m_DynObjReader;
64  ArchiveReader& m_ArchiveReader;
65  BinaryReader& m_BinaryReader;
66};
67
68} // namespace of mcld
69
70#endif
71
72