]> git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/Strategised.h
Boilerplate: update copyright blurbs on src/
[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 #include "acl/Acl.h"
12 #include "acl/Data.h"
13 #include "acl/FilledChecklist.h"
14 #include "acl/Strategy.h"
15
16 template <class M>
17
18 class ACLStrategised : public ACL
19 {
20
21 public:
22 typedef M MatchType;
23 void *operator new(size_t);
24 void operator delete(void *);
25
26 ~ACLStrategised();
27 ACLStrategised(ACLData<MatchType> *, ACLStrategy<MatchType> *, char const *, const ACLFlag flags[] = ACLFlags::NoFlags);
28 ACLStrategised (ACLStrategised const &);
29 ACLStrategised &operator= (ACLStrategised const &);
30
31 virtual char const *typeString() const;
32 virtual bool requiresRequest() const {return matcher->requiresRequest();}
33
34 virtual bool requiresReply() const {return matcher->requiresReply();}
35
36 virtual void prepareForUse() { data->prepareForUse();}
37
38 virtual void parse();
39 virtual int match(ACLChecklist *checklist);
40 virtual int match (M const &);
41 virtual SBufList dump() const;
42 virtual bool empty () const;
43 virtual bool valid () const;
44 virtual ACL *clone()const;
45
46 private:
47 static MemAllocator *Pool;
48 ACLData<MatchType> *data;
49 char const *type_;
50 ACLStrategy<MatchType> *matcher;
51 };
52
53 /* implementation follows */
54
55 template <class MatchType>
56 MemAllocator *ACLStrategised<MatchType>::Pool = NULL;
57
58 template <class MatchType>
59 void *
60 ACLStrategised<MatchType>::operator new (size_t byteCount)
61 {
62 /* derived classes with different sizes must implement their own new */
63 assert (byteCount == sizeof (ACLStrategised<MatchType>));
64
65 if (!Pool)
66 Pool = memPoolCreate("ACLStrategised", sizeof (ACLStrategised<MatchType>));
67
68 return Pool->alloc();
69 }
70
71 template <class MatchType>
72 void
73 ACLStrategised<MatchType>::operator delete (void *address)
74 {
75 Pool->freeOne(address);
76 }
77
78 template <class MatchType>
79 ACLStrategised<MatchType>::~ACLStrategised()
80 {
81 delete data;
82 }
83
84 template <class MatchType>
85 ACLStrategised<MatchType>::ACLStrategised(ACLData<MatchType> *newData, ACLStrategy<MatchType> *theStrategy, char const *theType, const ACLFlag flgs[]) : ACL(flgs), data (newData), type_(theType), matcher(theStrategy) {}
86
87 template <class MatchType>
88 ACLStrategised<MatchType>::ACLStrategised (ACLStrategised const &old) : data (old.data->clone()), type_(old.type_), matcher (old.matcher)
89 {}
90
91 template <class MatchType>
92 ACLStrategised<MatchType> &
93 ACLStrategised<MatchType>::operator= (ACLStrategised const &rhs)
94 {
95 data = rhs.data->clone();
96 type_ = rhs.type_;
97 matcher = rhs.matcher;
98 return *this;
99 }
100
101 template <class MatchType>
102 char const *
103 ACLStrategised<MatchType>::typeString() const
104 {
105 return type_;
106 }
107
108 template <class MatchType>
109 void
110 ACLStrategised<MatchType>::parse()
111 {
112 data->parse();
113 }
114
115 template <class MatchType>
116 bool
117 ACLStrategised<MatchType>::empty() const
118 {
119 return data->empty();
120 }
121
122 template <class MatchType>
123 int
124 ACLStrategised<MatchType>::match(ACLChecklist *cl)
125 {
126 ACLFilledChecklist *checklist = dynamic_cast<ACLFilledChecklist*>(cl);
127 assert(checklist);
128 return matcher->match(data, checklist, flags);
129 }
130
131 template <class MatchType>
132 int
133 ACLStrategised<MatchType>::match(MatchType const &toFind)
134 {
135 return data->match(toFind);
136 }
137
138 template <class MatchType>
139 SBufList
140 ACLStrategised<MatchType>::dump() const
141 {
142 return data->dump();
143 }
144
145 template <class MatchType>
146 bool
147 ACLStrategised<MatchType>::valid () const
148 {
149 return matcher->valid();
150 }
151
152 template <class MatchType>
153 ACL *
154 ACLStrategised<MatchType>::clone() const
155 {
156 return new ACLStrategised(*this);
157 }
158
159 #endif /* SQUID_ACLSTRATEGISED_H */