]>
Commit | Line | Data |
---|---|---|
6c139d6e AL |
1 | // -*- mode: cpp; mode: fold -*- |
2 | // Description /*{{{*/ | |
3 | // $Id: orderlist.h,v 1.1 1998/07/07 04:17:01 jgg 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 usefull 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 | // Header section: pkglib | |
17 | #ifndef PKGLIB_ORDERLIST_H | |
18 | #define PKGLIB_ORDERLIST_H | |
19 | ||
20 | #ifdef __GNUG__ | |
21 | #pragma interface "pkglib/orderlist.h" | |
22 | #endif | |
23 | ||
24 | #include <pkglib/pkgcache.h> | |
25 | ||
26 | class pkgDepCache; | |
27 | class pkgOrderList | |
28 | { | |
29 | protected: | |
30 | ||
31 | pkgDepCache &Cache; | |
32 | ||
33 | // Bring some usefull types into the local scope | |
34 | typedef pkgCache::PkgIterator PkgIterator; | |
35 | typedef pkgCache::VerIterator VerIterator; | |
36 | typedef pkgCache::DepIterator DepIterator; | |
37 | typedef pkgCache::PrvIterator PrvIterator; | |
38 | typedef pkgCache::Package Package; | |
39 | typedef pkgCache::Version Version; | |
40 | typedef bool (pkgOrderList::*DepFunc)(DepIterator D); | |
41 | ||
42 | // These are the currently selected ordering functions | |
43 | DepFunc Primary; | |
44 | DepFunc Secondary; | |
45 | DepFunc RevDepends; | |
46 | DepFunc Remove; | |
47 | ||
48 | // State | |
49 | Package **End; | |
50 | Package **List; | |
51 | DepIterator Loops[20]; | |
52 | int LoopCount; | |
53 | int Depth; | |
54 | unsigned char *Flags; | |
55 | ||
56 | // Main visit function | |
57 | bool VisitNode(PkgIterator Pkg); | |
58 | bool VisitDeps(DepFunc F,PkgIterator Pkg); | |
59 | bool VisitRDeps(DepFunc F,PkgIterator Pkg); | |
60 | bool VisitRProvides(DepFunc F,VerIterator Ver); | |
61 | bool VisitProvides(DepIterator Pkg); | |
62 | ||
63 | // Dependency checking functions. | |
64 | bool DepUnPackCrit(DepIterator D); | |
65 | bool DepUnPackPreD(DepIterator D); | |
66 | bool DepUnPackPre(DepIterator D); | |
67 | bool DepUnPackDep(DepIterator D); | |
68 | bool DepConfigure(DepIterator D); | |
69 | bool DepRemove(DepIterator D); | |
70 | ||
71 | // Analysis helpers | |
72 | bool AddLoop(DepIterator D); | |
73 | bool CheckDep(DepIterator D); | |
74 | bool DoRun(); | |
75 | ||
76 | // For pre sorting | |
77 | static pkgOrderList *Me; | |
78 | static int OrderCompareA(const void *a, const void *b); | |
79 | static int OrderCompareB(const void *a, const void *b); | |
80 | int FileCmp(PkgIterator A,PkgIterator B); | |
81 | ||
82 | public: | |
83 | ||
84 | typedef Package **iterator; | |
85 | ||
86 | // State flags | |
87 | enum Flags {Added = (1 << 0), AddPending = (1 << 1), | |
88 | Immediate = (1 << 2), Loop = (1 << 3), | |
89 | UnPacked = (1 << 4), Configured = (1 << 5), | |
90 | Removed = (1 << 6), | |
91 | InList = (1 << 7), | |
92 | States = (UnPacked | Configured | Removed)}; | |
93 | ||
94 | // Flag manipulators | |
95 | inline bool IsFlag(PkgIterator Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;}; | |
96 | inline bool IsFlag(Package *Pkg,unsigned long F) {return (Flags[Pkg->ID] & F) == F;}; | |
97 | void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;}; | |
98 | inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;}; | |
99 | inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;}; | |
100 | inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & States) == 0;}; | |
101 | void WipeFlags(unsigned long F); | |
102 | ||
103 | // Accessors | |
104 | inline iterator begin() {return List;}; | |
105 | inline iterator end() {return End;}; | |
106 | inline void push_back(Package *Pkg) {*(End++) = Pkg;}; | |
107 | inline void push_back(PkgIterator Pkg) {*(End++) = Pkg;}; | |
108 | inline void pop_back() {End--;}; | |
109 | inline bool empty() {return End == List;}; | |
110 | inline unsigned int size() {return End - List;}; | |
111 | ||
112 | // Ordering modes | |
113 | bool OrderCritical(); | |
114 | bool OrderUnpack(); | |
115 | bool OrderConfigure(); | |
116 | ||
117 | int Score(PkgIterator Pkg); | |
118 | ||
119 | pkgOrderList(pkgDepCache &Cache); | |
120 | ~pkgOrderList(); | |
121 | }; | |
122 | ||
123 | #endif |