diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2018-08-01 19:48:46 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-01 19:48:46 +0800 |
commit | 8d05770e59dd4c383cdcd5f67d2a455be3b09ae1 (patch) | |
tree | 15f4f10aece4dbece921211b044787c74d7de1fc /libdevcore/Algorithms.h | |
parent | ef269bf40d3c6fc044c27654473353c556402b77 (diff) | |
parent | cb200cf7e11d3a61b0780d22eb9c8baf6eb35aac (diff) | |
download | dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar.gz dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar.bz2 dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar.lz dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar.xz dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.tar.zst dexon-solidity-8d05770e59dd4c383cdcd5f67d2a455be3b09ae1.zip |
Merge pull request #4631 from ethereum/cp-cycle-detection-recursion-guard
Guard CycleDetector against recursion exhaustion.
Diffstat (limited to 'libdevcore/Algorithms.h')
-rw-r--r-- | libdevcore/Algorithms.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/libdevcore/Algorithms.h b/libdevcore/Algorithms.h index b2540668..7fe2472d 100644 --- a/libdevcore/Algorithms.h +++ b/libdevcore/Algorithms.h @@ -32,11 +32,13 @@ template <typename V> class CycleDetector { public: + using Visitor = std::function<void(V const&, CycleDetector&, size_t)>; + /// Initializes the cycle detector /// @param _visit function that is given the current vertex /// and is supposed to call @a run on all /// adjacent vertices. - explicit CycleDetector(std::function<void(V const&, CycleDetector&)> _visit): + explicit CycleDetector(Visitor _visit): m_visit(std::move(_visit)) { } @@ -55,7 +57,7 @@ public: m_processing.insert(&_vertex); m_depth++; - m_visit(_vertex, *this); + m_visit(_vertex, *this, m_depth); m_depth--; if (m_firstCycleVertex && m_depth == 1) m_firstCycleVertex = &_vertex; @@ -66,7 +68,7 @@ public: } private: - std::function<void(V const&, CycleDetector&)> m_visit; + Visitor m_visit; std::set<V const*> m_processing; std::set<V const*> m_processed; size_t m_depth = 0; |