From: Francesco Chemolli Date: Tue, 30 Dec 2014 16:05:48 +0000 (+0100) Subject: Migrated acl/DomainData to Splay X-Git-Tag: merge-candidate-3-v1~384^2~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4a0199eec9bb88e4add85103fa8bff36ac49f5dd;p=thirdparty%2Fsquid.git Migrated acl/DomainData to Splay --- diff --git a/include/splay.h b/include/splay.h index aa3e1c2b25..42475d4dc3 100644 --- a/include/splay.h +++ b/include/splay.h @@ -85,7 +85,7 @@ public: size_t size() const; - bool empty() { return size() == 0; } + bool empty() const { return size() == 0; } const_iterator begin() const; diff --git a/src/acl/DomainData.cc b/src/acl/DomainData.cc index 6f37d80f0f..13b23d3df0 100644 --- a/src/acl/DomainData.cc +++ b/src/acl/DomainData.cc @@ -106,30 +106,27 @@ ACLDomainData::match(char const *host) debugs(28, 3, "aclMatchDomainList: checking '" << host << "'"); - domains = domains->splay((char *)host, aclHostDomainCompare); + char *h = const_cast(host); + char const * const * result = domains->find(h, aclHostDomainCompare); - debugs(28, 3, "aclMatchDomainList: '" << host << "' " << (splayLastResult ? "NOT found" : "found")); + debugs(28, 3, "aclMatchDomainList: '" << host << "' " << (result ? "found" : "NOT found")); - return !splayLastResult; + return (result != NULL); } -static void -aclDumpDomainListWalkee(char * const & node_data, void *outlist) -{ - /* outlist is really a SBufList ** */ - static_cast(outlist)->push_back(SBuf(node_data)); -} +struct AclDomainDataDumpVisitor { + SBufList contents; + void operator() (char * const & node_data) { + contents.push_back(SBuf(node_data)); + } +}; SBufList ACLDomainData::dump() const { - SBufList sl; - /* damn this is VERY inefficient for long ACL lists... filling - * a wordlist this way costs Sum(1,N) iterations. For instance - * a 1000-elements list will be filled in 499500 iterations. - */ - domains->walk(aclDumpDomainListWalkee, &sl); - return sl; + AclDomainDataDumpVisitor visitor; + domains->visit(visitor); + return visitor.contents; } void @@ -137,9 +134,12 @@ ACLDomainData::parse() { char *t = NULL; + if (!domains) + domains = new Splay(); + while ((t = strtokFile())) { Tolower(t); - domains = domains->insert(xstrdup(t), aclDomainCompare); + domains->insert(xstrdup(t), aclDomainCompare); } } diff --git a/src/acl/DomainData.h b/src/acl/DomainData.h index 7792e7eef2..4115eb38c8 100644 --- a/src/acl/DomainData.h +++ b/src/acl/DomainData.h @@ -25,7 +25,7 @@ public: bool empty() const; virtual ACLData *clone() const; - SplayNode *domains; + Splay *domains; }; #endif /* SQUID_ACLDOMAINDATA_H */