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

#include <string>

#include "mcld/Support/RealPath.h"
#include "mcld/Support/PositionDependentOption.h"

namespace mcld
{

  /** \class DerivedPositionDependentOptions
   *  \brief This file contains the declarations of classes derived from PositionDependentOption.
   */

  class FileOption : public PositionDependentOption {
  private:
    sys::fs::RealPath m_Path;

  protected:
    FileOption(unsigned pPosition, Type pType, const sys::fs::Path &pPath)
      : PositionDependentOption(pPosition, pType)
    { m_Path.assign(pPath); }

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

  class NamespecOption : public PositionDependentOption {
  private:
    std::string m_pNamespec;

  public:
    NamespecOption(unsigned pPosition, const std::string &pNamespec)
      : PositionDependentOption(pPosition, PositionDependentOption::NAMESPEC),
        m_pNamespec(pNamespec) { }

    inline const std::string &namespec() const { return m_pNamespec; }
  };

  class BitcodeOption : public FileOption {
  public:
    BitcodeOption(unsigned pPosition, const sys::fs::Path &pPath)
      : FileOption(pPosition, PositionDependentOption::BITCODE, pPath) { }
  };

  class StartGroupOption : public PositionDependentOption {
  public:
    StartGroupOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::START_GROUP) { }
  };

  class EndGroupOption : public PositionDependentOption {
  public:
    EndGroupOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::END_GROUP) { }
  };

  class InputFileOption : public FileOption {
  public:
    InputFileOption(unsigned pPosition, const sys::fs::Path &pPath)
      : FileOption(pPosition, PositionDependentOption::INPUT_FILE, pPath) { }
  };

  class WholeArchiveOption : public PositionDependentOption {
  public:
    WholeArchiveOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::WHOLE_ARCHIVE) { }
  };

  class NoWholeArchiveOption : public PositionDependentOption {
  public:
    NoWholeArchiveOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::NO_WHOLE_ARCHIVE) { }
  };

  class AsNeededOption : public PositionDependentOption {
  public:
    AsNeededOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::AS_NEEDED) { }
  };

  class NoAsNeededOption : public PositionDependentOption {
  public:
    NoAsNeededOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::NO_AS_NEEDED) { }
  };

  class AddNeededOption : public PositionDependentOption {
  public:
    AddNeededOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::ADD_NEEDED) { }
  };

  class NoAddNeededOption : public PositionDependentOption {
  public:
    NoAddNeededOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::NO_ADD_NEEDED) { }
  };

  class BDynamicOption : public PositionDependentOption {
  public:
    BDynamicOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::BDYNAMIC) { }
  };

  class BStaticOption : public PositionDependentOption {
  public:
    BStaticOption(unsigned pPosition)
      : PositionDependentOption(pPosition,
                                PositionDependentOption::BSTATIC) { }
  };

} // namespace of mcld

#endif