|
yast2-core
|
00001 /*---------------------------------------------------------------------\ 00002 | | 00003 | __ __ ____ _____ ____ | 00004 | \ \ / /_ _/ ___|_ _|___ \ | 00005 | \ V / _` \___ \ | | __) | | 00006 | | | (_| |___) || | / __/ | 00007 | |_|\__,_|____/ |_| |_____| | 00008 | | 00009 | core system | 00010 | (C) SuSE GmbH | 00011 \----------------------------------------------------------------------/ 00012 00013 File: Pathname.h 00014 00015 Author: Michael Andres <ma@suse.de> 00016 Maintainer: Michael Andres <ma@suse.de> 00017 00018 /-*/ 00019 #ifndef Pathname_h 00020 #define Pathname_h 00021 00022 #include <iosfwd> 00023 #include <string> 00024 00026 // 00027 // CLASS NAME : Pathname 00028 // 00029 // DESCRIPTION : 00030 // 00031 class Pathname { 00032 00033 private: 00034 00035 std::string::size_type prfx_i; 00036 std::string name_t; 00037 00038 protected: 00039 00040 void _assign( const std::string & name_tv ); 00041 00042 public: 00043 00044 virtual ~Pathname() {} 00045 00046 Pathname() { 00047 prfx_i = 0; 00048 name_t = ""; 00049 } 00050 Pathname( const Pathname & path_tv ) { 00051 prfx_i = path_tv.prfx_i; 00052 name_t = path_tv.name_t; 00053 } 00054 Pathname( const std::string & name_tv ) { 00055 _assign( name_tv ); 00056 } 00057 Pathname( const char * name_tv ) { 00058 _assign( name_tv ? name_tv : "" ); 00059 } 00060 00061 Pathname & operator= ( const Pathname & path_tv ); 00062 Pathname & operator+=( const Pathname & path_tv ); 00063 00064 const std::string & asString() const { return name_t; } 00065 00066 bool empty() const { return !name_t.size(); } 00067 bool absolute() const { return !empty() && name_t[prfx_i] == '/'; } 00068 bool relative() const { return !empty() && name_t[prfx_i] != '/'; } 00069 00070 Pathname dirname() const { return dirname( *this ); } 00071 std::string basename() const { return basename( *this ); } 00072 Pathname absolutename() const { return absolutename( *this ); } 00073 Pathname relativename() const { return relativename( *this ); } 00074 00075 static Pathname dirname ( const Pathname & name_tv ); 00076 static std::string basename ( const Pathname & name_tv ); 00077 static Pathname absolutename( const Pathname & name_tv ) { return name_tv.relative() ? cat( "/", name_tv ) : name_tv; } 00078 static Pathname relativename( const Pathname & name_tv ) { return name_tv.absolute() ? cat( ".", name_tv ) : name_tv; } 00079 00080 Pathname cat( const Pathname & r ) const { return cat( *this, r ); } 00081 static Pathname cat( const Pathname & l, const Pathname & r ); 00082 00083 Pathname extend( const std::string & r ) const { return extend( *this, r ); } 00084 static Pathname extend( const Pathname & l, const std::string & r ); 00085 00086 bool equal( const Pathname & r ) const { return equal( *this, r ); } 00087 static bool equal( const Pathname & l, const Pathname & r ); 00088 }; 00089 00091 00092 inline bool operator==( const Pathname & l, const Pathname & r ) { 00093 return Pathname::equal( l, r ); 00094 } 00095 00096 inline bool operator!=( const Pathname & l, const Pathname & r ) { 00097 return !Pathname::equal( l, r ); 00098 } 00099 00100 inline Pathname operator+( const Pathname & l, const Pathname & r ) { 00101 return Pathname::cat( l, r ); 00102 } 00103 00104 inline Pathname & Pathname::operator=( const Pathname & path_tv ) { 00105 if ( &path_tv != this ) { 00106 prfx_i = path_tv.prfx_i; 00107 name_t = path_tv.name_t; 00108 } 00109 return *this; 00110 } 00111 00112 inline Pathname & Pathname::operator+=( const Pathname & path_tv ) { 00113 return( *this = *this + path_tv ); 00114 } 00115 00117 00118 extern std::ostream & operator<<( std::ostream & str, const Pathname & obj ); 00119 00121 00122 #endif // Pathname_h
1.7.3