From 94fc7017cd8d423f94a4d1d8d26ca5de302ffce1 Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 1 Jul 2015 22:02:43 +0100 Subject: [PATCH] fix vector from-range ctors + cleanup --- octa/range.hh | 14 ++++++++------ octa/stream.hh | 7 +------ octa/vector.hh | 18 +++++++----------- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/octa/range.hh b/octa/range.hh index 5b88ebe..a6874f4 100644 --- a/octa/range.hh +++ b/octa/range.hh @@ -460,15 +460,16 @@ template - Size get_n(OR orange, Size n) { + template::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 *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, FiniteRandomAccessRangeTag, T> return ret; } - template - octa::Size get_n(R orange, octa::Size n) { + template::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 *p, octa::Size n) { return get_n(PointerRange(p, n), n); } diff --git a/octa/stream.hh b/octa/stream.hh index 0ef7e94..6242e7a 100644 --- a/octa/stream.hh +++ b/octa/stream.hh @@ -214,12 +214,7 @@ struct StreamRange: InputRange< return p_stream->put(p, n); } - template - 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 *p, octa::Size n) { return p_stream->get(p, n); } diff --git a/octa/vector.hh b/octa/vector.hh index 56145c3..327a616 100644 --- a/octa/vector.hh +++ b/octa/vector.hh @@ -38,25 +38,21 @@ class Vector { template void ctor_from_range(R &range, octa::EnableIf< - octa::IsFiniteRandomAccessRange::value, bool + octa::IsFiniteRandomAccessRange::value && + octa::IsPod::value && + octa::IsSame>>::value, bool > = true) { octa::RangeSize l = range.size(); reserve(l); p_len = l; - if (octa::IsPod() && octa::IsSame>()) { - 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 void ctor_from_range(R &range, EnableIf< - !octa::IsFiniteRandomAccessRange::value, bool + !octa::IsFiniteRandomAccessRange::value || + !octa::IsPod::value || + !octa::IsSame>>::value, bool > = true) { octa::Size i = 0; for (; !range.empty(); range.pop_front()) {