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<<
#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"
///////////////////////////////////////////////////////////////////
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.
*
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. */
/** Number of available objects. */
size_type availableObjs() const;
- // iterators
+ /** */
+ available_iterator availableBegin() const;
+
+ /** */
+ available_iterator availableEnd() const;
public:
/** Implementation */
{
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 )
/** . */
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;
};
///////////////////////////////////////////////////////////////////