//===- SectionsCmd.h ------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_SCRIPT_SECTIONSCMD_H
#define MCLD_SCRIPT_SECTIONSCMD_H

#include <mcld/Script/ScriptCommand.h>
#include <llvm/Support/DataTypes.h>
#include <vector>

namespace mcld
{

class Module;

/** \class SectionsCmd
 *  \brief This class defines the interfaces to SECTIONS command.
 */

class SectionsCmd : public ScriptCommand
{
public:
  typedef std::vector<ScriptCommand*> SectionCommands;
  typedef SectionCommands::const_iterator const_iterator;
  typedef SectionCommands::iterator iterator;
  typedef SectionCommands::const_reference const_reference;
  typedef SectionCommands::reference reference;

public:
  SectionsCmd();
  ~SectionsCmd();

  const_iterator  begin() const { return m_SectionCommands.begin(); }
  iterator        begin()       { return m_SectionCommands.begin(); }
  const_iterator  end()   const { return m_SectionCommands.end(); }
  iterator        end()         { return m_SectionCommands.end(); }

  const_reference front() const { return m_SectionCommands.front(); }
  reference       front()       { return m_SectionCommands.front(); }
  const_reference back()  const { return m_SectionCommands.back(); }
  reference       back()        { return m_SectionCommands.back(); }

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

  bool empty() const { return m_SectionCommands.empty(); }

  void dump() const;

  static bool classof(const ScriptCommand* pCmd)
  {
    return pCmd->getKind() == ScriptCommand::SECTIONS;
  }

  void activate(Module& pModule);

  void push_back(ScriptCommand* pCommand);

private:
  SectionCommands m_SectionCommands;
};

} // namespace of mcld

#endif