- Selectable: Using a transform_iterator to make the ui believe, it
authorMichael Andres <ma@suse.de>
Tue, 7 Feb 2006 14:38:39 +0000 (14:38 +0000)
committerMichael Andres <ma@suse.de>
Tue, 7 Feb 2006 14:38:39 +0000 (14:38 +0000)
  iterates over ResObject::Ptr.

zypp/ui/Selectable.cc
zypp/ui/Selectable.h
zypp/ui/SelectableImpl.h

index 23d1dcf..7ae1135 100644 (file)
@@ -73,6 +73,12 @@ namespace zypp
     Selectable::size_type Selectable::availableObjs() const
     { return _pimpl->availableObjs(); }
 
+    Selectable::available_iterator Selectable::availableBegin() const
+    { return _pimpl->availableBegin(); }
+
+    Selectable::available_iterator Selectable::availableEnd() const
+    { return _pimpl->availableEnd(); }
+
     /******************************************************************
     **
     ** FUNCTION NAME : operator<<
index 12b63e3..8691862 100644 (file)
 #include "zypp/base/ReferenceCounted.h"
 #include "zypp/base/NonCopyable.h"
 #include "zypp/base/PtrTypes.h"
+#include "zypp/base/Iterator.h"
 
 #include "zypp/ResObject.h"
+#include "zypp/PoolItem.h"
 #include "zypp/ui/Status.h"
 
 ///////////////////////////////////////////////////////////////////
@@ -28,11 +30,22 @@ namespace zypp
   namespace ui
   { /////////////////////////////////////////////////////////////////
 
+    namespace ui_detail
+    {
+      /** Transform PoolItem to ResObject::constPtr. */
+      struct TransformToResObjectPtr : public std::unary_function<PoolItem,ResObject::constPtr>
+      {
+        ResObject::constPtr operator()( const PoolItem & obj ) const
+        { return obj; }
+      };
+    }
+
     ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : Selectable
     //
-    /**
+    /** Collects ResObject of same kind and name.
+     *
      * \note There's one Selectable per installed item, in case more
      * than one item is intalled.
      *
@@ -41,23 +54,32 @@ namespace zypp
     class Selectable : public base::ReferenceCounted, private base::NonCopyable
     {
       friend std::ostream & operator<<( std::ostream & str, const Selectable & obj );
+      typedef std::set<PoolItem>               AvialableItemSet;
 
     public:
       typedef intrusive_ptr<Selectable>        Ptr;
       typedef intrusive_ptr<const Selectable>  constPtr;
-      typedef unsigned                         size_type;
+
+      /** UI likes to iterate on ResObject::constPtr,
+       * independent from what the implementation uses. */
+      typedef transform_iterator<ui_detail::TransformToResObjectPtr,
+                                 AvialableItemSet::const_iterator>
+                                 available_iterator;
+      typedef AvialableItemSet::size_type      size_type;
 
     public:
-      /**  */
+      /** The ResObjects kind. */
       ResObject::Kind kind() const;
 
-      /**  */
+      /** The ResObjects name.  */
       const std::string & name() const;
 
-      /**  */
+      /** Return the current Status */
       Status status() const;
 
-      /**  */
+      /** Try to set a new Status.
+       * Returns \c false if the transitions is not allowed.
+      */
       bool set_status( const Status state_r );
 
       /** Installed object. */
@@ -72,7 +94,11 @@ namespace zypp
       /** Number of available objects. */
       size_type availableObjs() const;
 
-      // iterators
+      /** */
+      available_iterator availableBegin() const;
+
+      /** */
+      available_iterator availableEnd() const;
 
     public:
       /** Implementation  */
index dcb2941..38491e4 100644 (file)
@@ -36,17 +36,19 @@ namespace zypp
     {
       friend std::ostream & operator<<( std::ostream & str, const Selectable::Impl & obj );
 
-      typedef ResPool::Item                    PoolItem;
-      typedef std::set<PoolItem>               AvialableItemSet;
-      typedef AvialableItemSet::const_iterator available_iterator;
-      typedef AvialableItemSet::size_type      size_type;
+    public:
+
+      /** This iterates PoolItems. Dont mix it with available_iterator,
+       * which transforms the PoolItems to ResObject::constPtr.
+      */
+      typedef AvialableItemSet::const_iterator availableItem_iterator;
 
     public:
       Impl( const ResObject::Kind & kind_r,
             const std::string & name_r,
             const PoolItem & installedItem_r,
-            available_iterator availableBegin_r,
-            available_iterator availableEnd_r )
+            availableItem_iterator availableBegin_r,
+            availableItem_iterator availableEnd_r )
       : _kind( kind_r )
       , _name( name_r )
       , _installedItem( installedItem_r )
@@ -81,12 +83,18 @@ namespace zypp
 
       /** . */
       size_type availableObjs() const
-      { return 0; }
+      { return _availableItems.size(); }
+
+      available_iterator availableBegin() const
+      { return make_transform_iterator( _availableItems.begin(), ui_detail::TransformToResObjectPtr() ); }
+
+      available_iterator availableEnd() const
+      { return make_transform_iterator( _availableItems.end(), ui_detail::TransformToResObjectPtr() ); }
 
     private:
-      ResObject::Kind _kind;
-      std::string _name;
-      PoolItem _installedItem;
+      ResObject::Kind  _kind;
+      std::string      _name;
+      PoolItem         _installedItem;
       AvialableItemSet _availableItems;
     };
     ///////////////////////////////////////////////////////////////////