Author: mlandres
Date: Mon Apr 7 19:37:16 2008
New Revision: 9438
URL: http://svn.opensuse.org/viewcvs/zypp?rev=9438&view=rev
Log:
done LookupAttr, added ArrayAttr container to retrieve list attributes.
Modified:
trunk/libzypp/zypp/Package.cc
trunk/libzypp/zypp/Package.h
trunk/libzypp/zypp/Patch.cc
trunk/libzypp/zypp/Patch.h
trunk/libzypp/zypp/Pattern.h
trunk/libzypp/zypp/ResObject.h
trunk/libzypp/zypp/sat/LookupAttr.cc
trunk/libzypp/zypp/sat/LookupAttr.h
trunk/libzypp/zypp/sat/Pool.cc
trunk/libzypp/zypp/sat/Solvable.h
Modified: trunk/libzypp/zypp/Package.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Package.cc?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/Package.cc (original)
+++ trunk/libzypp/zypp/Package.cc Mon Apr 7 19:37:16 2008
@@ -66,9 +66,8 @@
std::string Package::group() const
{ return lookupStrAttribute( sat::SolvAttr::group ); }
-#warning DUMMY keywords
Package::Keywords Package::keywords() const
- { return Keywords(); }
+ { return Keywords( sat::SolvAttr::keywords, satSolvable() ); }
/** Don't ship it as class Url, because it might be
* in fact anything but a legal Url. */
Modified: trunk/libzypp/zypp/Package.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Package.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/Package.h (original)
+++ trunk/libzypp/zypp/Package.h Mon Apr 7 19:37:16 2008
@@ -37,7 +37,7 @@
typedef TraitsType::constPtrType constPtr;
public:
- typedef std::set<PackageKeyword> Keywords;
+ typedef sat::ArrayAttr Keywords;
public:
Modified: trunk/libzypp/zypp/Patch.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Patch.cc?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/Patch.cc (original)
+++ trunk/libzypp/zypp/Patch.cc Mon Apr 7 19:37:16 2008
@@ -55,10 +55,10 @@
bool Patch::affects_pkg_manager() const
{ return false; }
- Patch::AtomList Patch::atoms() const
- {
#warning Implement PATCH::ATOMS
#if 0
+ Patch::AtomList Patch::atoms() const
+ {
if ( ! _atomlist )
{
if ( ! hasBackRef() )
@@ -96,9 +96,9 @@
}
}
return *_atomlist;
-#endif
return AtomList();
}
+#endif
bool Patch::interactive() const
{
Modified: trunk/libzypp/zypp/Patch.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Patch.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/Patch.h (original)
+++ trunk/libzypp/zypp/Patch.h Mon Apr 7 19:37:16 2008
@@ -50,11 +50,13 @@
bool reboot_needed() const;
/** Does the patch affect the package manager itself? */
bool affects_pkg_manager() const;
- /** The list of all atoms building the patch */
- AtomList atoms() const;
/** Is the patch installation interactive? (does it need user input?) */
bool interactive() const;
+ /** The list of all atoms building the patch */
+ ZYPP_DEPRECATED AtomList atoms() const
+ { return AtomList(); }
+
protected:
friend Ptr make<Self>( const sat::Solvable & solvable_r );
/** Ctor */
Modified: trunk/libzypp/zypp/Pattern.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Pattern.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/Pattern.h (original)
+++ trunk/libzypp/zypp/Pattern.h Mon Apr 7 19:37:16 2008
@@ -36,6 +36,9 @@
typedef TraitsType::constPtrType constPtr;
public:
+ typedef sat::ArrayAttr NameList;
+
+ public:
/** */
bool isDefault() const;
/** */
Modified: trunk/libzypp/zypp/ResObject.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/ResObject.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/ResObject.h (original)
+++ trunk/libzypp/zypp/ResObject.h Mon Apr 7 19:37:16 2008
@@ -23,6 +23,8 @@
#include "zypp/OnMediaLocation.h"
#include "zypp/Repository.h"
+#include "zypp/sat/LookupAttr.h"
+
#include "zypp/TranslatedText.h"
///////////////////////////////////////////////////////////////////
Modified: trunk/libzypp/zypp/sat/LookupAttr.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/LookupAttr.cc?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/sat/LookupAttr.cc (original)
+++ trunk/libzypp/zypp/sat/LookupAttr.cc Mon Apr 7 19:37:16 2008
@@ -11,11 +11,15 @@
*/
#include <cstring>
#include <iostream>
+#include <sstream>
+
#include "zypp/base/Logger.h"
+#include "zypp/base/String.h"
#include "zypp/sat/detail/PoolImpl.h"
#include "zypp/sat/LookupAttr.h"
+#include "zypp/CheckSum.h"
using std::endl;
@@ -56,6 +60,9 @@
return iterator();
}
+ bool LookupAttr::empty() const
+ { return begin() == end(); }
+
std::ostream & operator<<( std::ostream & str, const LookupAttr & obj )
{
if ( obj.attr() == SolvAttr::noAttr )
@@ -89,6 +96,10 @@
//
///////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ // position and moving
+ ///////////////////////////////////////////////////////////////////
+
Repository LookupAttr::iterator::inRepo() const
{ return Repository( _dip->repo ); }
@@ -98,9 +109,6 @@
SolvAttr LookupAttr::iterator::inSolvAttr() const
{ return SolvAttr( _dip->key->name ); }
- detail::IdType LookupAttr::iterator::solvAttrType() const
- { return _dip->key->type; }
-
void LookupAttr::iterator::nextSkipSolvAttr()
{ ::dataiterator_skip_attribute( _dip.get() ); }
@@ -111,9 +119,216 @@
{ ::dataiterator_skip_repo( _dip.get() ); }
///////////////////////////////////////////////////////////////////
+ // attr value type test
+ ///////////////////////////////////////////////////////////////////
+
+ detail::IdType LookupAttr::iterator::solvAttrType() const
+ { return _dip->key->type; }
+
+ bool LookupAttr::iterator::solvAttrNumeric() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_U32:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_CONSTANT:
+ return true;
+ break;
+ }
+ return false;
+ }
+
+ bool LookupAttr::iterator::solvAttrString() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ case REPOKEY_TYPE_STR:
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ return true;
+ break;
+ }
+ return false;
+ }
+
+ bool LookupAttr::iterator::solvAttrIdString() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ return true;
+ break;
+ }
+ return false;
+ }
+
+ bool LookupAttr::iterator::solvAttrCheckSum() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_MD5:
+ case REPOKEY_TYPE_SHA1:
+ case REPOKEY_TYPE_SHA256:
+ return true;
+ break;
+ }
+ return false;
+ }
+
+ ///////////////////////////////////////////////////////////////////
+ // attr value type test
+ ///////////////////////////////////////////////////////////////////
+
+ int LookupAttr::iterator::asInt() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_U32:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_CONSTANT:
+ return _dip->kv.num;
+ break;
+ }
+ return 0;
+ }
+
+ unsigned LookupAttr::iterator::asUnsigned() const
+ { return asInt(); }
+
+ bool LookupAttr::iterator::asBool() const
+ { return asInt(); }
+
+
+ const char * LookupAttr::iterator::c_str() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ if ( _dip->data && _dip->data->localpool )
+ return ::stringpool_id2str( &_dip->data->spool, _dip->kv.id ); // in local pool
+ else
+ return IdString( _dip->kv.id ).c_str(); // in global pool
+ break;
+
+ case REPOKEY_TYPE_STR:
+ return _dip->kv.str;
+ break;
+
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ return ::repodata_dir2str( _dip->data, _dip->kv.id, _dip->kv.str );
+ break;
+ }
+ return 0;
+ }
+
+ std::string LookupAttr::iterator::asString() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ case REPOKEY_TYPE_STR:
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ {
+ const char * ret( c_str() );
+ return ret ? ret : "";
+ }
+ break;
+
+ case REPOKEY_TYPE_U32:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_CONSTANT:
+ return str::numstring( asInt() );
+ break;
+
+ case REPOKEY_TYPE_MD5:
+ case REPOKEY_TYPE_SHA1:
+ case REPOKEY_TYPE_SHA256:
+ {
+ std::ostringstream str;
+ str << asCheckSum();
+ return str.str();
+ }
+ break;
+ }
+ return std::string();
+ }
+
+ IdString LookupAttr::iterator::idStr() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ return IdString( ::repodata_globalize_id( _dip->data, _dip->kv.id ) );
+ break;
+ }
+ return IdString();
+ }
+
+ CheckSum LookupAttr::iterator::asCheckSum() const
+ {
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_MD5:
+ return CheckSum::md5( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
+
+ case REPOKEY_TYPE_SHA1:
+ return CheckSum::sha1( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
+
+ case REPOKEY_TYPE_SHA256:
+ return CheckSum::sha256( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
+ }
+ return CheckSum();
+ }
+
+ ///////////////////////////////////////////////////////////////////
// internal stuff below
///////////////////////////////////////////////////////////////////
+ LookupAttr::iterator::~iterator()
+ {}
+
+ LookupAttr::iterator::iterator()
+ : iterator_adaptor_( 0 )
+ {}
+
+ LookupAttr::iterator::iterator( const iterator & rhs )
+ : iterator_adaptor_( cloneFrom( rhs.base() ) )
+ , _dip( base() )
+ {}
+
+ LookupAttr::iterator & LookupAttr::iterator::operator=( const iterator & rhs )
+ {
+ if ( &rhs != this )
+ {
+ _dip.reset( cloneFrom( rhs.base() ) );
+ base_reference() = _dip.get();
+ }
+ return *this;
+ }
+
+ LookupAttr::iterator::iterator( scoped_ptr< ::_Dataiterator> & dip_r, bool chain_r )
+ : iterator_adaptor_( dip_r.get() )
+ , _chainRepos( chain_r )
+ {
+ _dip.swap( dip_r ); // take ownership!
+ increment();
+ }
+
+ ///////////////////////////////////////////////////////////////////
+
::_Dataiterator * LookupAttr::iterator::cloneFrom( const ::_Dataiterator * rhs )
{
if ( ! rhs )
@@ -163,10 +378,13 @@
if ( ! dip )
return str << "EndOfQuery" << endl;
- str << obj.inSolvable()
- << '<' << obj.inSolvAttr()
- << "> = " << obj.solvAttrType()
- << "(" << dip->kv.id << ")" << (dip->data && dip->data->localpool ? "*" : "" );
+ if ( obj.inSolvable() )
+ str << obj.inSolvable();
+ else if ( obj.inRepo() )
+ str << obj.inRepo();
+
+ str << '<' << obj.inSolvAttr()
+ << ">(" << obj.solvAttrType() << ") = " << obj.asString();
return str;
}
Modified: trunk/libzypp/zypp/sat/LookupAttr.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/LookupAttr.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/sat/LookupAttr.h (original)
+++ trunk/libzypp/zypp/sat/LookupAttr.h Mon Apr 7 19:37:16 2008
@@ -20,6 +20,7 @@
#include "zypp/base/PtrTypes.h"
#include "zypp/base/DefaultIntegral.h"
+
#include "zypp/sat/Pool.h"
///////////////////////////////////////////////////////////////////
@@ -33,17 +34,40 @@
//
// CLASS NAME : LookupAttr
//
- /** Lightweight attribute lookup.
+ /** Lightweight attribute value lookup.
*
- * Search for an attribute \ref Pool, one \ref Repository or
- * one \ref Solvable. \ref LookupAttr builds the query,
+ * Search for an attribute in \ref Pool, one \ref Repository
+ * or one \ref Solvable. \ref LookupAttr builds the query,
* \ref LookupAttr::iterator iterates over the result.
*
* Modifying the query will not affect any running
* iterator.
*
* Use \ref SolvAttr::allAttr to search all attributes.
- */
+ *
+ * \code
+ * // look for all attributes of one solvable
+ * void ditest( sat::Solvable slv_r )
+ * {
+ * sat::LookupAttr q( sat::SolvAttr::allAttr, slv_r );
+ * MIL << q << ": " << endl;
+ * for_( it, q.begin(), q.end() )
+ * {
+ * MIL << " " << it.inSolvAttr() << " = " << it.asString() << endl;
+ * }
+ * }
+ * \endcode
+ *
+ * \code
+ * // look for an attribute in the pool.
+ * sat::LookupAttr q( sat::SolvAttr("susetags:datadir") );
+ * MIL << q << ": " << endl;
+ * for_( it, q.begin(), q.end() )
+ * {
+ * MIL << " " << it << endl;
+ * }
+ * \endcode
+ */
class LookupAttr
{
public:
@@ -77,7 +101,13 @@
/** Iterator behind the end of query results. */
iterator end() const;
+ /** Whether the query is empty. */
+ bool empty() const;
+
+ /** TransformIterator returning an \ref iterator vaue of type \c _ResultT. */
+ template class transformIterator;
//@}
+
public:
/** \name What to search. */
//@{
@@ -192,46 +222,74 @@
/** The current \ref SolvAttr. */
SolvAttr inSolvAttr() const;
+ //@}
+ /** \name Test attribute value type. */
+ //@{
/** The current \ref SolvAttr type. */
detail::IdType solvAttrType() const;
+
+ /** Whether this is a numeric attribute (incl. boolean). */
+ bool solvAttrNumeric() const;
+
+ /** Whether this is a string attribute. */
+ bool solvAttrString() const;
+
+ /** *Whether this string attribute is available as \ref IdString. */
+ bool solvAttrIdString() const;
+
+ /** Whether this is a CheckSum attribute.*/
+ bool solvAttrCheckSum() const;
//@}
/** \name Retrieving attribute values. */
//@{
+ /** Conversion to numeric types. */
+ int asInt() const;
+ /** \overload */
+ unsigned asUnsigned() const;
+ /** \overload */
+ bool asBool() const;
+
+ /** Conversion to string types. */
+ const char * c_str() const;
+ /** \overload
+ * If used with non-string types, this method tries to create
+ * some appropriate string representation.
+ */
+ std::string asString() const;
+
+ /** As \ref IdStr.
+ * This is only done for poolized string types. Large strings like
+ * summary or descriptions are not available via \ref IdStr, only
+ * via \ref c_str and \ref asString.
+ */
+ IdString idStr() const;
+
+ /** As \ref CheckSum. */
+ CheckSum asCheckSum() const;
+
+ /** Templated return type.
+ * Specialized for supported types.
+ */
+ template<class _Tp> _Tp asType() const;
//@}
+
///////////////////////////////////////////////////////////////////
// internal stuff below
///////////////////////////////////////////////////////////////////
public:
- iterator()
- : iterator_adaptor_( 0 )
- {}
+ iterator();
- iterator( const iterator & rhs )
- : iterator_adaptor_( cloneFrom( rhs.base() ) )
- , _dip( base() )
- {}
+ iterator( const iterator & rhs );
- iterator & operator=( const iterator & rhs )
- {
- if ( &rhs != this )
- {
- _dip.reset( cloneFrom( rhs.base() ) );
- base_reference() = _dip.get();
- }
- return *this;
- }
+ iterator & operator=( const iterator & rhs );
+
+ ~iterator();
private:
friend class LookupAttr;
- iterator( scoped_ptr< ::_Dataiterator> & dip_r, bool chain_r )
- : iterator_adaptor_( dip_r.get() )
- , _chainRepos( chain_r )
- {
- _dip.swap( dip_r ); // take ownership!
- increment();
- }
+ iterator( scoped_ptr< ::_Dataiterator> & dip_r, bool chain_r );
::_Dataiterator * cloneFrom( const ::_Dataiterator * rhs );
@@ -264,6 +322,178 @@
/** \relates LookupAttr::iterator Stream output. */
std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj );
+ template<> inline int LookupAttr::iterator::asType<int>() const { return asInt(); }
+ template<> inline unsigned LookupAttr::iterator::asType<unsigned>() const { return asUnsigned(); }
+ template<> inline bool LookupAttr::iterator::asType<bool>() const { return asBool(); }
+ template<> inline const char * LookupAttr::iterator::asType() const { return c_str(); }
+ template<> inline std::string LookupAttr::iterator::asTypestd::string() const { return asString(); }
+ template<> inline IdString LookupAttr::iterator::asType<IdString>() const { return idStr(); }
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : LookupAttr::transformIterator
+ //
+ /** TransformIterator returning an \ref iterator value of type \c _ResultT.
+ *
+ * The underlying LookupAttr::iterators value is retrieved \ref asType<_AttrT>
+ * and the returned \ref ResultT is constructed fron that value.
+ *
+ * \code
+ * class Keywords
+ * {
+ * public:
+ * Keywords( sat::Solvable solv_r )
+ * : _q( sat::SolvAttr::keywords, solv_r )
+ * {}
+ *
+ * public:
+ * typedef sat::LookupAttr::transformIterator iterator;
+ *
+ * iterator begin() const { return iterator( _q.begin() ); }
+ * iterator end() const { return iterator( _q.end() ); }
+ *
+ * private:
+ * sat::LookupAttr _q;
+ * };
+ * \endcode
+ *
+ * \see \ref ArrayAttr.
+ */
+ template
+ class LookupAttr::transformIterator : public boost::iterator_adaptor<
+ transformIterator<_ResultT,_AttrT> // Derived
+ , LookupAttr::iterator // Base
+ , _ResultT // Value
+ , boost::forward_traversal_tag // CategoryOrTraversal
+ , _ResultT // Reference
+ >
+ {
+ public:
+ transformIterator()
+ {}
+
+ explicit
+ transformIterator( const LookupAttr::iterator & val_r )
+ { this->base_reference() = val_r; }
+
+ public:
+
+ /** \name Moving fast forward. */
+ //@{
+ /** On the next call to \ref operator++ advance to the next \ref SolvAttr. */
+ void nextSkipSolvAttr()
+ { this->base_reference().nextSkipSolvAttr(); }
+
+ /** On the next call to \ref operator++ advance to the next \ref Solvable. */
+ void nextSkipSolvable()
+ { this->base_reference().nextSkipSolvable(); }
+
+ /** On the next call to \ref operator++ advance to the next \ref Repository. */
+ void nextSkipRepo()
+ { this->base_reference().nextSkipRepo(); }
+
+ /** Immediately advance to the next \ref SolvAttr. */
+ void skipSolvAttr()
+ { this->base_reference().skipSolvAttr(); }
+
+ /** Immediately advance to the next \ref Solvable. */
+ void skipSolvable()
+ { this->base_reference().skipSolvable(); }
+
+ /** Immediately advance to the next \ref Repository. */
+ void skipRepo()
+ { this->base_reference().skipRepo(); }
+ //@}
+
+ /** \name Current position info. */
+ //@{
+ /** The current \ref Repository. */
+ Repository inRepo() const
+ { return this->base_reference().inRepo(); }
+
+ /** The current \ref Solvabele. */
+ Solvable inSolvable() const
+ { return this->base_reference().inSolvable(); }
+
+ /** The current \ref SolvAttr. */
+ SolvAttr inSolvAttr() const
+ { return this->base_reference().inSolvAttr(); }
+ //@}
+
+ private:
+ friend class boost::iterator_core_access;
+
+ _ResultT dereference() const
+ {
+ const LookupAttr::iterator lit( this->base_reference() );
+ return _ResultT( lit.asType<_AttrT>() );
+ }
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ template
+ class ArrayAttr;
+
+ template
+ std::ostream & operator<<( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj );
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : ArrayAttr
+ //
+ /** \ref LookupAttr::transformIterator based container to retrieve list attributes.
+ *
+ * \code
+ * typedef ArrayAttr Keywords;
+ * Keywords k( sat::SolvAttr::keywords );
+ * dumpRange( MIL << "All Keywords: ", k.begin(), k.end() ) << endl;
+ * \endcode
+ *
+ * \todo Maybe add some way to unify the result.
+ */
+ template
+ class ArrayAttr
+ {
+ friend std::ostream & operator<< <_ResultT,_AttrT>( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj );
+
+ public:
+ ArrayAttr()
+ {}
+
+ ArrayAttr( SolvAttr attr_r )
+ : _q( attr_r )
+ {}
+
+ ArrayAttr( SolvAttr attr_r, Repository repo_r )
+ : _q( attr_r, repo_r )
+ {}
+
+ ArrayAttr( SolvAttr attr_r, Solvable solv_r )
+ : _q( attr_r, solv_r )
+ {}
+
+ public:
+ typedef sat::LookupAttr::transformIterator<_ResultT,_AttrT> iterator;
+
+ iterator begin() const
+ { return iterator( _q.begin() ); }
+
+ iterator end() const
+ { return iterator( _q.end() ); }
+
+ bool empty() const
+ { return _q.empty(); }
+
+ private:
+ sat::LookupAttr _q;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /** \relates LookupAttr::iterator Stream output. */
+ template
+ inline std::ostream & operator<<( std::ostream & str, const ArrayAttr<_ResultT,_AttrT> & obj )
+ { return dumpOn( str, obj._q); }
+
/////////////////////////////////////////////////////////////////
} // namespace sat
///////////////////////////////////////////////////////////////////
Modified: trunk/libzypp/zypp/sat/Pool.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/Pool.cc?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/sat/Pool.cc (original)
+++ trunk/libzypp/zypp/sat/Pool.cc Mon Apr 7 19:37:16 2008
@@ -26,6 +26,7 @@
#include "zypp/sat/detail/PoolImpl.h"
#include "zypp/sat/Pool.h"
+#include "zypp/sat/LookupAttr.h"
///////////////////////////////////////////////////////////////////
namespace zypp
Modified: trunk/libzypp/zypp/sat/Solvable.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/sat/Solvable.h?rev=9438&r1=9437&r2=9438&view=diff
==============================================================================
--- trunk/libzypp/zypp/sat/Solvable.h (original)
+++ trunk/libzypp/zypp/sat/Solvable.h Mon Apr 7 19:37:16 2008
@@ -86,6 +86,11 @@
public:
+ /** \name Attribute lookup.
+ * \see \ref LookupAttr and \ref ArrayAttr providing a general, more
+ * query like interface for attribute retrieval.
+ */
+ //@{
/**
* returns the string attribute value for \ref attr
* or an empty string if it does not exists.
@@ -121,8 +126,6 @@
*/
detail::IdType lookupIdAttribute( const SolvAttr & attr ) const;
-
-
/**
* returns the CheckSum attribute value for \ref attr
* or an empty CheckSum if ir does not exist.
@@ -135,6 +138,7 @@
*/
OnMediaLocation lookupLocation() const;
+ //@}
public:
/** The identifier.
* This is the solvables \ref name, \b except for packages and
@@ -177,7 +181,7 @@
/** Returns true if the solvable is satisfied */
bool isSatisfied() const;
/** Returns true if the solvable is satisfied */
- bool isBroken() const { return !isSatisfied(); }
+ bool isBroken() const { return !isSatisfied(); }
public:
/** \name Locale support. */
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org