diff --git a/octa/algorithm.h b/octa/algorithm.h index 1e3a04c..1b8be20 100644 --- a/octa/algorithm.h +++ b/octa/algorithm.h @@ -191,21 +191,21 @@ namespace octa { template inline T min(InitializerList il) { - return min_element(il.range()).first(); + return min_element(il.each()).first(); } template inline T min(InitializerList il, C compare) { - return min_element(il.range(), compare).first(); + return min_element(il.each(), compare).first(); } template inline T max(InitializerList il) { - return max_element(il.range()).first(); + return max_element(il.each()).first(); } template inline T max(InitializerList il, C compare) { - return max_element(il.range(), compare).first(); + return max_element(il.each(), compare).first(); } /* clamp */ @@ -407,7 +407,7 @@ namespace octa { return *this; } MapRange &operator=(MapRange &&v) { - p_range = mpve(v.p_range); + p_range = move(v.p_range); p_func = move(v.p_func); return *this; } @@ -450,6 +450,72 @@ namespace octa { MapRange map(R range, F func) { return MapRange(range, func); } + + template + struct FilterRange: InputRange< + FilterRange, ForwardRangeTag, RangeValue, RangeReference, + RangeSize + > { + private: + T p_range; + Function)> p_pred; + + void advance_valid() { + while (!p_range.empty() && !p_pred(first())) p_range.pop_first(); + } + + public: + FilterRange(): p_range(), p_pred() {} + + template + FilterRange(const T &range, const P &pred): p_range(range), + p_pred(pred) { + advance_valid(); + } + FilterRange(const FilterRange &it): p_range(it.p_range), + p_pred(it.p_pred) { + advance_valid(); + } + FilterRange(FilterRange &&it): p_range(move(it.p_range)), + p_pred(move(it.p_pred)) { + advance_valid(); + } + + FilterRange &operator=(const FilterRange &v) { + p_range = v.p_range; + p_pred = v.p_pred; + advance_valid(); + return *this; + } + FilterRange &operator=(FilterRange &&v) { + p_range = move(v.p_range); + p_pred = move(v.p_pred); + advance_valid(); + return *this; + } + + bool empty() const { return p_range.empty(); } + + void pop_first() { + p_range.pop_first(); + advance_valid(); + } + + RangeReference first() const { return p_range.first(); } + RangeReference first() { return p_range.first(); } + + bool operator==(const FilterRange &v) const { + return (p_range == v.p_range) && (p_pred == v.p_pred); + } + bool operator!=(const FilterRange &v) const { + return (p_range != v.p_range) || (p_pred != v.p_pred); + } + }; + + template + FilterRange filter(R range, P pred) { + return FilterRange(range, pred); + } } #endif \ No newline at end of file diff --git a/octa/initializer_list.h b/octa/initializer_list.h index cd559c8..83a8e10 100644 --- a/octa/initializer_list.h +++ b/octa/initializer_list.h @@ -33,7 +33,7 @@ namespace std { const T *get() const { return p_buf; } - octa::PointerRange range() { + octa::PointerRange each() { return octa::PointerRange(p_buf, p_len); } }; diff --git a/octa/vector.h b/octa/vector.h index 54ae1a3..5874cd6 100644 --- a/octa/vector.h +++ b/octa/vector.h @@ -295,7 +295,7 @@ namespace octa { } T *insert(size_t idx, InitializerList il) { - return insert_range(idx, il.range()); + return insert_range(idx, il.each()); } RangeType each() {