range fixes

master
Daniel Kolesa 2016-03-23 22:11:15 +00:00
parent 9de9d99d4d
commit a31ddba522
2 changed files with 17 additions and 5 deletions

View File

@ -477,12 +477,13 @@ template<typename B, typename C, typename V, typename R = V &,
return (on - n);
}
template<typename OR, typename = EnableIf<IsOutputRange<OR>>>
Size copy(OR &&orange, Size n = -1) {
template<typename OR>
EnableIf<IsOutputRange<OR>, Size> copy(OR &&orange, Size n = -1) {
B r(*((B *)this));
Size on = n;
for (; n && !r.empty(); --n) {
orange.put(r.front());
if (!orange.put(r.front()))
break;
r.pop_front();
}
return (on - n);
@ -984,8 +985,8 @@ public:
return ret;
}
template<typename R, typename = EnableIf<IsOutputRange<R>>>
Size copy(R &&orange, Size n = -1) {
template<typename R>
EnableIf<IsOutputRange<R>, Size> copy(R &&orange, Size n = -1) {
Size c = size();
if (n < c) c = n;
return orange.put_n(p_beg, c);
@ -994,6 +995,10 @@ public:
Size copy(RemoveCv<T> *p, Size n = -1) {
Size c = size();
if (n < c) c = n;
if (IsPod<T>) {
memcpy(p_beg, data(), c * sizeof(T));
return c;
}
return copy(PointerRange(p, c), c);
}

View File

@ -145,6 +145,13 @@ public:
return true;
}
Size put_n(const T *p, Size n) {
Size an = ostd::min(n, size());
memcpy(p_beg, p, an * sizeof(T));
p_beg += an;
return an;
}
T *data() { return p_beg; }
const T *data() const { return p_beg; }