diff --git a/ostd/range.hh b/ostd/range.hh index af262ab..f14e8c5 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -738,6 +738,70 @@ inline range_size_t range_put_n( return (on - n); } +template +struct noop_output_range: output_range> { + using value_type = T; + using reference = T &; + using size_type = size_t; + using difference_type = ptrdiff_t; + + bool put(T const &) { return true; } +}; + +template +struct counting_output_range: output_range> { + using value_type = range_value_t; + using reference = range_reference_t; + using size_type = range_size_t; + using difference_type = range_difference_t; + + template + friend range_size_t> range_put_n( + counting_output_range &range, + range_value_t> *p, + range_size_t> n + ); + +private: + R p_range; + size_type p_written = 0; + +public: + counting_output_range() = delete; + counting_output_range(R const &range): p_range(range) {} + + bool put(value_type const &v) { + bool ret = p_range.put(v); + p_written += ret; + return ret; + } + bool put(value_type &&v) { + bool ret = p_range.put(std::move(v)); + p_written += ret; + return ret; + } + + size_type get_written() const { + return p_written; + } +}; + +template +inline range_size_t> range_put_n( + counting_output_range &range, + range_value_t> *p, + range_size_t> n +) { + auto ret = range_put_n(range.p_range, p, n); + range.p_written += ret; + return ret; +} + +template +inline counting_output_range range_counter(R const &range) { + return counting_output_range{range}; +} + inline auto reverse() { return [](auto &&obj) { return obj.reverse(); }; } @@ -1544,6 +1608,16 @@ private: T p_data; }; +template +inline appender_range appender() { + return appender_range(); +} + +template +inline appender_range appender(T &&v) { + return appender_range(std::forward(v)); +} + namespace detail { template struct iterator_range_tag_base {