From 300851ec1690e545485e154b1a4df55bec7621ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Thu, 13 Apr 2017 00:24:40 +0200 Subject: [PATCH] Introduce src/reverse_iterator.hpp and include it... ...where it will be needed Taken from https://gist.github.com/arvidsson/7231973 with small modifications to fit the bitcoin core project --- src/Makefile.am | 1 + src/checkpoints.cpp | 1 + src/net_processing.cpp | 1 + src/reverse_iterator.h | 39 ++++++++++++++++++++++++++++++++++++ src/test/prevector_tests.cpp | 1 + src/txmempool.cpp | 1 + src/validation.cpp | 1 + 7 files changed, 45 insertions(+) create mode 100644 src/reverse_iterator.h diff --git a/src/Makefile.am b/src/Makefile.am index 9b9dd89f6..a37c6a502 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -124,6 +124,7 @@ BITCOIN_CORE_H = \ pow.h \ protocol.h \ random.h \ + reverse_iterator.h \ reverselock.h \ rpc/blockchain.h \ rpc/client.h \ diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 13b587653..7afc6a00f 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -6,6 +6,7 @@ #include "chain.h" #include "chainparams.h" +#include "reverse_iterator.h" #include "validation.h" #include "uint256.h" diff --git a/src/net_processing.cpp b/src/net_processing.cpp index b9357440e..ce61a28da 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -22,6 +22,7 @@ #include "primitives/block.h" #include "primitives/transaction.h" #include "random.h" +#include "reverse_iterator.h" #include "tinyformat.h" #include "txmempool.h" #include "ui_interface.h" diff --git a/src/reverse_iterator.h b/src/reverse_iterator.h new file mode 100644 index 000000000..409f895ce --- /dev/null +++ b/src/reverse_iterator.h @@ -0,0 +1,39 @@ +// Taken from https://gist.github.com/arvidsson/7231973 + +#ifndef BITCOIN_REVERSE_ITERATOR_HPP +#define BITCOIN_REVERSE_ITERATOR_HPP + +/** + * Template used for reverse iteration in C++11 range-based for loops. + * + * std::vector v = {1, 2, 3, 4, 5}; + * for (auto x : reverse_iterate(v)) + * std::cout << x << " "; + */ + +template +class reverse_range +{ + T &x; + +public: + reverse_range(T &x) : x(x) {} + + auto begin() const -> decltype(this->x.rbegin()) + { + return x.rbegin(); + } + + auto end() const -> decltype(this->x.rend()) + { + return x.rend(); + } +}; + +template +reverse_range reverse_iterate(T &x) +{ + return reverse_range(x); +} + +#endif // BITCOIN_REVERSE_ITERATOR_HPP diff --git a/src/test/prevector_tests.cpp b/src/test/prevector_tests.cpp index 11bb11d1e..7182caab9 100644 --- a/src/test/prevector_tests.cpp +++ b/src/test/prevector_tests.cpp @@ -5,6 +5,7 @@ #include #include "prevector.h" +#include "reverse_iterator.h" #include "serialize.h" #include "streams.h" diff --git a/src/txmempool.cpp b/src/txmempool.cpp index afafc695f..02a549b12 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -11,6 +11,7 @@ #include "validation.h" #include "policy/policy.h" #include "policy/fees.h" +#include "reverse_iterator.h" #include "streams.h" #include "timedata.h" #include "util.h" diff --git a/src/validation.cpp b/src/validation.cpp index bef17337b..8108da4c5 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -23,6 +23,7 @@ #include "primitives/block.h" #include "primitives/transaction.h" #include "random.h" +#include "reverse_iterator.h" #include "script/script.h" #include "script/sigcache.h" #include "script/standard.h"