1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <valarray>
10
11// template<class T> class valarray;
12
13// [valarray.syn]/3
14// Any function returning a valarray<T> is permitted to return an object of
15// another type, provided all the const member functions of valarray<T> are
16// also applicable to this type.
17//
18// Libc++ uses this and returns __val_expr<_Expr> for several operations.
19//
20// The const overloads of
21// valarray::operator[](...) const
22// return propxy objects. These proxies are implicitly convertible to
23// std::valarray.
24//
25// valarray& operator^=(const valarray& v);
26
27#include <valarray>
28#include <cassert>
29#include <cstddef>
30
31#include "test_macros.h"
32
33template <class A>
34void test(const A& rhs) {
35 int input[] = {1, 2, 3, 4, 5};
36 int expected[] = {7, 5, 11, 13, 15};
37 const unsigned N = sizeof(input) / sizeof(input[0]);
38 std::valarray<int> value(input, N);
39
40 value ^= rhs;
41
42 assert(value.size() == N);
43 for (std::size_t i = 0; i < value.size(); ++i)
44 assert(value[i] == expected[i]);
45}
46
47int main(int, char**) {
48 int input[] = {6, 7, 8, 9, 10};
49 const unsigned N = sizeof(input) / sizeof(input[0]);
50
51 std::valarray<bool> mask(true, N);
52 std::size_t indices[] = {0, 1, 2, 3, 4};
53 std::valarray<std::size_t> indirect(indices, N);
54
55 std::valarray<int> zero(0, N);
56
57 {
58 std::valarray<int> value(input, N);
59
60 test(rhs: value);
61 test(rhs: value[std::slice(0, N, 1)]);
62 test(rhs: value[std::gslice(0, std::valarray<std::size_t>(N, 1), std::valarray<std::size_t>(1, 1))]);
63 test(rhs: value[mask]);
64 test(rhs: value[indirect]);
65 test(rhs: value + zero);
66 }
67
68 {
69 const std::valarray<int> value(input, N);
70
71 test(rhs: value);
72 test(rhs: value[std::slice(0, N, 1)]);
73 test(rhs: value[std::gslice(0, std::valarray<std::size_t>(N, 1), std::valarray<std::size_t>(1, 1))]);
74 test(rhs: value[mask]);
75 test(rhs: value[indirect]);
76 test(rhs: value + zero);
77 }
78
79 return 0;
80}
81

source code of libcxx/test/std/numerics/numarray/template.valarray/valarray.cassign/xor_valarray.pass.cpp