Squid Web Cache master
Loading...
Searching...
No Matches
ServiceGroups.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9#ifndef SQUID_SRC_ADAPTATION_SERVICEGROUPS_H
10#define SQUID_SRC_ADAPTATION_SERVICEGROUPS_H
11
12#include "adaptation/Elements.h"
13#include "adaptation/forward.h"
14#include "base/RefCount.h"
15#include "SquidString.h"
16
17#include <vector>
18
19namespace Adaptation
20{
21
22// Interface for grouping adaptation services together.
23// Specific groups differ in how the first and the next services are selected
25{
26public:
28
29 typedef std::vector<String> Store;
30 typedef String Id;
31 typedef unsigned int Pos; // vector<>::position_type
32 friend class ServicePlan;
33
34public:
35 ServiceGroup(const String &aKind, bool areAllServicesSame);
36 ~ServiceGroup() override;
37
38 virtual void parse();
39 virtual void finalize(); // called after all are parsed
40
41 bool wants(const ServiceFilter &filter) const;
42
43protected:
45 bool has(const Pos pos) const {
46 // does not check that the service at pos still exists
47 return pos < services.size(); // unsigned pos is never negative
48 }
49
51
53 bool findReplacement(const ServiceFilter &filter, Pos &pos) const;
55 bool findLink(const ServiceFilter &filter, Pos &pos) const;
56
57private:
58 ServicePointer at(const Pos pos) const;
59 bool findService(const ServiceFilter &filter, Pos &pos) const;
60
61 void checkUniqueness(const Pos checkedPos) const;
62 void finalizeMsg(const char *msg, const String &culprit, bool error) const;
63
64public:
69
72
73 const bool allServicesSame; // whether we can freely substitute services
74};
75
76// a group of equivalent services; one service per set is usually used
78{
79public:
80 ServiceSet();
81
82protected:
83 virtual bool replace(Pos &pos) const { return has(++pos); }
84 virtual bool advance(Pos &) const { return false; }
85};
86
87// corner case: a group consisting of one service
89{
90public:
91 SingleService(const String &aServiceKey);
92
93protected:
94 virtual bool replace(Pos &) const { return false; }
95 virtual bool advance(Pos &) const { return false; }
96};
97
100{
101public:
102 ServiceChain();
103
104protected:
105 virtual bool replace(Pos &) const { return false; }
106 virtual bool advance(Pos &pos) const { return has(++pos); }
107};
108
111{
112public:
114
116 static void Split(const ServiceFilter &filter, const String &ids,
117 DynamicGroupCfg &current, DynamicGroupCfg &future);
118};
119
123{
124public:
125 typedef unsigned int Pos; // vector<>::position_type
126
127public:
128 ServicePlan();
129 explicit ServicePlan(const ServiceGroupPointer &g, const ServiceFilter &filter);
130
132 bool exhausted() const { return atEof; }
133
135 ServicePointer current() const;
137 ServicePointer next(const ServiceFilter &filter);
138
139 std::ostream &print(std::ostream &os) const;
140
141private:
144 bool atEof;
145};
146
147inline
148std::ostream &operator <<(std::ostream &os, const ServicePlan &p)
149{
150 return p.print(os);
151}
152
153typedef std::vector<ServiceGroupPointer> Groups;
156
157} // namespace Adaptation
158
159#endif /* SQUID_SRC_ADAPTATION_SERVICEGROUPS_H */
160
#define RefCountable
The locking interface for use on Reference-Counted classes.
Definition Lock.h:66
void error(char *format,...)
DynamicServiceGroup configuration to remember future dynamic chains.
a temporary service chain built upon another service request
static void Split(const ServiceFilter &filter, const String &ids, DynamicGroupCfg &current, DynamicGroupCfg &future)
separates dynamic services matching current location from future ones
a group of services that must be used one after another
virtual bool advance(Pos &pos) const
virtual bool replace(Pos &) const
information used to search for adaptation services
RefCount< ServiceGroup > Pointer
std::vector< String > Store
const bool allServicesSame
based on the first added service
bool wants(const ServiceFilter &filter) const
bool findLink(const ServiceFilter &filter, Pos &pos) const
find next to link after success, starting with pos
void checkUniqueness(const Pos checkedPos) const
checks that the service name or URI is not repeated later in the group
ServicePointer at(const Pos pos) const
Store removedServices
the disabled services in the case ecap or icap is disabled
VectPoint point
based on the first added service
void finalizeMsg(const char *msg, const String &culprit, bool error) const
emits a formatted warning or error message at the appropriate dbg level
bool findReplacement(const ServiceFilter &filter, Pos &pos) const
these methods control group iteration; used by ServicePlan
bool findService(const ServiceFilter &filter, Pos &pos) const
bool has(const Pos pos) const
< whether this group has a service at the specified pos
ServicePointer replacement(const ServiceFilter &filter)
next to try after failure
bool atEof
cached information for better performance
Pos pos
current service position within the group
std::ostream & print(std::ostream &os) const
ServicePointer next(const ServiceFilter &filter)
next in chain after success
ServiceGroupPointer group
the group we are iterating
ServicePointer current() const
returns nil if the plan is complete
virtual bool replace(Pos &pos) const
virtual bool advance(Pos &) const
virtual bool replace(Pos &) const
virtual bool advance(Pos &) const
std::vector< ServiceGroupPointer > Groups
std::ostream & operator<<(std::ostream &os, const Answer &answer)
Definition Answer.h:54
Groups & AllGroups()
ServiceGroupPointer FindGroup(const ServiceGroup::Id &id)