libzypp  11.13.5
Pathname.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_PATHNAME_H
13 #define ZYPP_PATHNAME_H
14 
15 #include <iosfwd>
16 #include <string>
17 
19 namespace zypp
20 {
21 
22  class Url;
23 
25  namespace filesystem
26  {
27 
29  //
30  // CLASS NAME : Pathname
31  //
45  class Pathname
46  {
47  public:
50  : prfx_i( 0 )
51  {}
52 
54  Pathname( const std::string & name_tv )
55  { _assign( name_tv ); }
56 
58  Pathname( const char * name_tv )
59  { _assign( name_tv ? name_tv : "" ); }
60 
62  Pathname & operator=( const Pathname & path_tv )
63  {
64  prfx_i = path_tv.prfx_i;
65  name_t = path_tv.name_t;
66  return *this;
67  }
68 
70  Pathname & operator/=( const Pathname & path_tv )
71  { return( *this = cat( *this, path_tv ) ); }
72 
76  Pathname & operator+=( const Pathname & path_tv )
77  { return( *this = cat( *this, path_tv ) ); }
78 
80  const std::string & asString() const
81  { return name_t; }
82 
84  static std::string showRoot( const Pathname & root_r, const Pathname & path_r );
85 
87  static std::string showRootIf( const Pathname & root_r, const Pathname & path_r );
88 
90  Url asUrl() const;
91 
93  const char * c_str() const
94  { return name_t.c_str(); }
95 
97  bool empty() const { return name_t.empty(); }
99  bool absolute() const { return !empty() && name_t[prfx_i] == '/'; }
101  bool relative() const { return !empty() && name_t[prfx_i] != '/'; }
102 
104  Pathname dirname() const { return dirname( *this ); }
105  static Pathname dirname( const Pathname & name_tv );
106 
108  std::string basename() const { return basename( *this ); }
109  static std::string basename( const Pathname & name_tv );
110 
115  std::string extension() const { return extension( *this ); }
116  static std::string extension( const Pathname & name_tv );
117 
119  Pathname absolutename() const { return absolutename( *this ); }
120  static Pathname absolutename( const Pathname & name_tv )
121  { return name_tv.relative() ? cat( "/", name_tv ) : name_tv; }
122 
124  Pathname relativename() const { return relativename( *this ); }
125  static Pathname relativename( const Pathname & name_tv )
126  { return name_tv.absolute() ? cat( ".", name_tv ) : name_tv; }
127 
129  static Pathname assertprefix( const Pathname & root_r, const Pathname & path_r );
130 
139  Pathname cat( const Pathname & r ) const { return cat( *this, r ); }
140  static Pathname cat( const Pathname & l, const Pathname & r );
141 
147  Pathname extend( const std::string & r ) const { return extend( *this, r ); }
148  static Pathname extend( const Pathname & l, const std::string & r );
149 
150  private:
152  std::string name_t;
153 
154  void _assign( const std::string & name_tv );
155  };
157 
159  inline bool operator==( const Pathname & l, const Pathname & r )
160  { return l.asString() == r.asString(); }
161 
163  inline bool operator!=( const Pathname & l, const Pathname & r )
164  { return l.asString() != r.asString(); }
165 
167  inline Pathname operator/( const Pathname & l, const Pathname & r )
168  { return Pathname::cat( l, r ); }
169 
173  inline Pathname operator+( const Pathname & l, const Pathname & r )
174  { return Pathname::cat( l, r ); }
175 
177  inline bool operator<( const Pathname & l, const Pathname & r )
178  { return l.asString() < r.asString(); }
179 
181 
183  inline std::ostream & operator<<( std::ostream & str, const Pathname & obj )
184  { return str << obj.asString(); }
185 
187  } // namespace filesystem
189 
191  using filesystem::Pathname;
192 
194 } // namespace zypp
196 #endif // ZYPP_PATHNAME_H