forked from OctaForge/libostd
range fixes
This commit is contained in:
parent
9de9d99d4d
commit
a31ddba522
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
Loading…
Reference in a new issue