|
|
@@ -10,27 +10,29 @@
|
|
|
#include <iterator/facade.h>
|
|
|
|
|
|
namespace stream::ranges {
|
|
|
-template <typename T, typename Bound> struct iota_view {
|
|
|
+template <typename T, typename Bound>
|
|
|
+class iota_iterator : public facade<iota_iterator<T, Bound>> {
|
|
|
public:
|
|
|
- constexpr static inline bool has_size_v = std::is_constructible_v<T, Bound>;
|
|
|
+ using sentinal_type = Bound;
|
|
|
|
|
|
- class iterator : facade<iterator> {
|
|
|
- public:
|
|
|
- using sentinal_type = Bound;
|
|
|
+ iota_iterator() = default;
|
|
|
+ iota_iterator(T value, Bound bound) : value_(value), bound_(bound) {}
|
|
|
|
|
|
- iterator(T value, Bound bound) : value_(value), bound_(bound) {}
|
|
|
+ T const & dereference() const { return value_; }
|
|
|
+ void increment() { ++value_; }
|
|
|
+ bool at_end() const { return value_ == bound_; }
|
|
|
+ std::ptrdiff_t distance_to(iota_iterator const & other) const {
|
|
|
+ return other.value_ - value_;
|
|
|
+ }
|
|
|
|
|
|
- T const & dereference() const { return value_; }
|
|
|
- void increment() const { ++value_; }
|
|
|
- bool at_end() const { return value_ == bound_; }
|
|
|
- std::ptrdiff_t distance_to(iterator const & other) const {
|
|
|
- return other.value_ - value_;
|
|
|
- }
|
|
|
+private:
|
|
|
+ T value_;
|
|
|
+ Bound bound_;
|
|
|
+};
|
|
|
|
|
|
- private:
|
|
|
- T value_;
|
|
|
- Bound bound_;
|
|
|
- };
|
|
|
+template <typename T, typename Bound> struct iota_view {
|
|
|
+public:
|
|
|
+ constexpr static inline bool has_size_v = std::is_constructible_v<T, Bound>;
|
|
|
|
|
|
private:
|
|
|
T value_;
|
|
|
@@ -39,10 +41,10 @@ private:
|
|
|
public:
|
|
|
iota_view(T value, Bound bound) : value_(value), bound_(bound) {}
|
|
|
|
|
|
- auto begin() const { return iterator(value_, bound_); }
|
|
|
+ auto begin() const { return iota_iterator(value_, bound_); }
|
|
|
auto end() const {
|
|
|
if constexpr (has_size_v) {
|
|
|
- return iterator(bound_, bound_);
|
|
|
+ return iota_iterator(bound_, bound_);
|
|
|
} else {
|
|
|
return bound_;
|
|
|
}
|
|
|
@@ -60,3 +62,5 @@ template <typename T, typename Bound> auto iota(T value, Bound bound) {
|
|
|
return iota_view(value, bound);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+MAKE_ITERATOR_FACADE_TYPEDEFS_T(stream::ranges::iota_iterator);
|