1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
6 #include <helpers/search.hpp>
12 template<typename Visitor, typename Traverse>
13 void dfsHelper(const NodeHandle& node,
17 direction(*node, [&](const NodeHandle& nextNode)
19 assert(nullptr != nextNode);
20 if (visitor(nextNode))
23 std::forward<Visitor>(visitor),
24 std::forward<Traverse>(direction));
30 void dfs(const NodeHandle& node,
31 util::func_ref<bool (const NodeHandle&)> visitor,
32 traverse::traverse_func_type direction)
34 ASSERT(nullptr != node);
35 dfsHelper(node, visitor, direction);
43 template<typename Traverse>
44 void TransitiveClosureHelperImpl(
45 details::TransitiveClosureHelper::CacheT& cache,
46 const NodeHandle& node,
49 ASSERT(nullptr != node);
50 ASSERT(!util::contains(cache, node));
51 auto& elem = cache[node];
52 (void)elem; // Silence klocwork warning
53 direction(*node, [&](const NodeHandle& outNode)
55 ASSERT(nullptr != outNode);
56 if (!util::contains(cache, outNode))
58 TransitiveClosureHelperImpl(cache,
60 std::forward<Traverse>(direction));
62 ASSERT(util::contains(cache, outNode));
64 auto& nextNodes = cache[outNode];
65 elem.insert(nextNodes.begin(), nextNodes.end());
70 void details::TransitiveClosureHelper::operator()(
71 details::TransitiveClosureHelper::CacheT& cache,
72 const NodeHandle& node,
73 traverse::traverse_func_type direction) const
75 TransitiveClosureHelperImpl(cache, node, direction);