put EnableIf in template type params where possible

This commit is contained in:
q66 2015-06-29 21:56:13 +01:00
parent 2f16288671
commit d8d8ea7151
6 changed files with 47 additions and 69 deletions

View file

@ -700,10 +700,9 @@ struct Function<R(Args...)>: octa::detail::FunctionBase<R, Args...> {
f.p_stor.manager->call_copyf(p_stor, f.p_stor);
}
template<typename T>
Function(T f, EnableIf<
octa::detail::IsValidFunctor<T, R(Args...)>::value, bool
> = true) {
template<typename T, typename = octa::EnableIf<
octa::detail::IsValidFunctor<T, R(Args...)>::value
>> Function(T f) {
if (func_is_null(f)) {
init_empty();
return;
@ -747,10 +746,9 @@ struct Function<R(Args...)>: octa::detail::FunctionBase<R, Args...> {
initialize(f, AA(a));
}
template<typename A, typename T>
Function(octa::AllocatorArg, const A &a, T f, EnableIf<
octa::detail::IsValidFunctor<T, R(Args...)>::value, bool
> = true) {
template<typename A, typename T, typename = octa::EnableIf<
octa::detail::IsValidFunctor<T, R(Args...)>::value
>> Function(octa::AllocatorArg, const A &a, T f) {
if (func_is_null(f)) {
init_empty();
return;

View file

@ -88,14 +88,11 @@ namespace detail {
MapImpl(MapImpl &&m): Base(octa::move(m)) {}
MapImpl(MapImpl &&m, const A &alloc): Base(octa::move(m), alloc) {}
template<typename R>
MapImpl(R range, octa::Size size = 0, const H &hf = H(),
const C &eqf = C(), const A &alloc = A(),
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
bool
> = true
octa::IsConvertible<RangeReference<R>, Value>::value
>> MapImpl(R range, octa::Size size = 0, const H &hf = H(),
const C &eqf = C(), const A &alloc = A()
): Base(size ? size : octa::detail::estimate_hrsize(range),
hf, eqf, alloc) {
for (; !range.empty(); range.pop_front())
@ -132,12 +129,10 @@ namespace detail {
return *this;
}
template<typename R>
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
MapImpl &
> operator=(R range) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> MapImpl &operator=(R range) {
Base::assign_range(range);
return *this;
}

View file

@ -250,9 +250,9 @@ public:
RangeHalf(const T &range): p_range(range) {}
template<typename U> RangeHalf(const RangeHalf<U> &half,
octa::EnableIf<octa::IsConvertible<U, T>::value, bool> = true
): p_range(half.p_range) {}
template<typename U, typename = octa::EnableIf<
octa::IsConvertible<U, T>::value
>> RangeHalf(const RangeHalf<U> &half): p_range(half.p_range) {}
RangeHalf(RangeHalf &&half): p_range(octa::move(half.p_range)) {}
@ -749,10 +749,10 @@ struct PointerRange: InputRange<PointerRange<T>, FiniteRandomAccessRangeTag, T>
PointerRange(T *beg, T *end): p_beg(beg), p_end(end) {}
PointerRange(T *beg, octa::Size n): p_beg(beg), p_end(beg + n) {}
template<typename U>
PointerRange(const PointerRange<U> &v, octa::EnableIf<
octa::IsConvertible<U *, T *>::value, bool
> = true): p_beg(&v[0]), p_end(&v[v.size()]) {}
template<typename U, typename = octa::EnableIf<
octa::IsConvertible<U *, T *>::value
>> PointerRange(const PointerRange<U> &v):
p_beg(&v[0]), p_end(&v[v.size()]) {}
PointerRange &operator=(const PointerRange &v) {
p_beg = v.p_beg;

View file

@ -74,14 +74,11 @@ namespace detail {
SetImpl(SetImpl &&m): Base(octa::move(m)) {}
SetImpl(SetImpl &&m, const A &alloc): Base(octa::move(m), alloc) {}
template<typename R>
SetImpl(R range, octa::Size size = 0, const H &hf = H(),
const C &eqf = C(), const A &alloc = A(),
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
bool
> = true
octa::IsConvertible<RangeReference<R>, Value>::value
>> SetImpl(R range, octa::Size size = 0, const H &hf = H(),
const C &eqf = C(), const A &alloc = A()
): Base(size ? size : octa::detail::estimate_hrsize(range),
hf, eqf, alloc) {
for (; !range.empty(); range.pop_front())
@ -118,12 +115,10 @@ namespace detail {
return *this;
}
template<typename R>
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
SetImpl &
> operator=(R range) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> SetImpl &operator=(R range) {
Base::assign_range(range);
return *this;
}

View file

@ -30,10 +30,10 @@ struct StringRangeBase: InputRange<
StringRangeBase(const StringBase<T> &s): p_beg(s.data()),
p_end(s.data() + s.size()) {}
template<typename U>
StringRangeBase(const StringRangeBase<U> &v, octa::EnableIf<
octa::IsConvertible<U *, T *>::value, bool
> = true): p_beg(&v[0]), p_end(&v[v.size()]) {}
template<typename U, typename = octa::EnableIf<
octa::IsConvertible<U *, T *>::value
>> StringRangeBase(const StringRangeBase<U> &v):
p_beg(&v[0]), p_end(&v[v.size()]) {}
StringRangeBase &operator=(const StringRangeBase &v) {
p_beg = v.p_beg; p_end = v.p_end; return *this;
@ -177,13 +177,10 @@ public:
StringBase(const Value *v, Size n, const A &a = A()):
p_buf(ConstRange(v, n), a) {}
template<typename R> StringBase(R range, const A &a = A(),
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
bool
> = true
): p_buf(range, a) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> StringBase(R range, const A &a = A()): p_buf(range, a) {
terminate();
}
@ -201,12 +198,10 @@ public:
p_buf = ConstRange(v, strlen(v) + 1);
return *this;
}
template<typename R>
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
StringBase &
> operator=(const R &r) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> StringBase &operator=(const R &r) {
p_buf = r;
terminate();
return *this;

View file

@ -161,13 +161,10 @@ public:
Vector(InitializerList<T> v, const A &a = A()):
Vector(v.begin(), v.size(), a) {}
template<typename R> Vector(R range, const A &a = A(),
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
bool
> = true
): Vector(a) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> Vector(R range, const A &a = A()): Vector(a) {
ctor_from_range(range);
}
@ -231,12 +228,10 @@ public:
return *this;
}
template<typename R>
octa::EnableIf<
template<typename R, typename = octa::EnableIf<
octa::IsInputRange<R>::value &&
octa::IsConvertible<RangeReference<R>, Value>::value,
Vector &
> operator=(R range) {
octa::IsConvertible<RangeReference<R>, Value>::value
>> Vector &operator=(R range) {
clear();
ctor_from_range(range);
return *this;