]> git.ipfire.org Git - thirdparty/squid.git/blame - src/adaptation/ServiceGroups.h
Add missing lookup_t.h
[thirdparty/squid.git] / src / adaptation / ServiceGroups.h
CommitLineData
62c7f90e
AR
1#ifndef SQUID_ADAPTATION__SERVICE_GROUPS_H
2#define SQUID_ADAPTATION__SERVICE_GROUPS_H
3
8e57fe25
AR
4#include "SquidString.h"
5#include "Array.h"
a22e6cd3
AR
6#include "RefCount.h"
7#include "adaptation/Elements.h"
62c7f90e
AR
8#include "adaptation/forward.h"
9
26ac0430
AJ
10namespace Adaptation
11{
62c7f90e
AR
12
13// Interface for grouping adaptation services together.
14// Specific groups differ in how the first and the next services are selected
a22e6cd3 15class ServiceGroup: public RefCountable
62c7f90e
AR
16{
17public:
a22e6cd3
AR
18 typedef RefCount<ServiceGroup> Pointer;
19
62c7f90e 20 typedef Vector<String> Store;
62c7f90e 21 typedef String Id;
a22e6cd3
AR
22 typedef unsigned int Pos; // Vector<>::poistion_type
23 friend class ServicePlan;
62c7f90e
AR
24
25public:
a22e6cd3 26 ServiceGroup(const String &aKind, bool areAllServicesSame);
62c7f90e
AR
27 virtual ~ServiceGroup();
28
29 virtual void parse();
30 virtual void finalize(); // called after all are parsed
31
a22e6cd3
AR
32 bool wants(const ServiceFilter &filter) const;
33
34protected:
35 ///< whether this group has a service at the specified pos
36 bool has(const Pos pos) const {
37 // does not check that the service at pos still exists
38 return pos < services.size(); // unsigned pos is never negative
39 }
40
41 /// these methods control group iteration; used by ServicePlan
42
43 /// find next to try after failure, starting with pos
44 bool findReplacement(const ServiceFilter &filter, Pos &pos) const;
45 /// find next to link after success, starting with pos
46 bool findLink(const ServiceFilter &filter, Pos &pos) const;
47
48private:
49 ServicePointer at(const Pos pos) const;
50 bool findService(const ServiceFilter &filter, Pos &pos) const;
51
52 void checkUniqueness(const Pos checkedPos) const;
53 void finalizeMsg(const char *msg, const String &culprit, bool error) const;
62c7f90e
AR
54
55public:
56 String kind;
57 Id id;
58 Store services;
a22e6cd3
AR
59
60 Method method; /// based on the first added service
61 VectPoint point; /// based on the first added service
62
63 const bool allServicesSame; // whether we can freely substitute services
62c7f90e
AR
64};
65
66// a group of equivalent services; one service per set is usually used
67class ServiceSet: public ServiceGroup
68{
69public:
70 ServiceSet();
a22e6cd3
AR
71
72protected:
73 virtual bool replace(Pos &pos) const { return has(++pos); }
74 virtual bool advance(Pos &pos) const { return false; }
62c7f90e
AR
75};
76
77// corner case: a group consisting of one service
78class SingleService: public ServiceGroup
79{
80public:
81 SingleService(const String &aServiceKey);
a22e6cd3
AR
82
83protected:
84 virtual bool replace(Pos &pos) const { return false; }
85 virtual bool advance(Pos &pos) const { return false; }
86};
87
88/// a group of services that must be used one after another
89class ServiceChain: public ServiceGroup
90{
91public:
92 ServiceChain();
93
94protected:
95 virtual bool replace(Pos &pos) const { return false; }
96 virtual bool advance(Pos &pos) const { return has(++pos); }
97};
98
99/// a temporary service chain built upon another service request
100class DynamicServiceChain: public ServiceChain
101{
102public:
103 DynamicServiceChain(const String &srvcs, const ServiceGroupPointer prev);
62c7f90e
AR
104};
105
62c7f90e 106
a22e6cd3
AR
107/** iterates services stored in a group; iteration is not linear because we
108 need to both replace failed services and advance to the next chain link */
109class ServicePlan {
110public:
111 typedef unsigned int Pos; // Vector<>::poistion_type
112
113public:
114 ServicePlan();
115 explicit ServicePlan(const ServiceGroupPointer &g, const ServiceFilter &filter);
116
117 ///< true iff there are no more services planned
118 bool exhausted() const { return atEof; }
119
120 /// returns nil if the plan is complete
121 ServicePointer current() const; ///< current service
122 ServicePointer replacement(const ServiceFilter &filter); ///< next to try after failure
123 ServicePointer next(const ServiceFilter &filter); ///< next in chain after success
124
125 std::ostream &print(std::ostream &os) const;
126
127private:
128 ServiceGroupPointer group; ///< the group we are iterating
129 Pos pos; ///< current service position within the group
130 bool atEof; ///< cached information for better performance
131};
132
133inline
134std::ostream &operator <<(std::ostream &os, const ServicePlan &p)
135{
136 return p.print(os);
137}
62c7f90e 138
a22e6cd3 139typedef Vector<ServiceGroupPointer> Groups;
62c7f90e 140extern Groups &AllGroups();
a22e6cd3 141extern ServiceGroupPointer FindGroup(const ServiceGroup::Id &id);
62c7f90e
AR
142
143
144} // namespace Adaptation
145
146#endif /* SQUID_ADAPTATION__SERVICE_GROUPS_H */
147