added disk usage data to PackageImplIf interface, provide this info from
[platform/upstream/libzypp.git] / zypp / detail / PackageImplIf.h
index c2d4afa..4ac38a0 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef ZYPP_DETAIL_PACKAGEIMPLIF_H
 #define ZYPP_DETAIL_PACKAGEIMPLIF_H
 
+#include <set>
+
 #include "zypp/detail/ResObjectImplIf.h"
 #include "zypp/Edition.h"
 #include "zypp/Arch.h"
@@ -129,22 +131,154 @@ namespace zypp
        std::list<BaseVersion> _base_versions;
       };
 
-#if 0
-      /**
-      * @short Holds data about how much space will be needed per directory
-      **/
-      class DirSize {
+      class DiskUsage {
       public:
-        DirSize();
-        DirSize(const std::string& path,
-                const std::string& size,
-                const std::string& fileCount)
-       : path(path), sizeKByte(size), fileCount(fileCount)
-       {}
-        const std::string path;
-        const std::string sizeKByte;
-        const std::string fileCount;
+       /**
+       * @short Holds data about how much space will be needed per directory
+       **/
+       struct Entry {
+         Entry() : _size(0), _files(0) {};
+         Entry(const std::string& path_r,
+                  const unsigned size_r = 0,
+                  const unsigned files_r = 0)
+         : path(path_r), _size(size_r), _files(files_r)
+         {}
+          const std::string path;
+          mutable unsigned _size;
+          mutable unsigned _files;
+         friend std::ostream & operator<<( std::ostream & str, const Entry & obj );
+          /**
+           * Test for equality based on directory name.
+           **/
+          bool operator==( const Entry & rhs ) const {
+            return  path == rhs.path;
+          }
+          /**
+           * Order based on directory name.
+           **/
+          bool operator<( const Entry & rhs ) const {
+            return  path < rhs.path;
+          }
+          /**
+           * Return true if this entry denotes a directory equal to or below rhs._dirname.
+           **/
+          bool isBelow( const Entry & rhs ) const {
+            // whether _dirname has prefix rhs._dirname
+            return( path.compare( 0, rhs.path.size(), rhs.path ) == 0 );
+          }
+          /**
+           * Return true if this entry denotes a directory equal to or below dirname_r.
+           **/
+          bool isBelow( const std::string & dirname_r ) const {
+            return  isBelow( Entry( dirname_r ) );
+          }
+    
+          /**
+           * 
+           **/
+          const Entry & operator=( const Entry & rhs ) const {
+           return rhs;
+          }
+          /**
+           * Numerical operation based on size and files values.
+           **/
+          const Entry & operator+=( const Entry & rhs ) const {
+            _size  += rhs._size;
+            _files += rhs._files;
+            return *this;
+          }
+          /**
+           * Numerical operation based on size and files values.
+           **/
+          const Entry & operator-=( const Entry & rhs ) const {
+            _size  -= rhs._size;
+            _files -= rhs._files;
+            return *this;
+          }
+        };
+      private:
+       typedef std::set<Entry> EntrySet;
+       EntrySet _dirs;
+      public:
+
+       DiskUsage() {};
+       /**
+         * Add an entry. If already present, sum up the new entries size and files value.
+         **/
+        void add( const Entry & newent_r ) {
+         std::pair<EntrySet::iterator,bool> res = _dirs.insert( newent_r );
+         if ( !res.second ) {
+           *res.first += newent_r;
+         }
+       }
+       /**
+         * Add an entry. If already present, sum up the new entries size and files value.
+         **/
+        void add( const std::string & dirname_r, const unsigned & size_r = 0, const unsigned & files_r = 0 ) {
+          add( Entry( dirname_r, size_r, files_r ) );
+       }
+        /**
+         * Number of entries
+         **/
+        unsigned size() const { return _dirs.size(); }
+        /**
+         * Clear EntrySet
+         **/
+        void clear() { _dirs.clear(); }
+        /**
+         * Sum up any entries for dirname_r and its descendants and remove them
+         * on the fly. Return the result.
+         **/
+        Entry extract( const std::string & dirname_r );
+
+      public:
+
+        typedef EntrySet::iterator               iterator;
+        typedef EntrySet::reverse_iterator       reverse_iterator;
+     
+        /**
+         * Forward iterator pointing to the first entry (if any)
+         **/
+        iterator begin() { return _dirs.begin(); }
+        /**
+         * Forward iterator pointing behind the last entry.
+         **/
+        iterator end() { return _dirs.end(); }
+        /**
+         * Reverse iterator pointing to the last entry (if any)
+         **/
+        reverse_iterator rbegin() { return _dirs.rbegin(); }
+        /**
+         * Reverse iterator pointing before the first entry.
+         **/
+        reverse_iterator rend() { return _dirs.rend(); }
+     
+        typedef EntrySet::const_iterator         const_iterator;
+        typedef EntrySet::const_reverse_iterator const_reverse_iterator;
+     
+        /**
+         * Forward const iterator pointing to the first entry (if any)
+         **/
+        const_iterator begin() const { return _dirs.begin(); }
+        /**
+         * Forward const iterator pointing behind the last entry.
+         **/
+        const_iterator end() const { return _dirs.end(); }
+        /**
+         * Reverse const iterator pointing to the last entry (if any)
+         **/
+        const_reverse_iterator rbegin() const { return _dirs.rbegin(); }
+        /**
+         * Reverse const iterator pointing before the first entry.
+         **/
+        const_reverse_iterator rend()const { return _dirs.rend(); }
+
+      public:
+
+        friend std::ostream & operator<<( std::ostream & str, const PackageImplIf::DiskUsage & obj );
+
       };
+#if 0
     
       /**
        * @short Holds Data about file and file type