Path.h revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
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//===----------------------------------------------------------------------===// 9f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// This file declares the mcld::sys::fs::Path. 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#ifndef MCLD_PATH_H 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_PATH_H 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/raw_ostream.h> 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Config/Config.h> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <iosfwd> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <functional> 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <locale> 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace sys { 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace fs { 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#if defined(MCLD_ON_WIN32) 32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char preferred_separator = '/'; 33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char separator = '/'; 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#else 35f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char preferred_separator = '/'; 36f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char separator = '/'; 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 39f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char colon = ':'; 40f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst char dot = '.'; 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class Path 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Path provides an abstraction for the path to a file or directory in 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * the operating system's filesystem. 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Path 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef char ValueType; 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef std::string StringType; 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(); 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const ValueType* s); 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const StringType &s); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path(const Path& pCopy); 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao virtual ~Path(); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- assignments ----- // 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template <class InputIterator> 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(InputIterator begin, InputIterator end); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(const StringType &s); 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& assign(const ValueType* s, unsigned int length); 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- appends ----- // 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao template <class InputIterator> 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& append(InputIterator begin, InputIterator end); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& append(const Path& pPath); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const; 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFromRoot() const; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isFromPWD() const; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const StringType& native() const { return m_PathName; } 77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines StringType& native() { return m_PathName; } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ValueType* c_str() const 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_PathName.c_str(); } 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- decomposition ----- // 83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao Path parent_path() const; 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Path filename() const; 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path stem() const; 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path extension() const; 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- generic form observers ----- // 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType generic_string() const; 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool canonicalize(); 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType::size_type m_append_separator_if_needed(); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void m_erase_redundant_separator(StringType::size_type sep_pos); 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprotected: 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType m_PathName; 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator==(const Path& pLHS,const Path& pRHS); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool operator!=(const Path& pLHS,const Path& pRHS); 10267e37f1be98c926645219cfb47fab9e90d8c725cShih-wei LiaoPath operator+(const Path& pLHS, const Path& pRHS); 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// Non-member Functions 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool exists(const Path &pPath); 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool is_directory(const Path &pPath); 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestemplate <class Char, class Traits> 112f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesinline std::basic_ostream<Char, Traits>& 113f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesoperator<<(std::basic_ostream<Char, Traits>& pOS, const Path& pPath) 114f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 115f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return pOS << pPath.native(); 116f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 118f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinestemplate <class Char, class Traits> 119f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesinline std::basic_istream<Char, Traits>& 120f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesoperator>>(std::basic_istream<Char, Traits>& pOS, Path& pPath) 121f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 122f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return pOS >> pPath.native(); 123f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 125f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesinline llvm::raw_ostream& 126f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesoperator<<(llvm::raw_ostream& pOS, const Path& pPath) 127f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 128f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return pOS << pPath.native(); 129f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 131f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 132f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// class path member template implementation 133f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 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 159f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 160f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines// STL compatible functions 161f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===// 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