xref: /llvm-project/libcxx/test/std/numerics/numarray/template.valarray/valarray.cons/deduct.pass.cpp (revision fb855eb941b6d740cc6560297d0b4d3201dcaf9f)
1f9f97caeSKonstantin Varlamov //===----------------------------------------------------------------------===//
2f9f97caeSKonstantin Varlamov //
3f9f97caeSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f9f97caeSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5f9f97caeSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f9f97caeSKonstantin Varlamov //
7f9f97caeSKonstantin Varlamov //===----------------------------------------------------------------------===//
8f9f97caeSKonstantin Varlamov 
9f9f97caeSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14
10f9f97caeSKonstantin Varlamov 
11f9f97caeSKonstantin Varlamov // <valarray>
12f9f97caeSKonstantin Varlamov 
13f9f97caeSKonstantin Varlamov // template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
14f9f97caeSKonstantin Varlamov 
15f9f97caeSKonstantin Varlamov #include <valarray>
16f9f97caeSKonstantin Varlamov 
17f9f97caeSKonstantin Varlamov #include "test_macros.h"
18f9f97caeSKonstantin Varlamov 
main(int,char **)19f9f97caeSKonstantin Varlamov int main(int, char**)
20f9f97caeSKonstantin Varlamov {
21f9f97caeSKonstantin Varlamov     {
22f9f97caeSKonstantin Varlamov         // From (initializer_list<T>)
23f9f97caeSKonstantin Varlamov         std::valarray v = {1, 2, 3, 4, 5};
24f9f97caeSKonstantin Varlamov         ASSERT_SAME_TYPE(decltype(v), std::valarray<int>);
25f9f97caeSKonstantin Varlamov     }
26f9f97caeSKonstantin Varlamov 
27f9f97caeSKonstantin Varlamov     {
28f9f97caeSKonstantin Varlamov         // From (const T(&)[N], size_t)
29f9f97caeSKonstantin Varlamov         long a[] = {1, 2, 3, 4, 5};
30f9f97caeSKonstantin Varlamov         std::valarray v(a, 5);
31f9f97caeSKonstantin Varlamov         ASSERT_SAME_TYPE(decltype(v), std::valarray<long>);
32f9f97caeSKonstantin Varlamov     }
33f9f97caeSKonstantin Varlamov 
34f9f97caeSKonstantin Varlamov     {
35f9f97caeSKonstantin Varlamov         // From (const T&, size_t)
36f9f97caeSKonstantin Varlamov         long a[] = {1, 2, 3, 4, 5};
37f9f97caeSKonstantin Varlamov         std::valarray v(&a[0], 5);
38f9f97caeSKonstantin Varlamov         // Surprising but true.
39f9f97caeSKonstantin Varlamov         ASSERT_SAME_TYPE(decltype(v), std::valarray<long*>);
40f9f97caeSKonstantin Varlamov     }
41f9f97caeSKonstantin Varlamov 
42f9f97caeSKonstantin Varlamov     {
43f9f97caeSKonstantin Varlamov         // From (slice_array<T>)
44f9f97caeSKonstantin Varlamov         std::valarray<long> v{1,2,3,4,5};
45f9f97caeSKonstantin Varlamov         std::valarray v2 = v[std::slice(2,3,1)];
46f9f97caeSKonstantin Varlamov         static_assert(std::is_same_v<decltype(v2), std::valarray<long>>);
47f9f97caeSKonstantin Varlamov     }
48f9f97caeSKonstantin Varlamov 
49f9f97caeSKonstantin Varlamov     {
50f9f97caeSKonstantin Varlamov         // From (gslice_array<T>)
51f9f97caeSKonstantin Varlamov         std::valarray<long> v{1,2,3,4,5};
52f9f97caeSKonstantin Varlamov         std::valarray v2 = v[std::gslice(0, {5}, {1})];
53f9f97caeSKonstantin Varlamov         static_assert(std::is_same_v<decltype(v2), std::valarray<long>>);
54f9f97caeSKonstantin Varlamov     }
55f9f97caeSKonstantin Varlamov 
56f9f97caeSKonstantin Varlamov     {
57f9f97caeSKonstantin Varlamov         // From (mask_array<T>)
58f9f97caeSKonstantin Varlamov         std::valarray<long> v = {1, 2, 3, 4, 5};
59f9f97caeSKonstantin Varlamov         std::valarray<bool> m = {true, false, true, false, true};
60f9f97caeSKonstantin Varlamov         std::valarray v2 = v[m];
61f9f97caeSKonstantin Varlamov         static_assert(std::is_same_v<decltype(v2), std::valarray<long>>);
62f9f97caeSKonstantin Varlamov     }
63f9f97caeSKonstantin Varlamov 
64f9f97caeSKonstantin Varlamov     {
65f9f97caeSKonstantin Varlamov         // From (indirect_array<T>)
66f9f97caeSKonstantin Varlamov         std::valarray<long> v = {1, 2, 3, 4, 5};
67*fb855eb9SMark de Wever         std::valarray<std::size_t> i = {1, 2, 3};
68f9f97caeSKonstantin Varlamov         std::valarray v2 = v[i];
69f9f97caeSKonstantin Varlamov         static_assert(std::is_same_v<decltype(v2), std::valarray<long>>);
70f9f97caeSKonstantin Varlamov     }
71f9f97caeSKonstantin Varlamov 
72f9f97caeSKonstantin Varlamov   return 0;
73f9f97caeSKonstantin Varlamov }
74