- Assert Resolvable provides its 'name=edition', and prerequires
authorMichael Andres <ma@suse.de>
Tue, 10 Jan 2006 14:15:58 +0000 (14:15 +0000)
committerMichael Andres <ma@suse.de>
Tue, 10 Jan 2006 14:15:58 +0000 (14:15 +0000)
  are a in fact a subset of requires.
- Updated examples to use NVRAD to construct Resolvables.

devel/Example.createResolvable.cc
zypp/NVRAD.h
zypp/Resolvable.cc
zypp/Resolvable.h
zypp/detail/ResObjectFactory.h
zypp/detail/ResolvableImpl.h
zypp/solver/temporary/Package.cc
zypp/solver/temporary/ResItem.cc
zypp/source/yum/YUMSource.cc
zypp/target/rpm/RpmDb.cc

index a6467cc..ad0299e 100644 (file)
@@ -59,37 +59,36 @@ int main( int argc, char * argv[] )
 {
   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;
index 715ab30..f28107d 100644 (file)
@@ -23,8 +23,9 @@ namespace zypp
   //
   //   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()
@@ -37,7 +38,7 @@ namespace zypp
            const Arch & arch_r = Arch(),
            const Dependencies & deps_r = Dependencies() )
     : NVRA( name_r, edition_r, arch_r )
-    , deps( deps_r )
+    , Dependencies( deps_r )
     {}
 
     /** Ctor */
@@ -45,7 +46,7 @@ namespace zypp
     NVRAD( const NVRA & nvra_r,
            const Dependencies & deps_r = Dependencies() )
     : NVRA( nvra_r )
-    , deps( deps_r )
+    , Dependencies( deps_r )
     {}
 
     /** Ctor */
@@ -54,11 +55,8 @@ namespace zypp
            const Arch & arch_r = Arch(),
            const Dependencies & deps_r = Dependencies() )
     : NVRA( nvr_r, arch_r )
-    , deps( deps_r )
+    , Dependencies( deps_r )
     {}
-
-    /**  */
-    Dependencies deps;
   };
   ///////////////////////////////////////////////////////////////////
 
index d30fa24..60904fd 100644 (file)
@@ -91,14 +91,20 @@ namespace zypp
   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
 ///////////////////////////////////////////////////////////////////
index e830d04..bb4046c 100644 (file)
@@ -36,6 +36,8 @@ 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
   {
@@ -66,12 +68,16 @@ namespace zypp
     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 */
index f0beb70..8ee3203 100644 (file)
@@ -75,16 +75,6 @@ namespace zypp
 
     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 )
       {
@@ -97,16 +87,6 @@ namespace zypp
                ( 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
   ///////////////////////////////////////////////////////////////////
index 317b478..c9ed1fe 100644 (file)
@@ -13,6 +13,7 @@
 #define ZYPP_DETAIL_RESOLVABLEIMPL_H
 
 #include "zypp/Resolvable.h"
+#include "zypp/CapFactory.h"
 #include "zypp/NVRAD.h"
 
 ///////////////////////////////////////////////////////////////////
@@ -24,7 +25,8 @@ namespace zypp
   //   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
   {
@@ -35,8 +37,15 @@ namespace zypp
     , _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:
     /**  */
@@ -55,11 +64,23 @@ namespace zypp
     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:
     /**  */
index d193e41..4946ee3 100644 (file)
@@ -312,7 +312,7 @@ Package::Package (Channel_constPtr channel,
     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;
 }
@@ -478,7 +478,7 @@ Package::Package (XmlNode_constPtr node, Channel_constPtr channel)
 
     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;
 }
index 248c464..ac2e9f3 100644 (file)
@@ -194,37 +194,37 @@ namespace zypp
           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;
           }
index 056e91b..3df0f4c 100644 (file)
@@ -359,11 +359,13 @@ namespace zypp
          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;
          }
index 199bf6e..ae25864 100644 (file)
@@ -1002,7 +1002,7 @@ const std::list<Package::Ptr> & RpmDb::doGetPackages(ScanDbReport & report)
                        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++)
@@ -1017,14 +1017,14 @@ const std::list<Package::Ptr> & RpmDb::doGetPackages(ScanDbReport & report)
         || 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 );