dependencyManager.h

Go to the documentation of this file.
00001 /* -*- Mode:c++ -*- */
00002 /*
00003  *  this is part of Spm
00004  *
00005  *  Copyright (c) 2008 Guillaume Chevallereau
00006  *
00007  *  This program is free software. You can redistribute it and/or modify it 
00008  *  under the terms of the GNU General Public License as published by the 
00009  *  Free Software Foundation. Either version 2 of the license or (at your 
00010  *  option) any later version.
00011  *
00012  *  This program is distributed in the hope that it will be usefull but WITHOUT
00013  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
00014  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
00015  *  more details.
00016  *
00017  *  You should have received a copy of the GNU General Public License along 
00018  *  with this program; if not, write to the Free Software Foundation, Inc., 
00019  *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
00020  */
00021 #ifndef __DEPENDENCY_MANAGER_H__
00022 #define __DEPENDENCY_MANAGER_H__
00023 
00024 #include <boost/shared_ptr.hpp>
00025 #include <boost/utility.hpp>
00026 #include "installedVersion.h"
00027 #include "package.h"
00028 #include "store.h"
00029 
00030 namespace Spm
00031 {
00032   namespace Core
00033   {
00034     class Dependency : public Util::Object
00035     {
00036       InstalledVersion * package_;
00037       std::vector<InstalledVersion *> packagesNeeded_;
00038     public:
00039       typedef std::vector<InstalledVersion *>::iterator iterator;
00040       typedef std::vector<InstalledVersion *>::const_iterator const_iterator;
00041       typedef std::vector<InstalledVersion *>::reverse_iterator reverse_iterator;
00042       typedef std::vector<InstalledVersion *>::const_reverse_iterator const_reverse_iterator;
00043 
00044       Dependency (InstalledVersion * package);
00045       void reference (InstalledVersion * package);
00046       void unReference (InstalledVersion * package);
00047       
00048       inline bool empty()
00049       {
00050         return packagesNeeded_.empty ();
00051       }
00052       
00053       inline size_t size ()
00054       {
00055         return packagesNeeded_.size ();
00056       }
00057       
00058       inline InstalledVersion * getDependentPackage ()
00059       {
00060         return package_;
00061       }
00062       
00063       inline const InstalledVersion * getDependentPackage () const
00064       {
00065         return package_;
00066       }
00067       
00068       inline std::vector<InstalledVersion *> & getNeededPackage ()
00069       {
00070         return packagesNeeded_;
00071       }
00072         
00073       bool dependOn (const InstalledVersion * package);
00074       bool dependOn (const miniXml::ustring & package,
00075                      const miniXml::ustring & version);
00076 
00077       inline iterator begin ()
00078       {
00079         return packagesNeeded_.begin ();
00080       }
00081 
00082       inline const_iterator begin () const
00083       {
00084         return packagesNeeded_.begin ();
00085       }
00086 
00087       inline reverse_iterator rbegin ()
00088       {
00089         return packagesNeeded_.rbegin ();
00090       }
00091 
00092       inline const_reverse_iterator rbegin () const
00093       {
00094         return packagesNeeded_.rbegin ();
00095       }
00096 
00097       inline iterator end ()
00098       {
00099         return packagesNeeded_.end ();
00100       }
00101 
00102       inline const_iterator end () const
00103       {
00104         return packagesNeeded_.end ();
00105       }
00106 
00107       inline reverse_iterator rend ()
00108       {
00109         return packagesNeeded_.rend ();
00110       }
00111 
00112       inline const_reverse_iterator rend () const
00113       {
00114         return packagesNeeded_.rend ();
00115       }
00116     };
00117 
00118     class DependencyManager : public boost::noncopyable
00119     {
00120     public:
00121       friend class PackageManager;
00122       friend class DependencyManagerStore;
00123       typedef std::vector<Dependency *>::iterator iterator;
00124       typedef std::vector<Dependency *>::reverse_iterator reverse_iterator;
00125       typedef std::vector<Dependency *>::const_iterator const_iterator;
00126       typedef std::vector<Dependency *>::const_reverse_iterator const_reverse_iterator;
00127 
00128       struct objectModified : public std::binary_function<Util::Object *,
00129                                                           miniXml::ustring,
00130                                                           void>
00131       {
00132         void operator () (Util::Object * object,
00133                           const miniXml::ustring & user) const;
00134       };
00135     private:
00136       static std::map<miniXml::ustring,
00137                       boost::shared_ptr<DependencyManager> > instances_;
00138       DependencyManagerStore * dependencyStore_;
00139       miniXml::ustring user_;
00140       DependencyManager (const miniXml::ustring & user);
00141       std::vector<Dependency *> dependencys_;
00142 
00143       void reference (InstalledVersion * installed,
00144                       InstalledVersion * depend);
00145       void unreference (InstalledVersion * installed,
00146                         InstalledVersion * depend);
00147       void remove (Versionned * v);
00148       void remove (Branch * v);
00149       void remove (Element * v);
00150     public:
00151       static boost::shared_ptr<DependencyManager> & create (const miniXml::ustring & user);
00152       ~DependencyManager ();
00153       bool isNeeded (const InstalledVersion * installed);
00154       std::vector<InstalledVersion *> & getDependency (const InstalledVersion * installed);
00155       std::vector<InstalledVersion *> neededBy (const InstalledVersion * installed);
00156       inline iterator begin ()
00157       {
00158         return dependencys_.begin ();
00159       }
00160 
00161       inline const_iterator begin () const
00162       {
00163         return dependencys_.begin ();
00164       }
00165 
00166       inline reverse_iterator rbegin ()
00167       {
00168         return dependencys_.rbegin ();
00169       }
00170 
00171       inline const_reverse_iterator rbegin () const
00172       {
00173         return dependencys_.rbegin ();
00174       }
00175 
00176       inline iterator end ()
00177       {
00178         return dependencys_.end ();
00179       }
00180 
00181       inline const_iterator end () const
00182       {
00183         return dependencys_.end ();
00184       }
00185 
00186       inline reverse_iterator rend ()
00187       {
00188         return dependencys_.rend ();
00189       }
00190 
00191       inline const_reverse_iterator rend () const
00192       {
00193         return dependencys_.rend ();
00194       }
00195 
00196       inline const miniXml::ustring & user ()
00197       {
00198         return user_;
00199       }
00200     };
00201   }
00202 }
00203 
00204 #endif

Generated on Sat Mar 21 17:00:14 2009 for libSpm by  doxygen 1.5.2