forked from OctaForge/libostd
fix vector from-range ctors + cleanup
parent
e31c227567
commit
94fc7017cd
|
@ -460,15 +460,16 @@ template<typename B, typename C, typename V, typename R = V &,
|
|||
return (on - n);
|
||||
}
|
||||
|
||||
template<typename OR>
|
||||
Size get_n(OR orange, Size n) {
|
||||
template<typename OR,
|
||||
typename = octa::EnableIf<octa::IsOutputRange<OR>::value
|
||||
>> Size get_n(OR orange, Size n) {
|
||||
B &r = *((B *)this);
|
||||
Size on = n;
|
||||
for (; n && !r.empty() && orange.put(r.front()); --n);
|
||||
return (on - n);
|
||||
}
|
||||
|
||||
Size get_n(Value *p, Size n) {
|
||||
Size get_n(octa::RemoveCv<Value> *p, Size n) {
|
||||
B &r = *((B *)this);
|
||||
Size on = n;
|
||||
for (; n && !r.empty(); --n) *p++ = r.front();
|
||||
|
@ -900,14 +901,15 @@ struct PointerRange: InputRange<PointerRange<T>, FiniteRandomAccessRangeTag, T>
|
|||
return ret;
|
||||
}
|
||||
|
||||
template<typename R>
|
||||
octa::Size get_n(R orange, octa::Size n) {
|
||||
template<typename R,
|
||||
typename = octa::EnableIf<octa::IsOutputRange<R>::value
|
||||
>> octa::Size get_n(R orange, octa::Size n) {
|
||||
octa::Size c = size();
|
||||
if (n < c) c = n;
|
||||
return orange.put_n(p_beg, c);
|
||||
}
|
||||
|
||||
octa::Size get_n(T *p, octa::Size n) {
|
||||
octa::Size get_n(octa::RemoveCv<T> *p, octa::Size n) {
|
||||
return get_n(PointerRange(p, n), n);
|
||||
}
|
||||
|
||||
|
|
|
@ -214,12 +214,7 @@ struct StreamRange<T, true>: InputRange<
|
|||
return p_stream->put(p, n);
|
||||
}
|
||||
|
||||
template<typename R>
|
||||
octa::Size get_n(R orange, octa::Size n) {
|
||||
return orange.put_n()
|
||||
}
|
||||
|
||||
octa::Size get_n(T *p, octa::Size n) {
|
||||
octa::Size get_n(octa::RemoveCv<T> *p, octa::Size n) {
|
||||
return p_stream->get(p, n);
|
||||
}
|
||||
|
||||
|
|
|
@ -38,25 +38,21 @@ class Vector {
|
|||
|
||||
template<typename R>
|
||||
void ctor_from_range(R &range, octa::EnableIf<
|
||||
octa::IsFiniteRandomAccessRange<R>::value, bool
|
||||
octa::IsFiniteRandomAccessRange<R>::value &&
|
||||
octa::IsPod<T>::value &&
|
||||
octa::IsSame<T, octa::RemoveCv<octa::RangeValue<R>>>::value, bool
|
||||
> = true) {
|
||||
octa::RangeSize<R> l = range.size();
|
||||
reserve(l);
|
||||
p_len = l;
|
||||
if (octa::IsPod<T>() && octa::IsSame<T, octa::RangeValue<R>>()) {
|
||||
memcpy(p_buf.first(), &range.front(), range.size());
|
||||
return;
|
||||
}
|
||||
for (octa::Size i = 0; !range.empty(); range.pop_front()) {
|
||||
octa::allocator_construct(p_buf.second(),
|
||||
&p_buf.first()[i], range.front());
|
||||
++i;
|
||||
}
|
||||
range.get_n(p_buf.first(), l);
|
||||
}
|
||||
|
||||
template<typename R>
|
||||
void ctor_from_range(R &range, EnableIf<
|
||||
!octa::IsFiniteRandomAccessRange<R>::value, bool
|
||||
!octa::IsFiniteRandomAccessRange<R>::value ||
|
||||
!octa::IsPod<T>::value ||
|
||||
!octa::IsSame<T, octa::RemoveCv<octa::RangeValue<R>>>::value, bool
|
||||
> = true) {
|
||||
octa::Size i = 0;
|
||||
for (; !range.empty(); range.pop_front()) {
|
||||
|
|
Loading…
Reference in New Issue