xref: /llvm-project/libcxx/test/std/numerics/complex.number/complex.tuple/tuple_size.compile.pass.cpp (revision 2ea5d167ae43bed5a511d5d819ae7c52cc76ec5c)
1*2ea5d167SHristo Hristov //===----------------------------------------------------------------------===//
2*2ea5d167SHristo Hristov //
3*2ea5d167SHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2ea5d167SHristo Hristov // See https://llvm.org/LICENSE.txt for license information.
5*2ea5d167SHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*2ea5d167SHristo Hristov //
7*2ea5d167SHristo Hristov //===----------------------------------------------------------------------===//
8*2ea5d167SHristo Hristov 
9*2ea5d167SHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10*2ea5d167SHristo Hristov 
11*2ea5d167SHristo Hristov // <complex>
12*2ea5d167SHristo Hristov 
13*2ea5d167SHristo Hristov //   template<class T> struct tuple_size;
14*2ea5d167SHristo Hristov 
15*2ea5d167SHristo Hristov #include <cassert>
16*2ea5d167SHristo Hristov #include <complex>
17*2ea5d167SHristo Hristov #include <concepts>
18*2ea5d167SHristo Hristov 
19*2ea5d167SHristo Hristov template <typename C>
20*2ea5d167SHristo Hristov concept HasTupleSize = requires { std::tuple_size<C>{}; };
21*2ea5d167SHristo Hristov 
22*2ea5d167SHristo Hristov struct SomeObject {};
23*2ea5d167SHristo Hristov 
24*2ea5d167SHristo Hristov static_assert(!HasTupleSize<SomeObject>);
25*2ea5d167SHristo Hristov 
26*2ea5d167SHristo Hristov template <typename T>
test()27*2ea5d167SHristo Hristov void test() {
28*2ea5d167SHristo Hristov   using C = std::complex<T>;
29*2ea5d167SHristo Hristov 
30*2ea5d167SHristo Hristov   static_assert(HasTupleSize<C>);
31*2ea5d167SHristo Hristov   static_assert(std::same_as<typename std::tuple_size<C>::value_type, size_t>);
32*2ea5d167SHristo Hristov   static_assert(std::tuple_size<C>() == 2);
33*2ea5d167SHristo Hristov }
34*2ea5d167SHristo Hristov 
test()35*2ea5d167SHristo Hristov void test() {
36*2ea5d167SHristo Hristov   test<float>();
37*2ea5d167SHristo Hristov   test<double>();
38*2ea5d167SHristo Hristov   test<long double>();
39*2ea5d167SHristo Hristov }
40