//===- SectionMerger.h ----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SECTION_MERGER_H
#define MCLD_SECTION_MERGER_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

#include <vector>
#include <string>
#include <llvm/MC/MCAssembler.h>
#include <mcld/LD/LDSection.h>
#include <mcld/LD/LDContext.h>
#include <mcld/LD/SectionMap.h>

namespace mcld
{
class MCLinker;

/** \class SectionMerger
 *  \brief maintain the mappings of substr of input section name to associated
 *         output section (data)
 */
class SectionMerger
{
public:
  struct Mapping {
    std::string inputSubStr;
    LDSection* outputSection;
  };
  typedef std::vector<Mapping> LDSectionMapTy;

  typedef LDSectionMapTy::iterator iterator;
  typedef LDSectionMapTy::const_iterator const_iterator;

public:
  SectionMerger(SectionMap& pSectionMap, LDContext& pContext);
  ~SectionMerger();

  /// getOutputSectHdr - return a associated output section header
  LDSection* getOutputSectHdr(const std::string& pName);

  /// getOutputSectData - return a associated output section data
  llvm::MCSectionData* getOutputSectData(const std::string& pName);

  /// addMapping - add a mapping as creating one new output LDSection
  /// @param pName - a input section name
  /// @param pSection - the output LDSection*
  bool addMapping(const std::string& pName, LDSection* pSection);

  // -----  observers  ----- //
  bool empty() const
  { return m_LDSectionMap.empty(); }

  size_t size() const
  { return m_LDSectionMap.size(); }

  size_t capacity () const
  { return m_LDSectionMap.capacity(); }

  // -----  iterators  ----- //
  iterator find(const std::string& pName);

  iterator begin()
  { return m_LDSectionMap.begin(); }

  iterator end()
  { return m_LDSectionMap.end(); }

  const_iterator begin() const
  { return m_LDSectionMap.begin(); }

  const_iterator end() const
  { return m_LDSectionMap.end(); }

private:
  /// initOutputSectMap - initialize the map from input substr to associated
  /// output LDSection*
  void initOutputSectMap();

private:
  SectionMap& m_SectionNameMap;

  LDContext& m_Output;

  LDSectionMapTy m_LDSectionMap;
};

} // namespace of mcld

#endif
