- initial import of revision 374 from cnc
[apt.git] / apt-pkg / orderlist.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: orderlist.h,v 1.1 2002/07/23 17:54:50 niemeyer Exp $
4 /* ######################################################################
5
6    Order List - Represents and Manipulates an ordered list of packages.
7    
8    A list of packages can be ordered by a number of conflicting criteria
9    each given a specific priority. Each package also has a set of flags
10    indicating some useful things about it that are derived in the 
11    course of sorting. The pkgPackageManager class uses this class for
12    all of it's installation ordering needs.
13    
14    ##################################################################### */
15                                                                         /*}}}*/
16 #ifndef PKGLIB_ORDERLIST_H
17 #define PKGLIB_ORDERLIST_H
18
19 #ifdef __GNUG__
20 #pragma interface "apt-pkg/orderlist.h"
21 #endif 
22
23 #include <apt-pkg/pkgcache.h>
24
25 class pkgDepCache;
26 class pkgOrderList : protected pkgCache::Namespace
27 {
28    protected:
29
30    pkgDepCache &Cache;   
31    typedef bool (pkgOrderList::*DepFunc)(DepIterator D);
32
33    // These are the currently selected ordering functions
34    DepFunc Primary;
35    DepFunc Secondary;
36    DepFunc RevDepends;
37    DepFunc Remove;
38
39    // State
40    Package **End;
41    Package **List;
42    Package **AfterEnd;
43    string *FileList;
44    DepIterator Loops[20];
45    int LoopCount;
46    int Depth;
47    unsigned short *Flags;
48    bool Debug;
49    
50    // Main visit function
51    bool VisitNode(PkgIterator Pkg);
52    bool VisitDeps(DepFunc F,PkgIterator Pkg);
53    bool VisitRDeps(DepFunc F,PkgIterator Pkg);
54    bool VisitRProvides(DepFunc F,VerIterator Ver);
55    bool VisitProvides(DepIterator Pkg,bool Critical);
56    
57    // Dependency checking functions.
58    bool DepUnPackCrit(DepIterator D);
59    bool DepUnPackPreD(DepIterator D);
60    bool DepUnPackPre(DepIterator D);
61    bool DepUnPackDep(DepIterator D);
62    bool DepConfigure(DepIterator D);
63    bool DepRemove(DepIterator D);
64    
65    // Analysis helpers
66    bool AddLoop(DepIterator D);
67    bool CheckDep(DepIterator D);
68    bool DoRun();
69    
70    // For pre sorting
71    static pkgOrderList *Me;
72    static int OrderCompareA(const void *a, const void *b);
73    static int OrderCompareB(const void *a, const void *b);
74    int FileCmp(PkgIterator A,PkgIterator B);
75    
76    public:
77
78    typedef Package **iterator;
79    
80    // State flags
81    enum Flags {Added = (1 << 0), AddPending = (1 << 1),
82                Immediate = (1 << 2), Loop = (1 << 3),
83                UnPacked = (1 << 4), Configured = (1 << 5),
84                Removed = (1 << 6),        // Early Remove
85                InList = (1 << 7),
86                After = (1 << 8),
87                States = (UnPacked | Configured | Removed)};
88
89    // Flag manipulators
90    inline bool IsFlag(PkgIterator Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
91    inline bool IsFlag(Package *Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;};
92    void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;};
93    inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
94    inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
95    inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;};
96    bool IsMissing(PkgIterator Pkg);
97    void WipeFlags(unsigned long F);
98    void SetFileList(string *FileList) {this->FileList = FileList;};
99
100    // Accessors
101    inline iterator begin() {return List;};
102    inline iterator end() {return End;};
103    inline void push_back(Package *Pkg) {*(End++) = Pkg;};
104    inline void push_back(PkgIterator Pkg) {*(End++) = Pkg;};
105    inline void pop_back() {End--;};
106    inline bool empty() {return End == List;};
107    inline unsigned int size() {return End - List;};
108    
109    // Ordering modes
110    bool OrderCritical();
111    bool OrderUnpack(string *FileList = 0);
112    bool OrderConfigure();
113
114    int Score(PkgIterator Pkg);
115
116    pkgOrderList(pkgDepCache *Cache);
117    ~pkgOrderList();
118 };
119
120 #endif