From: Francesco Chemolli Date: Wed, 31 Dec 2014 07:50:14 +0000 (+0100) Subject: Fixed Acl::CertificateData X-Git-Tag: merge-candidate-3-v1~384^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c20440520e833416c168c3a9f2a00df627f7d78c;p=thirdparty%2Fsquid.git Fixed Acl::CertificateData --- diff --git a/src/acl/CertificateData.cc b/src/acl/CertificateData.cc index 377f9d71ce..9170387014 100644 --- a/src/acl/CertificateData.cc +++ b/src/acl/CertificateData.cc @@ -71,12 +71,12 @@ ACLCertificateData::match(X509 *cert) return values.match(value); } -static void -aclDumpAttributeListWalkee(char * const & node_data, void *outlist) -{ - /* outlist is really a SBufList * */ - static_cast(outlist)->push_back(SBuf(node_data)); -} +struct CertificateDataAclDumpVisitor { + SBufList contents; + void operator() (char * const & node_data) { + contents.push_back(SBuf(node_data)); + } +}; SBufList ACLCertificateData::dump() const @@ -84,12 +84,10 @@ ACLCertificateData::dump() const SBufList sl; if (validAttributesStr) sl.push_back(SBuf(attribute)); - /* 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. - */ - /* XXX FIXME: don't break abstraction */ - values.values->walk(aclDumpAttributeListWalkee, &sl); + + CertificateDataAclDumpVisitor visitor; + values.values->visit(visitor); + sl.splice(sl.end(),visitor.contents); return sl; }