1 #ifndef SQUID_ADAPTATION__SERVICE_GROUPS_H
2 #define SQUID_ADAPTATION__SERVICE_GROUPS_H
4 #include "SquidString.h"
7 #include "adaptation/Elements.h"
8 #include "adaptation/forward.h"
13 // Interface for grouping adaptation services together.
14 // Specific groups differ in how the first and the next services are selected
15 class ServiceGroup
: public RefCountable
18 typedef RefCount
<ServiceGroup
> Pointer
;
20 typedef Vector
<String
> Store
;
22 typedef unsigned int Pos
; // Vector<>::poistion_type
23 friend class ServicePlan
;
26 ServiceGroup(const String
&aKind
, bool areAllServicesSame
);
27 virtual ~ServiceGroup();
30 virtual void finalize(); // called after all are parsed
32 bool wants(const ServiceFilter
&filter
) const;
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
41 /// these methods control group iteration; used by ServicePlan
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;
49 ServicePointer
at(const Pos pos
) const;
50 bool findService(const ServiceFilter
&filter
, Pos
&pos
) const;
52 void checkUniqueness(const Pos checkedPos
) const;
53 void finalizeMsg(const char *msg
, const String
&culprit
, bool error
) const;
60 Method method
; /// based on the first added service
61 VectPoint point
; /// based on the first added service
63 const bool allServicesSame
; // whether we can freely substitute services
66 // a group of equivalent services; one service per set is usually used
67 class ServiceSet
: public ServiceGroup
73 virtual bool replace(Pos
&pos
) const { return has(++pos
); }
74 virtual bool advance(Pos
&pos
) const { return false; }
77 // corner case: a group consisting of one service
78 class SingleService
: public ServiceGroup
81 SingleService(const String
&aServiceKey
);
84 virtual bool replace(Pos
&pos
) const { return false; }
85 virtual bool advance(Pos
&pos
) const { return false; }
88 /// a group of services that must be used one after another
89 class ServiceChain
: public ServiceGroup
95 virtual bool replace(Pos
&pos
) const { return false; }
96 virtual bool advance(Pos
&pos
) const { return has(++pos
); }
99 /// a temporary service chain built upon another service request
100 class DynamicServiceChain
: public ServiceChain
103 DynamicServiceChain(const String
&srvcs
, const ServiceGroupPointer prev
);
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 */
111 typedef unsigned int Pos
; // Vector<>::poistion_type
115 explicit ServicePlan(const ServiceGroupPointer
&g
, const ServiceFilter
&filter
);
117 ///< true iff there are no more services planned
118 bool exhausted() const { return atEof
; }
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
125 std::ostream
&print(std::ostream
&os
) const;
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
134 std::ostream
&operator <<(std::ostream
&os
, const ServicePlan
&p
)
139 typedef Vector
<ServiceGroupPointer
> Groups
;
140 extern Groups
&AllGroups();
141 extern ServiceGroupPointer
FindGroup(const ServiceGroup::Id
&id
);
144 } // namespace Adaptation
146 #endif /* SQUID_ADAPTATION__SERVICE_GROUPS_H */