]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/Strategised.h
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
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.
9 #ifndef SQUID_ACLSTRATEGISED_H
10 #define SQUID_ACLSTRATEGISED_H
13 #include "acl/FilledChecklist.h"
14 #include "acl/Strategy.h"
18 class ACLStrategised
: public ACL
23 void *operator new(size_t);
24 void operator delete(void *);
27 ACLStrategised(ACLData
<MatchType
> *, ACLStrategy
<MatchType
> *, char const *, const ACLFlag flags
[] = ACLFlags::NoFlags
);
28 ACLStrategised (ACLStrategised
const &);
29 ACLStrategised
&operator= (ACLStrategised
const &);
31 virtual char const *typeString() const;
32 virtual bool requiresRequest() const {return matcher
->requiresRequest();}
34 virtual bool requiresReply() const {return matcher
->requiresReply();}
36 virtual void prepareForUse() { data
->prepareForUse();}
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;
47 static MemAllocator
*Pool
;
48 ACLData
<MatchType
> *data
;
50 ACLStrategy
<MatchType
> *matcher
;
53 /* implementation follows */
55 template <class MatchType
>
56 MemAllocator
*ACLStrategised
<MatchType
>::Pool
= NULL
;
58 template <class MatchType
>
60 ACLStrategised
<MatchType
>::operator new (size_t byteCount
)
62 /* derived classes with different sizes must implement their own new */
63 assert (byteCount
== sizeof (ACLStrategised
<MatchType
>));
66 Pool
= memPoolCreate("ACLStrategised", sizeof (ACLStrategised
<MatchType
>));
71 template <class MatchType
>
73 ACLStrategised
<MatchType
>::operator delete (void *address
)
75 Pool
->freeOne(address
);
78 template <class MatchType
>
79 ACLStrategised
<MatchType
>::~ACLStrategised()
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
) {}
87 template <class MatchType
>
88 ACLStrategised
<MatchType
>::ACLStrategised (ACLStrategised
const &old
) : data (old
.data
->clone()), type_(old
.type_
), matcher (old
.matcher
)
91 template <class MatchType
>
92 ACLStrategised
<MatchType
> &
93 ACLStrategised
<MatchType
>::operator= (ACLStrategised
const &rhs
)
95 data
= rhs
.data
->clone();
97 matcher
= rhs
.matcher
;
101 template <class MatchType
>
103 ACLStrategised
<MatchType
>::typeString() const
108 template <class MatchType
>
110 ACLStrategised
<MatchType
>::parse()
115 template <class MatchType
>
117 ACLStrategised
<MatchType
>::empty() const
119 return data
->empty();
122 template <class MatchType
>
124 ACLStrategised
<MatchType
>::match(ACLChecklist
*cl
)
126 ACLFilledChecklist
*checklist
= dynamic_cast<ACLFilledChecklist
*>(cl
);
128 return matcher
->match(data
, checklist
, flags
);
131 template <class MatchType
>
133 ACLStrategised
<MatchType
>::match(MatchType
const &toFind
)
135 return data
->match(toFind
);
138 template <class MatchType
>
140 ACLStrategised
<MatchType
>::dump() const
145 template <class MatchType
>
147 ACLStrategised
<MatchType
>::valid () const
149 return matcher
->valid();
152 template <class MatchType
>
154 ACLStrategised
<MatchType
>::clone() const
156 return new ACLStrategised(*this);
159 #endif /* SQUID_ACLSTRATEGISED_H */