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