diff options
author | Jeremy Rubin <jeremy.l.rubin@gmail.com> | 2016-06-19 21:42:15 -0400 |
---|---|---|
committer | Cory Fields <cory-nospam-@coryfields.com> | 2016-09-08 13:06:05 -0400 |
commit | e700cd0bc885340563df9e6b7a5b6c6603b8c984 (patch) | |
tree | b8891fceb520ab61ffd67a2b5c9fa5c5bf892a4f /src/net.h | |
parent | d1a2295f0d58423652b124b48fc887a9721b765c (diff) |
Convert ForEachNode* functions to take a templated function argument rather than a std::function to eliminate std::function overhead
Diffstat (limited to 'src/net.h')
-rw-r--r-- | src/net.h | 90 |
1 files changed, 82 insertions, 8 deletions
@@ -129,14 +129,88 @@ public: bool CheckIncomingNonce(uint64_t nonce); bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func); - bool ForEachNodeContinueIf(std::function<bool(CNode* pnode)> func); - bool ForEachNodeContinueIf(std::function<bool(const CNode* pnode)> func) const; - bool ForEachNodeContinueIfThen(std::function<bool(CNode* pnode)> pre, std::function<void()> post); - bool ForEachNodeContinueIfThen(std::function<bool(const CNode* pnode)> pre, std::function<void()> post) const; - void ForEachNode(std::function<void(CNode* pnode)> func); - void ForEachNode(std::function<void(const CNode* pnode)> func) const; - void ForEachNodeThen(std::function<void(CNode* pnode)> pre, std::function<void()> post); - void ForEachNodeThen(std::function<void(const CNode* pnode)> pre, std::function<void()> post) const; + + template<typename Callable> + bool ForEachNodeContinueIf(Callable&& func) + { + LOCK(cs_vNodes); + for (auto&& node : vNodes) + if(!func(node)) + return false; + return true; + }; + + template<typename Callable> + bool ForEachNodeContinueIf(Callable&& func) const + { + LOCK(cs_vNodes); + for (const auto& node : vNodes) + if(!func(node)) + return false; + return true; + }; + + template<typename Callable, typename CallableAfter> + bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post) + { + bool ret = true; + LOCK(cs_vNodes); + for (auto&& node : vNodes) + if(!pre(node)) { + ret = false; + break; + } + post(); + return ret; + }; + + template<typename Callable, typename CallableAfter> + bool ForEachNodeContinueIfThen(Callable&& pre, CallableAfter&& post) const + { + bool ret = true; + LOCK(cs_vNodes); + for (const auto& node : vNodes) + if(!pre(node)) { + ret = false; + break; + } + post(); + return ret; + }; + + template<typename Callable> + void ForEachNode(Callable&& func) + { + LOCK(cs_vNodes); + for (auto&& node : vNodes) + func(node); + }; + + template<typename Callable> + void ForEachNode(Callable&& func) const + { + LOCK(cs_vNodes); + for (const auto& node : vNodes) + func(node); + }; + + template<typename Callable, typename CallableAfter> + void ForEachNodeThen(Callable&& pre, CallableAfter&& post) + { + LOCK(cs_vNodes); + for (auto&& node : vNodes) + pre(node); + post(); + }; + + template<typename Callable, typename CallableAfter> + void ForEachNodeThen(Callable&& pre, CallableAfter&& post) const + { + LOCK(cs_vNodes); + for (const auto& node : vNodes) + pre(node); + post(); + }; void RelayTransaction(const CTransaction& tx); |