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