Path.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Path.h -------------------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file declares the mcld::sys::fs:: namespace. It follows TR2/boost
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// filesystem (v3), but modified to remove exception handling and the
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// path class.
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_PATH_H
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_PATH_H
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/raw_ostream.h>
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <functional>
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//#include "mcld/Support/Directory.h"
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld {
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace sys  {
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace fs   {
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef LLVM_ON_WIN32
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst wchar_t       separator = L'\\';
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst wchar_t       preferred_separator = L'\\';
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst char          separator = '/';
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoconst char          preferred_separator = '/';
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class Path
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief Path provides an abstraction for the path to a file or directory in
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *   the operating system's filesystem.
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  FIXME: current Path library only support UTF-8 chararcter set.
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Path
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef LLVM_ON_WIN32
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef wchar_t                            ValueType;
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef char                               ValueType;
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::basic_string<ValueType>       StringType;
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path();
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path(const ValueType* s);
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path(const StringType &s);
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path(const Path& pCopy);
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  virtual ~Path();
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  assignments  ----- //
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template <class InputIterator>
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path& assign(InputIterator begin, InputIterator end);
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path& assign(const StringType &s);
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path& assign(const ValueType* s, unsigned int length);
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //  -----  appends  ----- //
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  template <class InputIterator>
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path& append(InputIterator begin, InputIterator end);
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path& append(const Path& pPath);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  //  -----  observers  ----- //
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool empty() const;
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isFromRoot() const;
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool isFromPWD() const;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const StringType &native() const
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_PathName; }
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StringType &native()
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_PathName; }
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const ValueType* c_str() const
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  { return m_PathName.c_str(); }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  std::string string() const;
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  decomposition  ----- //
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path stem() const;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Path extension() const;
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // -----  generic form observers  ----- //
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StringType generic_string() const;
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool canonicalize();
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StringType::size_type m_append_separator_if_needed();
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void m_erase_redundant_separator(StringType::size_type sep_pos);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected:
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StringType m_PathName;
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator==(const Path& pLHS,const Path& pRHS);
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator!=(const Path& pLHS,const Path& pRHS);
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------//
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                              non-member functions                        //
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------//
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// is_separator - is the given character a separator of a path.
1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// @param value a character
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// @result true if \a value is a path separator character on the host OS
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//bool status_known(FileStatus f) { return f.type() != StatusError; }
1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_separator(char value);
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool exists(const Path &pPath);
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_directory(const Path &pPath);
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::ostream &operator<<(std::ostream& pOS, const Path& pPath);
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::istream &operator>>(std::istream& pOS, Path& pPath);
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaollvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Path &pPath);
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------------------//
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     class path member template implementation                        //
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//--------------------------------------------------------------------------------------//
1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate <class InputIterator>
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::assign(InputIterator begin, InputIterator end)
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_PathName.clear();
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (begin != end)
1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_PathName.append<InputIterator>(begin, end);
1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate <class InputIterator>
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::append(InputIterator begin, InputIterator end)
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (begin == end)
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return *this;
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  StringType::size_type sep_pos(m_append_separator_if_needed());
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_PathName.append<InputIterator>(begin, end);
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (sep_pos)
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_erase_redundant_separator(sep_pos);
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return *this;
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of fs
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of sys
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//-------------------------------------------------------------------------//
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                              STL compatible functions                   //
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//-------------------------------------------------------------------------//
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace std {
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<>
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct less<mcld::sys::fs::Path> : public binary_function<mcld::sys::fs::Path,
1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                         mcld::sys::fs::Path,
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao                                                         bool>
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  bool operator() (const mcld::sys::fs::Path& pX,const mcld::sys::fs::Path& pY) const {
1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    if (pX.generic_string().size() < pY.generic_string().size())
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      return true;
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return (pX.generic_string() < pY.generic_string());
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of std
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
180