are a in fact a subset of requires.
- Updated examples to use NVRAD to construct Resolvables.
{
INT << "===[START]==========================================" << endl;
- // parse basic values
- std::string _name( "foo" );
- Edition _edition( "1.0", "42" );
- Arch _arch( "i386" );
-
- // create the object
- shared_ptr<detail::PackageImpl> pkgImpl;
- Package::Ptr pkg( detail::makeResolvableAndImpl( _name, _edition, _arch,
- pkgImpl ) );
- DBG << *pkg << endl;
- DBG << pkg->deps() << endl;
+ // Collect basic Resolvable data
+ NVRAD dataCollect;
- // finalize implementation class construction
- Dependencies _deps;
+ // parse basic values
+ dataCollect.name = "foo";
+ dataCollect.edition = Edition("1.0","42");
+ dataCollect.arch = Arch_i386;
+ // parse dependencies
std::list<std::string> depList( parseDeps() );
- CapSet prv;
try
{
- for_each( depList.begin(), depList.end(), CapSetInsert<Package>(prv) );
+ for_each( depList.begin(), depList.end(),
+ CapSetInsert<Package>(dataCollect.provides) );
}
catch(...)
{
- INT << prv << endl;
+ INT << dataCollect.provides << endl;
}
- _deps.setProvides( prv );
-
// ...parse other deps
- pkgImpl->self()->setDeps( _deps );
- // ... aditional data if...
+ // create the object
+ shared_ptr<detail::PackageImpl> pkgImpl;
+ Package::Ptr pkg( detail::makeResolvableAndImpl( dataCollect, pkgImpl ) );
+ DBG << *pkg << endl;
+ DBG << pkg->deps() << endl;
+
+
+ // finalize implementation class construction
+ // ... aditional data ...
DBG << pkg << endl;
DBG << *pkg << endl;
//
// CLASS NAME : NVRAD
//
- /** Helper storing Name, Edition, Arch and Dependencies. */
- struct NVRAD : public NVRA
+ /** Helper storing Name, Edition, Arch and Dependencies.
+ */
+ struct NVRAD : public NVRA, public Dependencies
{
/** Default ctor */
NVRAD()
const Arch & arch_r = Arch(),
const Dependencies & deps_r = Dependencies() )
: NVRA( name_r, edition_r, arch_r )
- , deps( deps_r )
+ , Dependencies( deps_r )
{}
/** Ctor */
NVRAD( const NVRA & nvra_r,
const Dependencies & deps_r = Dependencies() )
: NVRA( nvra_r )
- , deps( deps_r )
+ , Dependencies( deps_r )
{}
/** Ctor */
const Arch & arch_r = Arch(),
const Dependencies & deps_r = Dependencies() )
: NVRA( nvr_r, arch_r )
- , deps( deps_r )
+ , Dependencies( deps_r )
{}
-
- /** */
- Dependencies deps;
};
///////////////////////////////////////////////////////////////////
const CapSet & Resolvable::freshens() const
{ return _pimpl->deps().freshens; }
-#warning IMPLEMENT IT
+ const Dependencies & Resolvable::deps() const
+ { return _pimpl->deps(); }
+
+
void Resolvable::injectProvides( const Capability & cap_r )
- {}
+ { return _pimpl->injectProvides( cap_r ); }
+
void Resolvable::injectRequires( const Capability & cap_r )
- {}
+ { return _pimpl->injectRequires( cap_r ); }
+
void Resolvable::deprecatedSetDeps( const Dependencies & val_r )
- { _pimpl->setDeps( val_r ); }
+ { _pimpl->deprecatedSetDeps( val_r ); }
+
/////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
// CLASS NAME : Resolvable
//
/** Interface base for resolvable objects (identification and dependencies).
+ * \invariant \c provides <tt>name = edition</tt>
+ * \invariant \c prerequires is a subset of \c requires
*/
class Resolvable : public base::ReferenceCounted, private base::NonCopyable
{
const CapSet & recommends() const;
const CapSet & suggests() const;
const CapSet & freshens() const;
+ /** All dependencies. */
+ const Dependencies & deps() const;
//@}
- /** */
+ /** \name Deprecated. */
+ //@{
void deprecatedSetDeps( const Dependencies & val_r );
void injectProvides( const Capability & cap_r );
void injectRequires( const Capability & cap_r );
+ //@}
protected:
/** Ctor */
template<class _Impl>
typename _Impl::ResType::Ptr
- makeResolvableAndImpl( const std::string & name_r,
- const Edition & edition_r,
- const Arch & arch_r,
- shared_ptr<_Impl> & impl_r )
- {
- return makeResolvableAndImpl( NVRAD( name_r, edition_r, arch_r ), impl_r );
- }
-
- template<class _Impl>
- typename _Impl::ResType::Ptr
makeResolvableFromImpl( const NVRAD & nvrad_r,
shared_ptr<_Impl> impl_r )
{
( nvrad_r, impl_r );
}
- template<class _Impl>
- typename _Impl::ResType::Ptr
- makeResolvableFromImpl( const std::string & name_r,
- const Edition & edition_r,
- const Arch & arch_r,
- shared_ptr<_Impl> impl_r )
- {
- return makeResolvableFromImpl( NVRAD( name_r, edition_r, arch_r ), impl_r );
- }
-
/////////////////////////////////////////////////////////////////
} // namespace detail
///////////////////////////////////////////////////////////////////
#define ZYPP_DETAIL_RESOLVABLEIMPL_H
#include "zypp/Resolvable.h"
+#include "zypp/CapFactory.h"
#include "zypp/NVRAD.h"
///////////////////////////////////////////////////////////////////
// CLASS NAME : Resolvable::Impl
//
/** Implementation of Resovable
- * \todo Assert \c deps provide 'name=edition'.
+ * \invariant \c provides <tt>name = edition</tt>
+ * \invariant \c prerequires is a subset of \c requires
*/
struct Resolvable::Impl
{
, _name( nvrad_r.name )
, _edition( nvrad_r.edition )
, _arch( nvrad_r.arch )
- , _deps( nvrad_r.deps )
- {}
+ , _deps( nvrad_r )
+ {
+ // assert self provides
+ _deps.provides.insert( CapFactory()
+ .parse( _kind, _name, Rel::EQ, _edition ) );
+ // assert all prerequires are in requires too
+ _deps.requires.insert( _deps.prerequires.begin(),
+ _deps.prerequires.end() );
+ }
public:
/** */
const Dependencies & deps() const
{ return _deps; }
- /** Set Dependencies.
- * \todo Check whether we can allow changes after final construction
- */
- void setDeps( const Dependencies & val_r )
- { _deps = val_r; }
+ /** \name Deprecated. */
+ //@{
+ void deprecatedSetDeps( const Dependencies & val_r )
+ {
+ _deps = val_r;
+ // assert self provides
+ _deps.provides.insert( CapFactory()
+ .parse( _kind, _name, Rel::EQ, _edition ) );
+ // assert all prerequires are in requires too
+ _deps.requires.insert( _deps.prerequires.begin(),
+ _deps.prerequires.end() );
+ }
+ void injectProvides( const Capability & cap_r )
+ { _deps.provides.insert( cap_r ); }
+ void injectRequires( const Capability & cap_r )
+ { _deps.requires.insert( cap_r ); }
+ //@}
private:
/** */
setChannel (channel);
shared_ptr<zypp::detail::PackageImpl> pkgImpl;
- zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( name, edition, arch,
+ zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( NVRAD(name, edition, arch),
pkgImpl ) );
_resObject = pkg;
}
Edition _edition( version, release, zypp::str::numstring(epoch) );
shared_ptr<zypp::detail::PackageImpl> pkgImpl;
- zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
pkgImpl ) );
_resObject = pkg;
}
if (kind == "Package")
{
shared_ptr<zypp::detail::PackageImpl> pkgImpl;
- zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Package::Ptr pkg( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
pkgImpl ) );
_resObject = pkg;
} else if (kind == "Selection")
{
shared_ptr<zypp::detail::SelectionImpl> selImpl;
- zypp::Selection::Ptr sel( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Selection::Ptr sel( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
selImpl ) );
_resObject = sel;
} else if (kind == "Product")
{
// shared_ptr<zypp::detail::ProductImpl> proImpl;
-// zypp::Product::Ptr pro( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+// zypp::Product::Ptr pro( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
// proImpl ) );
// _resObject = pro;
} else if (kind == "Patch")
{
shared_ptr<zypp::detail::PatchImpl> patchImpl;
- zypp::Patch::Ptr patch( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Patch::Ptr patch( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
patchImpl ) );
_resObject = patch;
} else if (kind == "Script")
{
shared_ptr<zypp::detail::ScriptImpl> scriptImpl;
- zypp::Script::Ptr script( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Script::Ptr script( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
scriptImpl ) );
_resObject = script;
} else if (kind == "Message")
{
shared_ptr<zypp::detail::MessageImpl> messageImpl;
- zypp::Message::Ptr message( zypp::detail::makeResolvableAndImpl( name, _edition, arch,
+ zypp::Message::Ptr message( zypp::detail::makeResolvableAndImpl( NVRAD(name, _edition, arch),
messageImpl ) );
_resObject = message;
}
try
{
shared_ptr<YUMGroupImpl> impl(new YUMGroupImpl(parsed));
- Selection::Ptr group = detail::makeResolvableFromImpl(
- parsed.groupId,
- Edition::noedition,
- Arch_noarch,
- impl
+ // Collect basic Resolvable data
+ NVRAD dataCollect( parsed.groupId,
+ Edition::noedition,
+ Arch_noarch
+ );
+ Selection::Ptr group = detail::makeResolvableFromImpl(
+ dataCollect, impl
);
return group;
}
iter->tag_arch() );
list<string> filenames = impl->filenames();
- dataCollect.deps.provides = iter->tag_provides ( & _filerequires );
+ dataCollect.provides = iter->tag_provides ( & _filerequires );
for (list<string>::const_iterator filename = filenames.begin();
filename != filenames.end();
filename++)
|| filename->find("/usr/share/magic.mime")
|| filename->find("/opt/gnome/games"))
{
- dataCollect.deps.provides.insert(_f.parse(ResTraits<Package>::kind, *filename));
+ dataCollect.provides.insert(_f.parse(ResTraits<Package>::kind, *filename));
}
}
- dataCollect.deps.requires = iter->tag_requires ( &_filerequires );
- dataCollect.deps.prerequires = iter->tag_prerequires ( &_filerequires );
- dataCollect.deps.conflicts = iter->tag_conflicts( &_filerequires );
- dataCollect.deps.obsoletes = iter->tag_obsoletes( &_filerequires );
+ dataCollect.requires = iter->tag_requires ( &_filerequires );
+ dataCollect.prerequires = iter->tag_prerequires ( &_filerequires );
+ dataCollect.conflicts = iter->tag_conflicts( &_filerequires );
+ dataCollect.obsoletes = iter->tag_obsoletes( &_filerequires );
// create package from dataprovider
nptr = detail::makeResolvableFromImpl( dataCollect, impl );