//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // template class valarray; // valarray& operator%=(const valarray& v); // [valarray.syn]/3 // Any function returning a valarray is permitted to return an object of // another type, provided all the const member functions of valarray are // also applicable to this type. // // Libc++ uses this and returns __val_expr<_Expr> for several operations. // // The const overloads of // valarray::operator[](...) const // return propxy objects. These proxies are implicitly convertible to // std::valarray. // // Validate the function works for valarray, the proxies, and __val_expr. #include #include #include #include "test_macros.h" template void test(const A& rhs) { int input[] = {6, 7, 8, 9, 10}; int expected[] = {0, 1, 2, 1, 0}; const unsigned N = sizeof(input) / sizeof(input[0]); std::valarray value(input, N); value %= rhs; assert(value.size() == N); for (std::size_t i = 0; i < value.size(); ++i) assert(value[i] == expected[i]); } int main(int, char**) { int input[] = {1, 2, 3, 4, 5}; const unsigned N = sizeof(input) / sizeof(input[0]); std::valarray mask(true, N); std::size_t indices[] = {0, 1, 2, 3, 4}; std::valarray indirect(indices, N); std::valarray zero(0, N); { std::valarray value(input, N); test(value); test(value[std::slice(0, N, 1)]); test(value[std::gslice(0, std::valarray(N, 1), std::valarray(1, 1))]); test(value[mask]); test(value[indirect]); test(value + zero); } { const std::valarray value(input, N); test(value); test(value[std::slice(0, N, 1)]); test(value[std::gslice(0, std::valarray(N, 1), std::valarray(1, 1))]); test(value[mask]); test(value[indirect]); test(value + zero); } return 0; }