fix vector from-range ctors + cleanup

master
Daniel Kolesa 2015-07-01 22:02:43 +01:00
parent e31c227567
commit 94fc7017cd
3 changed files with 16 additions and 23 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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()) {