Publishing R3
[platform/upstream/dldt.git] / inference-engine / thirdparty / ade / ade / source / search.cpp
1 // Copyright (C) 2018 Intel Corporation
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5
6 #include <helpers/search.hpp>
7
8 namespace ade
9 {
10 namespace
11 {
12 template<typename Visitor, typename Traverse>
13 void dfsHelper(const NodeHandle& node,
14                   Visitor&& visitor,
15                   Traverse&& direction)
16 {
17     direction(*node, [&](const NodeHandle& nextNode)
18     {
19         assert(nullptr != nextNode);
20         if (visitor(nextNode))
21         {
22             dfsHelper(nextNode,
23                       std::forward<Visitor>(visitor),
24                       std::forward<Traverse>(direction));
25         }
26     });
27 }
28 }
29
30 void dfs(const NodeHandle& node,
31          util::func_ref<bool (const NodeHandle&)> visitor,
32          traverse::traverse_func_type direction)
33 {
34     ASSERT(nullptr != node);
35     dfsHelper(node, visitor, direction);
36 }
37
38 namespace details
39 {
40
41 namespace
42 {
43 template<typename Traverse>
44 void TransitiveClosureHelperImpl(
45         details::TransitiveClosureHelper::CacheT& cache,
46         const NodeHandle& node,
47         Traverse&& direction)
48 {
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)
54     {
55         ASSERT(nullptr != outNode);
56         if (!util::contains(cache, outNode))
57         {
58             TransitiveClosureHelperImpl(cache,
59                                         outNode,
60                                         std::forward<Traverse>(direction));
61         }
62         ASSERT(util::contains(cache, outNode));
63         elem.insert(outNode);
64         auto& nextNodes = cache[outNode];
65         elem.insert(nextNodes.begin(), nextNodes.end());
66     });
67 }
68 }
69
70 void details::TransitiveClosureHelper::operator()(
71         details::TransitiveClosureHelper::CacheT& cache,
72         const NodeHandle& node,
73         traverse::traverse_func_type direction) const
74 {
75     TransitiveClosureHelperImpl(cache, node, direction);
76 }
77
78 }
79
80 }