more reliable output range check + add a way to omit the ocunt on get_n
This commit is contained in:
parent
94fc7017cd
commit
98decde76a
|
@ -177,7 +177,8 @@ template<typename T, bool = (octa::IsConvertible<
|
|||
RangeCategory<T>, OutputRangeTag
|
||||
>::value || (IsInputRange<T>::value &&
|
||||
(octa::detail::OutputRangeTest<T, const RangeValue<T> &>::value ||
|
||||
octa::detail::OutputRangeTest<T, RangeValue<T> &&>::value)
|
||||
octa::detail::OutputRangeTest<T, RangeValue<T> &&>::value ||
|
||||
octa::detail::OutputRangeTest<T, RangeValue<T> >::value)
|
||||
))> struct IsOutputRange: False {};
|
||||
|
||||
template<typename T>
|
||||
|
@ -462,14 +463,14 @@ template<typename B, typename C, typename V, typename R = V &,
|
|||
|
||||
template<typename OR,
|
||||
typename = octa::EnableIf<octa::IsOutputRange<OR>::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<Value> *p, Size n) {
|
||||
Size get_n(octa::RemoveCv<Value> *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<PointerRange<T>, FiniteRandomAccessRangeTag, T>
|
|||
|
||||
template<typename R,
|
||||
typename = octa::EnableIf<octa::IsOutputRange<R>::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<T> *p, octa::Size n) {
|
||||
return get_n(PointerRange(p, n), n);
|
||||
octa::Size get_n(octa::RemoveCv<T> *p, octa::Size n = -1) {
|
||||
octa::Size c = size();
|
||||
if (n < c) c = n;
|
||||
return get_n(PointerRange(p, c), c);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -214,7 +214,10 @@ struct StreamRange<T, true>: InputRange<
|
|||
return p_stream->put(p, n);
|
||||
}
|
||||
|
||||
octa::Size get_n(octa::RemoveCv<T> *p, octa::Size n) {
|
||||
octa::Size get_n(octa::RemoveCv<T> *p, octa::Size n = -1) {
|
||||
if (n == octa::Size(-1)) {
|
||||
n = p_stream->size() / sizeof(T);
|
||||
}
|
||||
return p_stream->get(p, n);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue