//===- MCLDInput.h --------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  Input class inherits MCLDFile, which is used to represent a input file
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_INPUT_H
#define MCLD_INPUT_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

#include <mcld/Support/Path.h>

namespace mcld {

class MemoryArea;
class AttributeProxy;
class Attribute;
class InputFactory;
class LDContext;

/** \class Input
 *  \brief Input provides the information of a input file.
 */
class Input
{
friend class InputFactory;
public:
  enum Type {
    Unknown,
    Object,
    Exec,
    DynObj,
    CoreFile,
    Script,
    Archive,
    External
  };

public:
  explicit Input(llvm::StringRef pName);

  Input(llvm::StringRef pName,
        const AttributeProxy& pAttr);

  Input(llvm::StringRef pName,
        const sys::fs::Path& pPath,
        unsigned int pType = Unknown,
        off_t pFileOffset = 0);

  Input(llvm::StringRef pName,
        const sys::fs::Path& pPath,
        const AttributeProxy& pAttr,
        unsigned int pType = Unknown,
        off_t pFileOffset = 0);

  ~Input();

  const std::string& name() const
  { return m_Name; }

  void setName(const std::string& pName)
  { m_Name = pName; }

  const sys::fs::Path& path() const
  { return m_Path; }

  void setPath(const sys::fs::Path& pPath)
  { m_Path = pPath; }

  void setType(unsigned int pType)
  { m_Type = pType; }

  unsigned int type() const
  { return m_Type; }

  bool isRecognized() const
  { return (m_Type != Unknown); }

  bool hasAttribute() const
  { return (NULL != m_pAttr); }

  const Attribute* attribute() const
  { return m_pAttr; }

  bool isNeeded() const
  { return m_bNeeded; }

  void setNeeded()
  { m_bNeeded = true; }

  off_t fileOffset() const
  { return m_fileOffset; }

  void setFileOffset(off_t pFileOffset)
  { m_fileOffset = pFileOffset; }

  // -----  memory area  ----- //
  void setMemArea(MemoryArea* pMemArea)
  { m_pMemArea = pMemArea; }

  bool hasMemArea() const
  { return (NULL != m_pMemArea); }

  const MemoryArea* memArea() const { return m_pMemArea; }
  MemoryArea*       memArea()       { return m_pMemArea; }

  // -----  context  ----- //
  void setContext(LDContext* pContext)
  { m_pContext = pContext; }

  bool hasContext() const
  { return (NULL != m_pContext); }

  const LDContext* context() const { return m_pContext; }
  LDContext*       context()       { return m_pContext; }

private:
  unsigned int m_Type;
  std::string m_Name;
  sys::fs::Path m_Path;
  Attribute *m_pAttr;
  bool m_bNeeded;
  off_t m_fileOffset;
  MemoryArea* m_pMemArea;
  LDContext* m_pContext;
};

} // namespace of mcld

#endif

