From c20440520e833416c168c3a9f2a00df627f7d78c Mon Sep 17 00:00:00 2001 From: Francesco Chemolli Date: Wed, 31 Dec 2014 08:50:14 +0100 Subject: [PATCH] Fixed Acl::CertificateData --- src/acl/CertificateData.cc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) 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; } -- 2.47.3