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

#include <llvm/Support/DataTypes.h>
#include <mcld/Support/GCFactory.h>
#include <mcld/LD/BranchIsland.h>

namespace mcld
{

class Fragment;

/** \class BranchIslandFactory
 *  \brief
 *
 */
class BranchIslandFactory : public GCFactory<BranchIsland, 0>
{
public:
  /// ctor
  /// @param pMaxBranchRange - the max branch range of the target backend
  /// @param pMaxIslandSize - a predifned value (64KB here) to decide the max
  ///                         size of the island
  BranchIslandFactory(uint64_t pMaxBranchRange,
                      uint64_t pMaxIslandSize = 65536U);

  ~BranchIslandFactory();

  /// produce - produce a island for the given fragment
  /// @param pFragment - the fragment needs a branch island
  BranchIsland* produce(Fragment& pFragment);

  /// find - find a island for the given fragment
  /// @param pFragment - the fragment needs a branch isladn
  BranchIsland* find(const Fragment& pFragment);

private:
  uint64_t m_MaxBranchRange;
  uint64_t m_MaxIslandSize;
};

} // namespace of mcld

#endif