explicit overloads of operator= on string for ptr/array because c++ type system blows

This commit is contained in:
q66 2015-08-01 04:19:37 +01:00
parent bc2bd9ca3b
commit 49af758238

View file

@ -348,6 +348,7 @@ public:
} else p_buf.first() = &p_len; } else p_buf.first() = &p_len;
return *this; return *this;
} }
StringBase &operator=(StringBase &&v) { StringBase &operator=(StringBase &&v) {
clear(); clear();
if (p_cap) allocator_deallocate(p_buf.second(), p_buf.first(), p_cap); if (p_cap) allocator_deallocate(p_buf.second(), p_buf.first(), p_cap);
@ -360,6 +361,7 @@ public:
if (!p_cap) p_buf.first() = (Pointer)&p_len; if (!p_cap) p_buf.first() = (Pointer)&p_len;
return *this; return *this;
} }
StringBase &operator=(ConstRange v) { StringBase &operator=(ConstRange v) {
reserve(v.size()); reserve(v.size());
if (v.size()) memcpy(p_buf.first(), &v[0], v.size()); if (v.size()) memcpy(p_buf.first(), &v[0], v.size());
@ -367,6 +369,22 @@ public:
p_len = v.size(); p_len = v.size();
return *this; return *this;
} }
template<typename U>
EnableIf<
IsConvertible<U, const Value *>::value && !IsArray<U>::value,
StringBase &
> operator=(U v) {
return operator=(ConstRange(v));
}
template<typename U, Size N>
EnableIf<
IsConvertible<U *, const Value *>::value, StringBase &
> operator=(U (&v)[N]) {
return operator=(ConstRange(v));
}
template<typename R, typename = EnableIf< template<typename R, typename = EnableIf<
IsInputRange<R>::value && IsInputRange<R>::value &&
IsConvertible<RangeReference<R>, Value>::value IsConvertible<RangeReference<R>, Value>::value