From 50a8562d20979a8f0702d149b09c6c5814692c8e Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 5 Aug 2015 02:09:44 +0100 Subject: [PATCH] ensure correct ctor overload resolution on char/pointer range for two pointers vs pointer plus size when passed int (or similar) --- ostd/range.hh | 12 +++++++++++- ostd/string.hh | 8 +++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ostd/range.hh b/ostd/range.hh index 13c620f..652a91e 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -815,8 +815,18 @@ NumberRange range(T v) { template struct PointerRange: InputRange, ContiguousRangeTag, T> { +private: + struct Nat {}; + +public: PointerRange(): p_beg(nullptr), p_end(nullptr) {} - PointerRange(T *beg, T *end): p_beg(beg), p_end(end) {} + + template + PointerRange(T *beg, U end, EnableIf< + (IsPointer::value || IsNullPointer::value) && + IsConvertible::value, Nat + > = Nat()): p_beg(beg), p_end(end) {} + PointerRange(T *beg, Size n): p_beg(beg), p_end(beg + n) {} template + CharRangeBase(T *beg, U end, EnableIf< + (IsPointer::value || IsNullPointer::value) && + IsConvertible::value, Nat + > = Nat()): p_beg(beg), p_end(end) {} + CharRangeBase(T *beg, Size n): p_beg(beg), p_end(beg + n) {} /* TODO: traits for utf-16/utf-32 string lengths, for now assume char */