Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

Pathname.h

Go to the documentation of this file.
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

Generated on Thu Feb 23 23:56:10 2006 for liby2util by doxygen 1.3.6