00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef Pathname_h
00020 #define Pathname_h
00021
00022 #include <iosfwd>
00023 #include <string>
00024
00026
00027
00028
00029
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