apt @VERSION@
orderlist.h
00001 // -*- mode: cpp; mode: fold -*-
00002 // Description                                                          /*{{{*/
00003 // $Id: orderlist.h,v 1.9 2001/02/20 07:03:17 jgg Exp $
00004 /* ######################################################################
00005 
00006    Order List - Represents and Manipulates an ordered list of packages.
00007    
00008    A list of packages can be ordered by a number of conflicting criteria
00009    each given a specific priority. Each package also has a set of flags
00010    indicating some useful things about it that are derived in the 
00011    course of sorting. The pkgPackageManager class uses this class for
00012    all of it's installation ordering needs.
00013    
00014    ##################################################################### */
00015                                                                         /*}}}*/
00016 #ifndef PKGLIB_ORDERLIST_H
00017 #define PKGLIB_ORDERLIST_H
00018 
00019 
00020 #include <apt-pkg/pkgcache.h>
00021 #include <apt-pkg/macros.h>
00022 
00023 class pkgDepCache;
00024 class pkgOrderList : protected pkgCache::Namespace
00025 {
00026    protected:
00027 
00028    pkgDepCache &Cache;   
00029    typedef bool (pkgOrderList::*DepFunc)(DepIterator D);
00030 
00031    // These are the currently selected ordering functions
00032    DepFunc Primary;
00033    DepFunc Secondary;
00034    DepFunc RevDepends;
00035    DepFunc Remove;
00036 
00037    // State
00038    Package **End;
00039    Package **List;
00040    Package **AfterEnd;
00041    string *FileList;
00042    DepIterator Loops[20];
00043    int LoopCount;
00044    int Depth;
00045    unsigned short *Flags;
00046    bool Debug;
00047    
00048    // Main visit function
00049    __deprecated bool VisitNode(PkgIterator Pkg) { return VisitNode(Pkg, "UNKNOWN"); };
00050    bool VisitNode(PkgIterator Pkg, char const* from);
00051    bool VisitDeps(DepFunc F,PkgIterator Pkg);
00052    bool VisitRDeps(DepFunc F,PkgIterator Pkg);
00053    bool VisitRProvides(DepFunc F,VerIterator Ver);
00054    bool VisitProvides(DepIterator Pkg,bool Critical);
00055    
00056    // Dependency checking functions.
00057    bool DepUnPackCrit(DepIterator D);
00058    bool DepUnPackPreD(DepIterator D);
00059    bool DepUnPackPre(DepIterator D);
00060    bool DepUnPackDep(DepIterator D);
00061    bool DepConfigure(DepIterator D);
00062    bool DepRemove(DepIterator D);
00063    
00064    // Analysis helpers
00065    bool AddLoop(DepIterator D);
00066    bool CheckDep(DepIterator D);
00067    bool DoRun();
00068    
00069    // For pre sorting
00070    static pkgOrderList *Me;
00071    static int OrderCompareA(const void *a, const void *b);
00072    static int OrderCompareB(const void *a, const void *b);
00073    int FileCmp(PkgIterator A,PkgIterator B);
00074    
00075    public:
00076 
00077    typedef Package **iterator;
00078    
00079    // State flags
00080    enum Flags {Added = (1 << 0), AddPending = (1 << 1),
00081                Immediate = (1 << 2), Loop = (1 << 3),
00082                UnPacked = (1 << 4), Configured = (1 << 5),
00083                Removed = (1 << 6),        // Early Remove
00084                InList = (1 << 7),
00085                After = (1 << 8),
00086                States = (UnPacked | Configured | Removed)};
00087 
00088    // Flag manipulators
00089    inline bool IsFlag(PkgIterator Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
00090    inline bool IsFlag(Package *Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
00091    void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
00092    inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
00093    inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
00094    inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
00095    bool IsMissing(PkgIterator Pkg);
00096    void WipeFlags(unsigned long F);
00097    void SetFileList(string *FileList) {this->FileList = FileList;};
00098 
00099    // Accessors
00100    inline iterator begin() {return List;};
00101    inline iterator end() {return End;};
00102    inline void push_back(Package *Pkg) {*(End++) = Pkg;};
00103    inline void push_back(PkgIterator Pkg) {*(End++) = Pkg;};
00104    inline void pop_back() {End--;};
00105    inline bool empty() {return End == List;};
00106    inline unsigned int size() {return End - List;};
00107    
00108    // Ordering modes
00109    bool OrderCritical();
00110    bool OrderUnpack(string *FileList = 0);
00111    bool OrderConfigure();
00112 
00113    int Score(PkgIterator Pkg);
00114 
00115    pkgOrderList(pkgDepCache *Cache);
00116    ~pkgOrderList();
00117 };
00118 
00119 #endif