From 38c8f0efd8f033be8fb8278aa5d0eb704dedee55 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 1 Jul 2015 17:47:54 +0200 Subject: Improve reverse_iterate implementation If the passed range is an rvalue, then move it into our private copy. Otherwise, with nested ranges, there is no guarantee the thing will still be alive once we get to iterating over it. --- butl/utility | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/butl/utility b/butl/utility index b1fa8f6..6efa4d0 100644 --- a/butl/utility +++ b/butl/utility @@ -5,6 +5,7 @@ #ifndef BUTL_UTILITY #define BUTL_UTILITY +#include // forward() #include // strcmp namespace butl @@ -32,22 +33,18 @@ namespace butl template class reverse_range { - T& x_; + T x_; public: - reverse_range (T& x): x_ (x) {} + reverse_range (T&& x): x_ (std::forward (x)) {} - auto begin () -> decltype (this->x_.rbegin ()) {return x_.rbegin ();} - auto end () -> decltype (this->x_.rend ()) {return x_.rend ();} + auto begin () const -> decltype (this->x_.rbegin ()) {return x_.rbegin ();} + auto end () const -> decltype (this->x_.rend ()) {return x_.rend ();} }; template inline reverse_range - reverse_iterate (T& x) {return reverse_range (x);} - - template - inline reverse_range - reverse_iterate (const T& x) {return reverse_range (x);} + reverse_iterate (T&& x) {return reverse_range (std::forward (x));} } #endif // BUTL_UTILITY -- cgit v1.1