forked from OSchip/llvm-project
[libc++] Fix result-type and value_type computation in <valarray>.
The `operator[]` of `_UnaryOp` and `_BinaryOp` returns the result of calling `__op_`, so its return type should be `__result_type`, not e.g. `_A0::value_type`. However, `_UnaryOp::value_type` also should never have been `_A0::value_type`; it needs to be the correct type for the result of the unary op, e.g. `bool` when the op is `logical_not`. This turns out to matter when multiple operators are nested, e.g. `+(v == v)` needs to have a `value_type` of `bool`, not `int`, even when `v` is of type `valarray<int>`. Differential Revision: https://reviews.llvm.org/D103416
This commit is contained in:
parent
dc1e7b73b8
commit
469d18c064
|
@ -413,7 +413,7 @@ template <class _Op, class _A0>
|
|||
struct _UnaryOp
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef typename _A0::value_type value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
_A0 __a0_;
|
||||
|
@ -432,7 +432,7 @@ template <class _Op, class _A0, class _A1>
|
|||
struct _BinaryOp
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef typename _A0::value_type value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
_A0 __a0_;
|
||||
|
@ -443,7 +443,7 @@ struct _BinaryOp
|
|||
: __op_(__op), __a0_(__a0), __a1_(__a1) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
__result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __a0_.size();}
|
||||
|
@ -1087,7 +1087,7 @@ template <class _Op, class _Tp>
|
|||
struct _UnaryOp<_Op, valarray<_Tp> >
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef _Tp value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
const valarray<_Tp>& __a0_;
|
||||
|
@ -1106,7 +1106,7 @@ template <class _Op, class _Tp, class _A1>
|
|||
struct _BinaryOp<_Op, valarray<_Tp>, _A1>
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef _Tp value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
const valarray<_Tp>& __a0_;
|
||||
|
@ -1117,7 +1117,7 @@ struct _BinaryOp<_Op, valarray<_Tp>, _A1>
|
|||
: __op_(__op), __a0_(__a0), __a1_(__a1) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
__result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __a0_.size();}
|
||||
|
@ -1127,7 +1127,7 @@ template <class _Op, class _A0, class _Tp>
|
|||
struct _BinaryOp<_Op, _A0, valarray<_Tp> >
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef _Tp value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
_A0 __a0_;
|
||||
|
@ -1138,7 +1138,7 @@ struct _BinaryOp<_Op, _A0, valarray<_Tp> >
|
|||
: __op_(__op), __a0_(__a0), __a1_(__a1) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
__result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __a0_.size();}
|
||||
|
@ -1148,7 +1148,7 @@ template <class _Op, class _Tp>
|
|||
struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
|
||||
{
|
||||
typedef typename _Op::__result_type __result_type;
|
||||
typedef _Tp value_type;
|
||||
typedef typename decay<__result_type>::type value_type;
|
||||
|
||||
_Op __op_;
|
||||
const valarray<_Tp>& __a0_;
|
||||
|
@ -1159,7 +1159,7 @@ struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
|
|||
: __op_(__op), __a0_(__a0), __a1_(__a1) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
__result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __a0_.size();}
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 3, 4, 0};
|
||||
T a2[] = {6, 7, 0, 9, 10};
|
||||
bool a3[] = {true, true, false, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 && v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 && v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,23 +26,31 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 && 5;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 && 5);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
{
|
||||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, false, false, false, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 && 0;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 && 0);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,23 +26,31 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 5 && v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(5 && v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
{
|
||||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, false, false, false, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 0 && v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(0 && v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 9, 10};
|
||||
bool a3[] = {false, false, true, false, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 == v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 == v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, true, false, false, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 == 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 == 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, true, false, false, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 == v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 == v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 2, 1};
|
||||
bool a3[] = {false, false, true, true, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 >= v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 >= v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, true, true, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 >= 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 >= 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, false, false, true};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 >= v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 >= v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 2, 1};
|
||||
bool a3[] = {false, false, false, true, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 > v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 > v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, false, true, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 > 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 > 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, false, false, false, true};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 > v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 > v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 2, 1};
|
||||
bool a3[] = {true, true, true, false, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 <= v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 <= v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, false, false, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 <= 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 <= 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, true, true, true, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 <= v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 <= v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 2, 1};
|
||||
bool a3[] = {true, true, false, false, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 < v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 < v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, false, false, false, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 < 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 < 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {false, false, true, true, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 < v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 < v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 10};
|
||||
T a2[] = {6, 7, 0, 9, 10};
|
||||
bool a3[] = {true, true, false, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 != v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 != v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, false, true, true, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 != 2;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 != 2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,12 +26,16 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, false, true, true, true};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 2 != v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(2 != v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -27,14 +27,17 @@ int main(int, char**)
|
|||
T a1[] = {1, 2, 0, 4, 0};
|
||||
T a2[] = {6, 7, 0, 9, 10};
|
||||
bool a3[] = {true, true, false, true, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = v1 || v2;
|
||||
assert(v1.size() == v2.size());
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 || v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,23 +26,31 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, true};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 || 5;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 || 5);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
{
|
||||
typedef int T;
|
||||
T a1[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, false};
|
||||
const unsigned N = sizeof(a1)/sizeof(a1[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v1(a1, N);
|
||||
std::valarray<bool> v3 = v1 || 0;
|
||||
assert(v1.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v1.size(); ++i)
|
||||
std::valarray<bool> v3a = +(v1 || 0);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -26,23 +26,31 @@ int main(int, char**)
|
|||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, true};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 5 || v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(5 || v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
{
|
||||
typedef int T;
|
||||
T a2[] = {1, 2, 3, 4, 0};
|
||||
bool a3[] = {true, true, true, true, false};
|
||||
const unsigned N = sizeof(a2)/sizeof(a2[0]);
|
||||
const unsigned N = 5;
|
||||
std::valarray<T> v2(a2, N);
|
||||
std::valarray<bool> v3 = 0 || v2;
|
||||
assert(v2.size() == v3.size());
|
||||
for (std::size_t i = 0; i < v3.size(); ++i)
|
||||
std::valarray<bool> v3a = +(0 || v2);
|
||||
assert(v3.size() == N);
|
||||
assert(v3a.size() == N);
|
||||
for (std::size_t i = 0; i < N; ++i) {
|
||||
assert(v3[i] == a3[i]);
|
||||
assert(v3a[i] == a3[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue