diff --git a/octa/range.hh b/octa/range.hh index a6874f4..fa8cbda 100644 --- a/octa/range.hh +++ b/octa/range.hh @@ -177,7 +177,8 @@ template, OutputRangeTag >::value || (IsInputRange::value && (octa::detail::OutputRangeTest &>::value || - octa::detail::OutputRangeTest &&>::value) + octa::detail::OutputRangeTest &&>::value || + octa::detail::OutputRangeTest >::value) ))> struct IsOutputRange: False {}; template @@ -462,14 +463,14 @@ template::value - >> Size get_n(OR orange, Size n) { + >> Size get_n(OR orange, Size n = -1) { B &r = *((B *)this); Size on = n; for (; n && !r.empty() && orange.put(r.front()); --n); return (on - n); } - Size get_n(octa::RemoveCv *p, Size n) { + Size get_n(octa::RemoveCv *p, Size n = -1) { B &r = *((B *)this); Size on = n; for (; n && !r.empty(); --n) *p++ = r.front(); @@ -903,14 +904,16 @@ struct PointerRange: InputRange, FiniteRandomAccessRangeTag, T> template::value - >> octa::Size get_n(R orange, octa::Size n) { + >> octa::Size get_n(R orange, octa::Size n = -1) { octa::Size c = size(); if (n < c) c = n; return orange.put_n(p_beg, c); } - octa::Size get_n(octa::RemoveCv *p, octa::Size n) { - return get_n(PointerRange(p, n), n); + octa::Size get_n(octa::RemoveCv *p, octa::Size n = -1) { + octa::Size c = size(); + if (n < c) c = n; + return get_n(PointerRange(p, c), c); } private: diff --git a/octa/stream.hh b/octa/stream.hh index 6242e7a..945ed58 100644 --- a/octa/stream.hh +++ b/octa/stream.hh @@ -214,7 +214,10 @@ struct StreamRange: InputRange< return p_stream->put(p, n); } - octa::Size get_n(octa::RemoveCv *p, octa::Size n) { + octa::Size get_n(octa::RemoveCv *p, octa::Size n = -1) { + if (n == octa::Size(-1)) { + n = p_stream->size() / sizeof(T); + } return p_stream->get(p, n); }