Browse Source

cmAlgorithms: Make cmRange advance/retreat safe for rvalues

In rvalue context these functions have to return cmRange
by copy instead of reference to temporary object

It allows to use ranged-for over cmMakeRange(xxx).advance(yyy)
Artur Ryt 6 years ago
parent
commit
15bdbec017
1 changed files with 15 additions and 3 deletions
  1. 15 3
      Source/cmAlgorithms.h

+ 15 - 3
Source/cmAlgorithms.h

@@ -172,18 +172,30 @@ struct cmRange
   const_iterator end() const { return End; }
   bool empty() const { return std::distance(Begin, End) == 0; }
   difference_type size() const { return std::distance(Begin, End); }
-  cmRange& advance(KWIML_INT_intptr_t amount)
+
+  cmRange& advance(KWIML_INT_intptr_t amount) &
   {
-    std::advance(Begin, amount);
+    std::advance(this->Begin, amount);
     return *this;
   }
+  cmRange advance(KWIML_INT_intptr_t amount) &&
+  {
+    std::advance(this->Begin, amount);
+    return std::move(*this);
+  }
 
-  cmRange& retreat(KWIML_INT_intptr_t amount)
+  cmRange& retreat(KWIML_INT_intptr_t amount) &
   {
     std::advance(End, -amount);
     return *this;
   }
 
+  cmRange retreat(KWIML_INT_intptr_t amount) &&
+  {
+    std::advance(End, -amount);
+    return std::move(*this);
+  }
+
 private:
   const_iterator Begin;
   const_iterator End;