packagedep.h

00001 
00002 // Name:        packagedep.h
00003 // Purpose:     wxPackageDependency, wxPackageDependencyArray
00004 // Author:      Francesco Montorsi
00005 // Modified by:
00006 // Created:     2006-06-29
00007 // RCS-ID:      $Id: packagedep.h,v 1.1.1.1 2006/12/12 09:40:57 frm Exp $
00008 // Copyright:   (c) Francesco Montorsi
00009 // Licence:     wxWidgets licence
00011 
00012 #ifndef _PACKAGEDEP_H_
00013 #define _PACKAGEDEP_H_
00014 
00015 // Includes
00016 #include "wx/tokenzr.h"
00017 #include "wxp/wxputils.h"
00018 #include "wxp/compiler.h"
00019 #include "wxp/wxbuild.h"
00020 #include "wxp/packageutils.h"
00021 
00022 class wxPackageId;
00023 class wxPackageIdArray;
00024 class wxPackageDependency;
00025 class wxPackageDependencyArray;
00026 
00027 extern wxPackageDependency wxEmptyPackageDependency;
00028 extern wxPackageDependencyArray wxEmptyPackageDependencyArray;
00029 
00030 
00031 // ----------------------------------------------------------------------------
00032 // enums
00033 // ----------------------------------------------------------------------------
00034 
00036 enum wxPackageDependencyType
00037 {
00038     wxPDT_INVALID = -1,
00039 
00040     wxPDT_REQUIRED,
00041     wxPDT_SUGGESTED,
00042 
00043     wxPDT_MAX
00044 };
00045 
00046 wxDEFINE_STRING2ENUM(PackageDependencyType)
00047 
00048 
00049 
00050 // ----------------------------------------------------------------------------
00051 // wxPackageDependency
00052 // ----------------------------------------------------------------------------
00053 
00054 
00055 
00056 class wxPackageDependency : public wxObject
00057 {
00058     friend class wxPackageDependencyArray;
00059     DECLARE_DYNAMIC_CLASS(wxPackageDependency)
00060 
00061 public:
00062     wxPackageDependency() { m_nType=wxPDT_INVALID; }
00063     wxPackageDependency(
00064              const wxString &name,
00065              const wxVersionRange &version,
00066              const wxString &href = wxEmptyString,
00067              wxPackageDependencyType type = wxPDT_REQUIRED,
00068              const wxPackageIdArray &owners = wxEmptyPackageIdArray)
00069              : m_nType(type),
00070                m_strResolutionHref(href),
00071                m_strName(name), m_version(version),
00072                m_owners(owners) {}
00073     virtual ~wxPackageDependency() {}
00074 
00075 
00076     bool operator==(const wxPackageDependency &dep) const
00077     {
00078         return m_strName.CmpNoCase(dep.m_strName) == 0 &&
00079                m_strResolutionHref == dep.m_strResolutionHref &&
00080                m_nType == dep.m_nType &&
00081                m_version == dep.m_version;
00082     }
00083 
00084     bool operator!=(const wxPackageDependency &dep) const
00085         { return !(*this == dep); }
00086 
00087 
00088 public:     // getters
00089 
00090     wxString GetName() const
00091         { return m_strName; }
00092     wxVersionRange GetVersion() const
00093         { return m_version; }
00094     wxString GetResolutionHref() const
00095         { return m_strResolutionHref; }
00096 
00097     wxPackageDependencyType GetType() const
00098         { return m_nType; }
00099     wxString GetTypeStr() const
00100         { return wxPackageDependencyType2String(GetType()); }
00101 
00102     wxPackageIdArray GetOwnersId() const
00103         { return m_owners; }
00104 
00105     wxString GetOwnersIdStr() const
00106     {
00107         wxString own;
00108         for (size_t j=0; j<m_owners.GetCount(); j++)
00109             own += m_owners[j].GetName() + wxT(",");
00110         own.RemoveLast();
00111         return own;
00112     }
00113 
00114 public:     // setters
00115 
00116     void SetName(const wxString &name)
00117         { m_strName=name; }
00118     void SetVersion(const wxVersionRange &ver)
00119         { m_version=ver; }
00120     void SetResolutionHref(const wxString &href)
00121         { m_strResolutionHref=href; }
00122     void SetType(wxPackageDependencyType t)
00123         { m_nType=t; }
00124     void SetOwnersId(const wxPackageIdArray &id)
00125         { m_owners=id; }
00126 
00127     void AddOwnerId(const wxPackageId &id)
00128         { m_owners.Add(id); }
00129     void SetOwnerId(const wxPackageId &id)
00130         { m_owners.Clear(); m_owners.Add(id); }
00131 
00132 public:    // misc
00133 
00134     bool IsOk() const
00135     {
00136         return m_nType != wxPDT_INVALID &&
00137                !m_strName.IsEmpty() &&
00138                !m_strName.Contains(wxT(' ')) &&
00139                m_version.IsOk();
00140     }
00141 
00142     bool IsPartiallySatisfiedBy(const wxString &pkgname) const
00143         { return GetName().CmpNoCase(pkgname) == 0; }
00144 
00145     bool IsSatisfiedBy(const wxPackageId &pkg) const;
00146     bool IsSatisfiedByOneOf(const wxPackageArray &arr) const;
00147 
00155     int GetBestMatch(const wxPackageArray &arr) const;
00156 
00157 protected:          // internal utilities
00158 
00161     bool DoGetRecursiveDependencies(
00162                     wxPackageDependencyArray *ret,
00163                     const wxPackageArray &arr,
00164                     wxPackageDependencyType type,
00165                     wxPackageDependencyArray *notfound,
00166                     wxPackageIdArray *alreadyprocessed) const;
00167 
00168 protected:
00169     wxPackageDependencyType m_nType;
00170     wxString m_strResolutionHref;
00171 
00172     // cannot use a wxPackageId here as we need a wxVersionRange here
00173     wxString m_strName;
00174     wxVersionRange m_version;
00175 
00180     wxPackageIdArray m_owners;
00181 };
00182 
00183 // the array
00184 WX_DECLARE_OBJARRAY(wxPackageDependency, wxPackageDependencyArrayHelper);
00185 
00186 
00187 
00188 // ----------------------------------------------------------------------------
00189 // wxPackageDependencyArray
00190 // ----------------------------------------------------------------------------
00191 
00192 class wxPackageDependencyArray : public wxPackageDependencyArrayHelper
00193 {
00194     // required to get access to DoGetRecursiveDependency
00195     friend class wxPackage;
00196 
00197 public:
00198 
00200     wxPackageDependencyArray() {}
00201 
00202 public:
00203 
00205     bool IsOk() const
00206     {
00207         for (size_t i=0; i<GetCount(); i++)
00208             if (!Item(i).IsOk())
00209                 return false;
00210         return true;
00211     }
00212 
00214     int IndexById(const wxPackageId &id) const
00215     {
00216         for (size_t i=0; i<GetCount(); i++)
00217             if (Item(i).IsSatisfiedBy(id))
00218                 return i;
00219         return wxNOT_FOUND;
00220     }
00221 
00222     wxPackageDependency &ItemById(const wxPackageId &id)
00223     {
00224         int n = IndexById(id);
00225         if (n != wxNOT_FOUND)
00226             return wxPackageDependencyArrayHelper::Item(n);
00227         return wxEmptyPackageDependency;
00228     }
00229 
00231     int IndexByName(const wxString &id) const
00232     {
00233         for (size_t i=0; i<GetCount(); i++)
00234             if (Item(i).IsPartiallySatisfiedBy(id))
00235                 return i;
00236         return wxNOT_FOUND;
00237     }
00238 
00239     wxPackageDependency &ItemByName(const wxString &id)
00240     {
00241         int n = IndexByName(id);
00242         if (n != wxNOT_FOUND)
00243             return wxPackageDependencyArrayHelper::Item(n);
00244         return wxEmptyPackageDependency;
00245     }
00246 
00247     // need to redefine Index() so that it uses the operator== of our items
00248     // (NB: wxObjArray never uses the item's comparison operator!)
00249     int Index(const wxPackageDependency &dep) const
00250     {
00251         for (size_t i=0; i<GetCount(); i++)
00252             if (Item(i) == dep)
00253                 return i;
00254         return wxNOT_FOUND;
00255     }
00256 
00257     bool Contains(const wxPackageDependency &dep) const
00258         { return Index(dep) != wxNOT_FOUND; }
00259     bool ContainsDependencyFrom(const wxPackageId &id) const
00260         { return IndexById(id) != wxNOT_FOUND; }
00261     bool ContainsDependencyNamed(const wxString &pkgname) const
00262         { return IndexByName(pkgname) != wxNOT_FOUND; }
00263 
00264     void Dump()
00265     {
00266         for (size_t i=0; i<GetCount(); i++)
00267             wxLogDebug(wxT("%s %s"), Item(i).GetName().c_str(),
00268                        Item(i).GetVersion().GetAsString().c_str());
00269     }
00270 /*
00271     void MergeWith(const wxPackageDependencyArray &arr)
00272     {
00273         for (size_t i=0; i<arr.GetCount(); i++)
00274             MergeWith(arr[i]);
00275     }
00276 
00277     void MergeWith(const wxPackageDependency &dep)
00278     {
00279         if (Contains(dep))
00280             return;
00281         Add(dep);
00282     }
00283 
00284     TOREMOVE
00285 */
00286 public:     // getters
00287 
00289     wxPackageDependencyArray GetDependenciesOfType(wxPackageDependencyType) const;
00290 
00292     wxPackageDependencyArray GetDependenciesAvailableIn(const wxPackageArray &arr) const;
00293 
00295     wxPackageDependencyArray GetDependenciesNotAvailableIn(const wxPackageArray &arr) const;
00296 
00298     wxPackageDependencyArray GetConflictingDependencies() const;
00299 
00300 protected:          // internal utilities
00301 
00303     bool DoGetRecursiveDependencies(
00304                     wxPackageDependencyArray *ret,
00305                     const wxPackageArray &arr,
00306                     wxPackageDependencyType type,
00307                     wxPackageDependencyArray *notfound,
00308                     wxPackageIdArray *alreadyprocessed) const;
00309 };
00310 
00311 
00312 #endif      // _PACKAGEDEP_H_
00313 

Generated on Thu Feb 1 22:14:31 2007 for wxWidgets Package Manager by  doxygen 1.5.1-p1