//===- SearchDirs.h -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef SEARCHDIRS_H
#define SEARCHDIRS_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/ADT/StringRef.h>
#include "mcld/ADT/Uncopyable.h"
#include "mcld/MC/MCLDInput.h"

namespace mcld
{

class MCLDFile;
class MCLDDirectory;

namespace sys {
namespace fs {
class Path;
} // namespace of fs
} // namespace of sys

/** \class SearchDirs
 *  \brief SearchDirs contains the list of paths that MCLinker will search for
 *  archive libraries and control scripts.
 *
 *  SearchDirs is customized for linking. It handles -L on the command line
 *  and SEARCH_DIR macro in the link script.
 *
 *  @see MCLDDirectory.
 */
class SearchDirs : private Uncopyable
{
public:
  typedef std::vector<MCLDDirectory*> DirList;
  typedef DirList::iterator iterator;
  typedef DirList::const_iterator const_iterator;

public:
  SearchDirs();
  ~SearchDirs();

  /// find - give a namespec, return a real path of the shared object.
  sys::fs::Path* find(const std::string& pNamespec, mcld::Input::Type pType);

  // -----  iterators  ----- //
  iterator begin()
  { return m_DirList.begin(); }

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

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

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

  // -----  modifiers  ----- //
  void add(const MCLDDirectory& pDirectory);

private:
  DirList m_DirList;
};

} // namespace of mcld

#endif

