15 void reverseAppend(
const std::vector<IAlgTool*>& src, std::vector<IAlgTool*>&
dest,
const std::regex& reject_filter,
17 dest.reserve(
dest.size() + src.size() );
18 std::copy_if( src.rbegin(), src.rend(), std::back_inserter(
dest ), [&](
const auto& i ) {
19 return !use_filter || !std::regex_match( i->name(), reject_filter );
24 const std::regex ToolVisitor::s_noFilter{};
26 void ToolVisitor::recursiveVisit(
const std::vector<IAlgTool*>& tools, IVisitor
const& visitor,
27 const std::regex& reject_filter ) {
28 bool use_filter = ( &reject_filter != &ToolVisitor::s_noFilter ) &&
29 ( !std::regex_match(
"", reject_filter ) );
30 std::vector<IAlgTool*> stack;
32 reverseAppend( tools, stack, reject_filter, use_filter );
35 std::set<IAlgTool*> visited;
36 while ( !stack.empty() ) {
37 auto* a_tool = stack.back();
40 if ( visited.insert( a_tool ).second ) {
41 visitor.visit( a_tool );
43 if (
auto* tool_impl =
dynamic_cast<AlgTool*
>( a_tool ); tool_impl ) {
44 reverseAppend( tool_impl->tools(), stack, reject_filter, use_filter );