1*5ca2777cSMark de Wever //===----------------------------------------------------------------------===//
2*5ca2777cSMark de Wever //
3*5ca2777cSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5ca2777cSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5*5ca2777cSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5ca2777cSMark de Wever //
7*5ca2777cSMark de Wever //===----------------------------------------------------------------------===//
8*5ca2777cSMark de Wever
9*5ca2777cSMark de Wever // <valarray>
10*5ca2777cSMark de Wever
11*5ca2777cSMark de Wever // template<class T> class mask_array;
12*5ca2777cSMark de Wever
13*5ca2777cSMark de Wever // T __get(size_t i);
14*5ca2777cSMark de Wever
15*5ca2777cSMark de Wever #include <valarray>
16*5ca2777cSMark de Wever #include <cassert>
17*5ca2777cSMark de Wever
18*5ca2777cSMark de Wever #include "test_macros.h"
19*5ca2777cSMark de Wever
main(int,char **)20*5ca2777cSMark de Wever int main(int, char**) {
21*5ca2777cSMark de Wever unsigned input[] = {0, 1, 2, 3, 4};
22*5ca2777cSMark de Wever const unsigned N = sizeof(input) / sizeof(input[0]);
23*5ca2777cSMark de Wever
24*5ca2777cSMark de Wever std::valarray<unsigned> array(input, N);
25*5ca2777cSMark de Wever
26*5ca2777cSMark de Wever {
27*5ca2777cSMark de Wever std::mask_array<unsigned> result = array[std::valarray<bool>(true, N)];
28*5ca2777cSMark de Wever for (unsigned i = 0; i < N; ++i)
29*5ca2777cSMark de Wever assert(result.__get(i) == i);
30*5ca2777cSMark de Wever }
31*5ca2777cSMark de Wever
32*5ca2777cSMark de Wever {
33*5ca2777cSMark de Wever std::valarray<bool> mask(false, N);
34*5ca2777cSMark de Wever mask[1] = true;
35*5ca2777cSMark de Wever mask[3] = true;
36*5ca2777cSMark de Wever std::mask_array<unsigned> result = array[mask];
37*5ca2777cSMark de Wever assert(result.__get(0) == 1);
38*5ca2777cSMark de Wever assert(result.__get(1) == 3);
39*5ca2777cSMark de Wever }
40*5ca2777cSMark de Wever
41*5ca2777cSMark de Wever {
42*5ca2777cSMark de Wever std::valarray<bool> mask(false, N);
43*5ca2777cSMark de Wever mask[0] = true;
44*5ca2777cSMark de Wever mask[4] = true;
45*5ca2777cSMark de Wever std::mask_array<unsigned> result = array[mask];
46*5ca2777cSMark de Wever assert(result.__get(0) == 0);
47*5ca2777cSMark de Wever assert(result.__get(1) == 4);
48*5ca2777cSMark de Wever }
49*5ca2777cSMark de Wever
50*5ca2777cSMark de Wever return 0;
51*5ca2777cSMark de Wever }
52