]> git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/Strategised.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / acl / Strategised.h
1 /*
2 * Copyright (C) 1996-2014 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_ACLSTRATEGISED_H
10 #define SQUID_ACLSTRATEGISED_H
11
12 #include "acl/Acl.h"
13 #include "acl/Data.h"
14 #include "acl/FilledChecklist.h"
15 #include "acl/Strategy.h"
16
17 template <class M>
18 class ACLStrategised : public ACL
19 {
20 MEMPROXY_CLASS(ACLStrategised);
21
22 public:
23 typedef M MatchType;
24
25 ~ACLStrategised();
26 ACLStrategised(ACLData<MatchType> *, ACLStrategy<MatchType> *, char const *, const ACLFlag flags[] = ACLFlags::NoFlags);
27 ACLStrategised (ACLStrategised const &);
28 ACLStrategised &operator= (ACLStrategised const &);
29
30 virtual char const *typeString() const;
31 virtual bool requiresRequest() const {return matcher->requiresRequest();}
32
33 virtual bool requiresReply() const {return matcher->requiresReply();}
34
35 virtual void prepareForUse() { data->prepareForUse();}
36
37 virtual void parse();
38 virtual int match(ACLChecklist *checklist);
39 virtual int match (M const &);
40 virtual SBufList dump() const;
41 virtual bool empty () const;
42 virtual bool valid () const;
43 virtual ACL *clone()const;
44
45 private:
46 ACLData<MatchType> *data;
47 char const *type_;
48 ACLStrategy<MatchType> *matcher;
49 };
50
51 /* implementation follows */
52
53 template <class MatchType>
54 ACLStrategised<MatchType>::~ACLStrategised()
55 {
56 delete data;
57 }
58
59 template <class MatchType>
60 ACLStrategised<MatchType>::ACLStrategised(ACLData<MatchType> *newData, ACLStrategy<MatchType> *theStrategy, char const *theType, const ACLFlag flgs[]) : ACL(flgs), data (newData), type_(theType), matcher(theStrategy) {}
61
62 template <class MatchType>
63 ACLStrategised<MatchType>::ACLStrategised (ACLStrategised const &old) : data (old.data->clone()), type_(old.type_), matcher (old.matcher)
64 {}
65
66 template <class MatchType>
67 ACLStrategised<MatchType> &
68 ACLStrategised<MatchType>::operator= (ACLStrategised const &rhs)
69 {
70 data = rhs.data->clone();
71 type_ = rhs.type_;
72 matcher = rhs.matcher;
73 return *this;
74 }
75
76 template <class MatchType>
77 char const *
78 ACLStrategised<MatchType>::typeString() const
79 {
80 return type_;
81 }
82
83 template <class MatchType>
84 void
85 ACLStrategised<MatchType>::parse()
86 {
87 data->parse();
88 }
89
90 template <class MatchType>
91 bool
92 ACLStrategised<MatchType>::empty() const
93 {
94 return data->empty();
95 }
96
97 template <class MatchType>
98 int
99 ACLStrategised<MatchType>::match(ACLChecklist *cl)
100 {
101 ACLFilledChecklist *checklist = dynamic_cast<ACLFilledChecklist*>(cl);
102 assert(checklist);
103 return matcher->match(data, checklist, flags);
104 }
105
106 template <class MatchType>
107 int
108 ACLStrategised<MatchType>::match(MatchType const &toFind)
109 {
110 return data->match(toFind);
111 }
112
113 template <class MatchType>
114 SBufList
115 ACLStrategised<MatchType>::dump() const
116 {
117 return data->dump();
118 }
119
120 template <class MatchType>
121 bool
122 ACLStrategised<MatchType>::valid () const
123 {
124 return matcher->valid();
125 }
126
127 template <class MatchType>
128 ACL *
129 ACLStrategised<MatchType>::clone() const
130 {
131 return new ACLStrategised(*this);
132 }
133
134 #endif /* SQUID_ACLSTRATEGISED_H */
135