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 // <complex> 10 11 // template<class T> 12 // complex<T> 13 // proj(const complex<T>& x); 14 15 #include <complex> 16 #include <cassert> 17 18 #include "../cases.h" 19 20 template <class T> 21 void 22 test(const std::complex<T>& z, std::complex<T> x) 23 { 24 assert(proj(z) == x); 25 } 26 27 template <class T> 28 void 29 test() 30 { 31 test(std::complex<T>(1, 2), std::complex<T>(1, 2)); 32 test(std::complex<T>(-1, 2), std::complex<T>(-1, 2)); 33 test(std::complex<T>(1, -2), std::complex<T>(1, -2)); 34 test(std::complex<T>(-1, -2), std::complex<T>(-1, -2)); 35 } 36 37 void test_edges() 38 { 39 const unsigned N = sizeof(testcases) / sizeof(testcases[0]); 40 for (unsigned i = 0; i < N; ++i) 41 { 42 std::complex<double> r = proj(testcases[i]); 43 switch (classify(testcases[i])) 44 { 45 case zero: 46 case non_zero: 47 assert(r == testcases[i]); 48 assert(std::signbit(real(r)) == std::signbit(real(testcases[i]))); 49 assert(std::signbit(imag(r)) == std::signbit(imag(testcases[i]))); 50 break; 51 case inf: 52 assert(std::isinf(real(r)) && real(r) > 0); 53 assert(imag(r) == 0); 54 assert(std::signbit(imag(r)) == std::signbit(imag(testcases[i]))); 55 break; 56 case NaN: 57 case non_zero_nan: 58 assert(classify(r) == classify(testcases[i])); 59 break; 60 } 61 } 62 } 63 64 int main(int, char**) 65 { 66 test<float>(); 67 test<double>(); 68 test<long double>(); 69 test_edges(); 70 71 return 0; 72 } 73