1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/DiskUsage.h
12 #ifndef ZYPP_DISKUSAGE_H
13 #define ZYPP_DISKUSAGE_H
18 ///////////////////////////////////////////////////////////////////
20 { /////////////////////////////////////////////////////////////////
25 * @short Holds data about how much space will be needed per directory
28 Entry() : _size(0), _files(0) {};
29 Entry(const std::string& path_r,
30 const unsigned size_r = 0,
31 const unsigned files_r = 0)
32 : path(path_r), _size(size_r), _files(files_r)
34 const std::string path;
35 mutable unsigned _size;
36 mutable unsigned _files;
37 friend std::ostream & operator<<( std::ostream & str, const Entry & obj );
39 * Test for equality based on directory name.
41 bool operator==( const Entry & rhs ) const {
42 return path == rhs.path;
45 * Order based on directory name.
47 bool operator<( const Entry & rhs ) const {
48 return path < rhs.path;
51 * Return true if this entry denotes a directory equal to or below rhs._dirname.
53 bool isBelow( const Entry & rhs ) const {
54 // whether _dirname has prefix rhs._dirname
55 return( path.compare( 0, rhs.path.size(), rhs.path ) == 0 );
58 * Return true if this entry denotes a directory equal to or below dirname_r.
60 bool isBelow( const std::string & dirname_r ) const {
61 return isBelow( Entry( dirname_r ) );
67 const Entry & operator=( const Entry & rhs ) const {
71 * Numerical operation based on size and files values.
73 const Entry & operator+=( const Entry & rhs ) const {
79 * Numerical operation based on size and files values.
81 const Entry & operator-=( const Entry & rhs ) const {
88 typedef std::set<Entry> EntrySet;
94 * Add an entry. If already present, sum up the new entries size and files value.
96 void add( const Entry & newent_r ) {
97 std::pair<EntrySet::iterator,bool> res = _dirs.insert( newent_r );
99 *res.first += newent_r;
103 * Add an entry. If already present, sum up the new entries size and files value.
105 void add( const std::string & dirname_r, const unsigned & size_r = 0, const unsigned & files_r = 0 ) {
106 add( Entry( dirname_r, size_r, files_r ) );
111 unsigned size() const { return _dirs.size(); }
115 void clear() { _dirs.clear(); }
117 * Sum up any entries for dirname_r and its descendants and remove them
118 * on the fly. Return the result.
120 Entry extract( const std::string & dirname_r );
124 typedef EntrySet::iterator iterator;
125 typedef EntrySet::reverse_iterator reverse_iterator;
128 * Forward iterator pointing to the first entry (if any)
130 iterator begin() { return _dirs.begin(); }
132 * Forward iterator pointing behind the last entry.
134 iterator end() { return _dirs.end(); }
136 * Reverse iterator pointing to the last entry (if any)
138 reverse_iterator rbegin() { return _dirs.rbegin(); }
140 * Reverse iterator pointing before the first entry.
142 reverse_iterator rend() { return _dirs.rend(); }
144 typedef EntrySet::const_iterator const_iterator;
145 typedef EntrySet::const_reverse_iterator const_reverse_iterator;
148 * Forward const iterator pointing to the first entry (if any)
150 const_iterator begin() const { return _dirs.begin(); }
152 * Forward const iterator pointing behind the last entry.
154 const_iterator end() const { return _dirs.end(); }
156 * Reverse const iterator pointing to the last entry (if any)
158 const_reverse_iterator rbegin() const { return _dirs.rbegin(); }
160 * Reverse const iterator pointing before the first entry.
162 const_reverse_iterator rend()const { return _dirs.rend(); }
166 friend std::ostream & operator<<( std::ostream & str, const DiskUsage & obj );
169 ///////////////////////////////////////////////////////////////////
170 /////////////////////////////////////////////////////////////////
172 ///////////////////////////////////////////////////////////////////
173 #endif // ZYPP_DISKUSAGE_H