|  | @@ -138,6 +138,22 @@ private:
 | 
	
		
			
				|  |  |    const_iterator End;
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +template<typename BiDirIt>
 | 
	
		
			
				|  |  | +BiDirIt Rotate(BiDirIt first, BiDirIt middle, BiDirIt last)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  typename std::iterator_traits<BiDirIt>::difference_type dist =
 | 
	
		
			
				|  |  | +      std::distance(first, middle);
 | 
	
		
			
				|  |  | +  std::rotate(first, middle, last);
 | 
	
		
			
				|  |  | +  std::advance(last, -dist);
 | 
	
		
			
				|  |  | +  return last;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +template<typename Iter>
 | 
	
		
			
				|  |  | +Iter RemoveN(Iter i1, Iter i2, size_t n)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  return ContainerAlgorithms::Rotate(i1, i1 + n, i2);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  template<typename Iter1, typename Iter2>
 | 
	
	
		
			
				|  | @@ -188,4 +204,26 @@ std::string cmJoin(Range const& r, std::string delimiter)
 | 
	
		
			
				|  |  |    return cmJoin(r, delimiter.c_str());
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +template<typename Range>
 | 
	
		
			
				|  |  | +typename Range::const_iterator cmRemoveN(Range& r, size_t n)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  return ContainerAlgorithms::RemoveN(r.begin(), r.end(), n);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +template<typename Range, typename InputRange>
 | 
	
		
			
				|  |  | +typename Range::const_iterator cmRemoveIndices(Range& r, InputRange const& rem)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  typename InputRange::const_iterator remIt = rem.begin();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  typename Range::iterator writer = r.begin() + *remIt;
 | 
	
		
			
				|  |  | +  ++remIt;
 | 
	
		
			
				|  |  | +  size_t count = 1;
 | 
	
		
			
				|  |  | +  for ( ; writer != r.end() && remIt != rem.end(); ++count, ++remIt)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    writer = ContainerAlgorithms::RemoveN(writer, r.begin() + *remIt, count);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  writer = ContainerAlgorithms::RemoveN(writer, r.end(), count);
 | 
	
		
			
				|  |  | +  return writer;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #endif
 |