|
|
@@ -49,7 +49,7 @@ namespace stream {
|
|
|
|
|
|
template <typename C>
|
|
|
detail::stream_base<detail::source::reference<C>> make_stream(C && cont) {
|
|
|
- return std::make_shared<detail::source_stream<C>>(cont);
|
|
|
+ return std::make_shared<detail::source_stream<C>>(std::forward<C>(cont));
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
@@ -61,4 +61,22 @@ namespace stream {
|
|
|
detail::stream_base<typename It::reference> make_stream(It begin, It end) {
|
|
|
return std::make_shared<detail::range_stream<It>>(begin, end);
|
|
|
}
|
|
|
+
|
|
|
+ template <typename T>
|
|
|
+ detail::stream_base<T&> make_range_stream(T start, T const & end) {
|
|
|
+ std::vector<T> vec;
|
|
|
+ vec.reserve(end - start);
|
|
|
+ while (end < start) { vec.emplace_back(start++); }
|
|
|
+ return make_stream(std::move(vec));
|
|
|
+ }
|
|
|
+
|
|
|
+ template <typename T>
|
|
|
+ detail::stream_base<T&> make_range_stream(T start, T const & end, T const & increment) {
|
|
|
+ int elems{(end - start)/increment};
|
|
|
+ if (elems < 0 || end == start) { return {}; }
|
|
|
+ std::vector<T> vec{start};
|
|
|
+ vec.reserve(elems+1);
|
|
|
+ while (elems-- > 0) { vec.emplace_back(start += increment); }
|
|
|
+ return make_stream(std::move(vec));
|
|
|
+ }
|
|
|
}
|